Android Proguard Javascript界面​​失败

我在我的项目中使用了这里描述的一段代码

http://lexandera.com/2009/01/extracting-html-from-a-webview/

我创build.apk文件,将其安装在我的设备上并正确工作。 如果我尝试使用proguard进行混淆,则项目失败,但未达到MyJavaScriptInterface的showHTML(String html)方法。

我的proguardconfiguration

-keep public class com.mypackage.MyClass.MyJavaScriptInterface -keep public class * implements com.mypackage.MyClass.MyJavaScriptInterface -keepclassmembers class * implements com.mypackage.MyClass.MyJavaScriptInterface { <methods>; } 

根据这个答案Android proguard Javascript接口的问题 。

解决了。

正如埃里克build议,我改变了Proguardconfiguration文件,像这样:

 -keep public class com.mypackage.MyClass$MyJavaScriptInterface -keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface -keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { <methods>; } 

现在我的项目完美地工作。

对于API 17+,您还需要保留@JavascriptInterface注释:

 -keepattributes JavascriptInterface 

http://developer.android.com/reference/android/webkit/JavascriptInterface.html

如果MyJavaScriptInterface是MyClass的内部类,则ProGuard需要一个完全限定的名称com.mypackage.MyClass$MyJavaScriptInterface 。 使用$的命名约定用于ProGuard所运行的已编译的类文件中。 请注意,ProGuard在configuration中提到无法在inputjar中find的类名,表明这些名称可能拼写错误。

  -keepclassmembers class com.mypackage.MyClass$JavaScriptInterface { public *; } 

只使用这个。 这个对我有用。

那些懒散地提供整个包path的人。

 -keepclassmembers class **.*$PaymentJavaScriptInterface{ public *; } 

正如编辑提出的那样,在这些build议中,只有使用

-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { public *; }

重要

对于API 17+保留@JavascriptInterface注释:

-keepattributes JavascriptInterface

(这是停止我的应用程序在棉花糖上工作)

Interesting Posts