Android Proguard Javascript界面​​失败

时间:2011-06-07 20:51:22

标签: java android proguard obfuscation

我在我的项目中使用了一段代码,如下所述

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

4 个答案:

答案 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上工作)