【问题标题】:Android Proguard Javascript Interface FailAndroid Proguard Javascript接口失败
【发布时间】:2011-09-10 10:03:01
【问题描述】:

我在我的项目中使用了这里描述的一段代码

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

【问题讨论】:

标签: java android proguard obfuscation


【解决方案1】:

如果 MyJavaScriptInterface 是 MyClass 的内部类,ProGuard 需要一个完全限定名称 com.mypackage.MyClass$MyJavaScriptInterface$ 的命名约定用于 ProGuard 运行的编译类文件。请注意,ProGuard 在配置中提到了在输入 jar 中找不到的类名,这表明这些名称可能拼写错误。

【讨论】:

  • 您好 Eric,我尝试根据您的建议修改 Proguard 配置,但问题仍然存在。 Proguard 生成的文件可以帮助我理解问题吗?
  • 处理后的代码中是否存在 MyJavaScriptInterface 类?方法 showHTML 存在吗?您可以使用 javap(在 java 类文件上)或 dexdump(在 Android dex 文件上)进行检查。 Sourceforge 的 ProGuard 文档包含一个广泛的 Android 示例以及其他示例。
  • 嗨,埃里克,我解决了这个问题。我在 Proguard 配置文件中出错。我写道:-keepclassmembers class * implements com.mypackage.MyClass$MyJavaScriptInterface { ; } 而不是 -keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { ; } 感谢您的支持。
【解决方案2】:
    -keepclassmembers class com.mypackage.MyClass$JavaScriptInterface {    
public *;
     }

只使用这个。它对我有用。

【讨论】:

  • 那些懒得输入整个包的人。 \n -keepclassmembers 类 **.*$JavaScriptInterface{ public *; }
【解决方案3】:

那些懒得提供整个包路径的人。

-keepclassmembers class **.*$PaymentJavaScriptInterface{
public *;
}

【讨论】:

    【解决方案4】:

    正如相关编辑所建议的那样, 从这些建议中, 只使用

    -keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { public *; }

    重要 -

    对于 API 17+,保留 @JavascriptInterface 注释:

    -keepattributes JavascriptInterface

    (这阻止了我的应用程序在 Marshmallow 上运行)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多