2

自带有proguard的android 4.2以来,我遇到了一个问题。

基本上我在这样的 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 进行这项工作?

4

3 回答 3

9

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

-keepattributes JavascriptInterface
于 2012-11-30T16:27:48.433 回答
3

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

-keepattributes *Annotation*

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

于 2012-12-01T22:51:16.293 回答
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 中的内部类。针对您的应用进行相应调整。)

于 2013-12-30T00:03:33.610 回答