我的android项目中有一个自定义Webview,如下所示:
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
}
public class JsObject {
@JavascriptInterface
public void show() {
//...
}
@JavascriptInterface
public void hide() {
//....
}
}
包含JavascriptInterface
,我用它来从JavaScript端向Android端进行通信。
在AndroidManifest中我有以下
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
在项目中,我使用了proguard,声明:
-keepattributes JavascriptInterface
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
一切都运转良好。
然而,当我将AndroidManifest更改为android:targetSdkVersion=18
或19
并在18及以上的设备上进行测试时,proguard似乎在某种程度上混淆了无法再访问的JavaScript方法。
如果我回到16或少于17的东西,一切正常。此外,这只发生在proguard上。如果我不使用proguard,即使使用android:targetSdkVersion=18
或19,一切正常。任何人都可以在清单Android&gt;中进行定位时帮助其正常工作17?
答案 0 :(得分:19)
我从这个主题中复制了我的答案:https://stackoverflow.com/a/19994873/1735499
而且,如果您使用Proguard,请记住添加此
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
-keepattributes JavascriptInterface
-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface {
<methods>;
}
如果仍然不行,请添加此
-keepattributes *Annotation*
注意:您的MyJavaScriptInterface必须是Public class
参考号:Android Proguard Javascript Interface Fail
BR,
谢
答案 1 :(得分:6)
这4行通常就足够了 - 不需要公开接口。
-keepattributes JavascriptInterface
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
答案 2 :(得分:1)
就我而言,只是:
-keepclassmembers class com.mypackage.MyJavaScriptInterface {
public *;
}
-keepattributes *Annotation*
就够了!