我有一个问题,因为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进行此操作?
答案 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中的内部类。请相应地调整您的应用程序。)