JavascriptInterface在Android 4.2上无法使用proguard

时间:2012-11-30 08:35:31

标签: android android-webview proguard

我有一个问题,因为android 4.2与proguard。

基本上我在webview上使用JavascriptInterface,如下所示:

public class MyJavascriptInterface {
    public void doSomething() { ... }
}

现在我所理解的是,当proguard对代码进行模糊处理时,它会重命名类名和方法名,因此无法再从Javascript中调用它。这就是我必须将它添加到proguard配置的原因:

-keepclassmembers class mypackage.MyJavascriptInterface { 
    public void doSomething();
}

当我将目标sdk设置为17(Android 4.2)时,出于安全原因,我必须将@JavascriptInterface注释添加到我的Javascript接口方法中:

@JavascriptInterface
public class MyJavascriptInterface {
    public void doSomething() { ... }
}

现在的问题是,如果启用了proguard,则此功能不再起作用(doSomething不会被调用,就像在混淆步骤中仍然重命名了类一样)。 如果我禁用proguard,代码工作正常。

如何使用目标sdk 17进行此操作?

3 个答案:

答案 0 :(得分:9)

我找到了解决方案,我只需要告诉proguard保留JavascriptInterface注释。我将此添加到我的proguard配置中以使其工作:

-keepattributes JavascriptInterface

答案 1 :(得分:3)

要保留任何注释,您必须将以下内容添加到ProGuard配置中:

-keepattributes *Annotation*

类文件将JavascriptInterface注释表示为类型为“RuntimeAnnotation”的类属性,其值为“android.webkit.JavascriptInterface”。

答案 2 :(得分:3)

通过查看生成的mapping.txt和dump.txt文件,以及大量的试错(我编译了34个APK文件来解决这个问题),我想出了这个有效的解决方案:

-keep public class com.yourfullpackagename.Yourapp$JavaScriptInterface
-keepclassmembers class com.yourfullpackagename.Yourapp$JavaScriptInterface {*;}
-keepattributes com.yourfullpackagename.Yourapp$JavaScriptInterface
-keepattributes *Annotation*

(这假设JavaScriptInterface是com.yourfullpackagename名称空间中名为Yourapp的Activity中的内部类。请相应地调整您的应用程序。)