在Android Manifest 17以上的SDK中定位SDK时,Proguard混乱Javascript接口功能

时间:2014-01-21 13:53:41

标签: javascript android webview proguard

我的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=1819并在18及以上的设备上进行测试时,proguard似乎在某种程度上混淆了无法再访问的JavaScript方法。

如果我回到16或少于17的东西,一切正常。此外,这只发生在proguard上。如果我不使用proguard,即使使用android:targetSdkVersion=18或19,一切正常。任何人都可以在清单Android&gt;中进行定位时帮助其正常工作17?

3 个答案:

答案 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*

就够了!