我在我的项目中使用了一段代码,如下所述
http://lexandera.com/2009/01/extracting-html-from-a-webview/
我创建.apk文件,将其安装在我的设备上,它正常工作。如果我尝试使用proguard混淆项目失败,则无法访问MyJavaScriptInterface的方法showHTML(String html)。
关于那个
的我的proguard配置-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 Interface problem。
解决。
正如Eric建议的那样,我改变了Proguard配置文件:
-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
答案 0 :(得分:32)
如果MyJavaScriptInterface是MyClass的内部类,ProGuard需要一个完全限定的名称com.mypackage.MyClass$MyJavaScriptInterface
。 $
的命名约定用于ProGuard运行的已编译类文件中。请注意,ProGuard在配置中提到了在输入jar中找不到的类名,表明这些名称可能拼写错误。
答案 1 :(得分:4)
-keepclassmembers class com.mypackage.MyClass$JavaScriptInterface {
public *;
}
仅使用此功能。它对我有用。
答案 2 :(得分:2)
那些懒散地提供整个包裹路径的人。
-keepclassmembers class **.*$PaymentJavaScriptInterface{
public *;
}
答案 3 :(得分:1)
如有问题的编辑所示, 出于这些建议, 仅使用
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface {
public *;
}
重要 -
对于API 17+保留@JavascriptInterface注释:
-keepattributes JavascriptInterface
(这阻止了我的应用程序在Marshmallow上工作)