使用proguard进行模糊处理后,我的项目使用javascriptinterface
失败以下是关于proguard配置的一些建议的链接,但它在我的情况下不起作用
http://groups.google.com/group/android-developers/browse_thread/thread/f889e846fbf7ec3f?pli=1
因此来自Javascript的调用松散绑定到相关的Java方法
关于那个
的我的proguard配置-keep public class com.trans_code.android.JavascriptCallback
-keep public class * implements com.trans_code.android.JavascriptCallback
-keepclassmembers class * implements com.trans_code.android.JavascriptCallback {
<methods>;
}
-keepclassmembers class * implements JavascriptCallback {
void on*(***);
}
-keep public class com.trans_code.** {
public protected *;
}
-keepclasseswithmembernames class com.MyActivity$JavascriptInterface
-keepclasseswithmembernames class com.MyActivity$JavascriptInterface {
public protected *;
}
如果有人知道如何配置proguard让它过滤掉相关的方法和类,这对我有很大的帮助
答案 0 :(得分:8)
该原始线程中的类名特定于该用户Java类,而不是所有javascript接口的通用名称。您实现的javascript接口只是一个简单的基类。
您需要更改它们以匹配接口类的名称。
例如,基于原始线程的示例,对于示例代码WebViewDemo的正确配置将是:
-keep public class com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface
-keep public class * implements com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface
-keepclassmembers class * implements com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface {
<methods>;
}
由于绑定的工作方式,所有真正需要做的就是保持将从javascript中调用的内部方法使名称被混淆,但保持类名不被混淆不会受到伤害。
答案 1 :(得分:2)
在我的项目中,javascript界面是一个内部类。所以现在的答案对我来说并不适用。您需要在类之间使用$
。如果您的接口是内部类
-keep public class com.myapp.MyActivity$MyJavaScriptInterface
-keepclassmembers class com.myapp.MyActivity$MyJavaScriptInterface {
public *;
}
-keep public class * implements com.myapp.MyActivity$MyJavaScriptInterface
对于API17 +,添加以下行。否则您的代码将无法在Android 4.2 +
中运行-keepattributes JavascriptInterface
类似的问题:
Android Proguard Javascript Interface Fail
Javascript interface not working with android 4.2
答案 2 :(得分:2)
这对我来说已经足够了:
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
它具有使用您用作Javascript界面的任何类的附加好处。
工作原理:它会使用@JavascriptInterface
标记的所有方法保留原始名称。它不会自动保留类,但由于您必须在代码中实例化该类才能使用它,这不是问题。
关于trante关于在API 17+上保留注释本身的答案中的注释:我在KitKat上进行了测试并且它有效,所以它似乎也得到了解决。
答案 3 :(得分:1)
我解决了这个问题:
-keep public class com.myapp.JavaScriptInterface
-keepclassmembers class com.myapp.JavaScriptInterface {
<fields>;
<methods>;
}
JavaScriptInterface是我应用中的一个类(不是接口)。这就是为什么我没有使用这部分:
* implements
。