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

and*_*asv 6 javascript android proguard webview

我的android项目中有一个自定义Webview,如下所示:

public class MyWebView extends WebView {

    public MyWebView(Context context) {
        super(context);
    }

   public class JsObject {

        @JavascriptInterface
        public void show() {
            //...
        }

        @JavascriptInterface
        public void hide() {
            //....
        }
}
Run Code Online (Sandbox Code Playgroud)

其中包括JavascriptInterface我用来从JavaScript端到Android端的通信.

在AndroidManifest中,我有以下内容

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />
Run Code Online (Sandbox Code Playgroud)

在项目中,我使用了proguard,声明:

-keepattributes JavascriptInterface

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}
Run Code Online (Sandbox Code Playgroud)

一切都很好.

然而,当我将AndroidManifest更改为android:targetSdkVersion=1819测试18及以上的设备时,proguard似乎在某种程度上混淆了无法访问的JavaScript方法.

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

Fra*_*yen 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>; 
}
Run Code Online (Sandbox Code Playgroud)

如果仍然不行,请添加此项

-keepattributes *Annotation*
Run Code Online (Sandbox Code Playgroud)

注意:您的MyJavaScriptInterface必须是Public类

参考号:Android Proguard Javascript接口失败

BR,

坦率


Ale*_*e G 6

这4行通常就足够了 - 不需要公开接口.

-keepattributes JavascriptInterface
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}
Run Code Online (Sandbox Code Playgroud)