【问题标题】:JavascriptInterface not working with proguard on Android 4.2JavascriptInterface 不适用于 Android 4.2 上的 proguard
【发布时间】:2012-11-30 08:35:31
【问题描述】:

自 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 进行这项工作?

【问题讨论】:

标签: android android-webview proguard


【解决方案1】:

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

-keepattributes JavascriptInterface

【讨论】:

    【解决方案2】:

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

    -keepattributes *Annotation*
    

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

    【讨论】:

    【解决方案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 中的内部类。针对您的应用进行相应调整。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2014-07-12
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多