gzsll/WebViewJavascriptBridge

4.4以下混淆出错

Closed this issue · 7 comments

Hello,虎扑JR,我在使用 https://github.com/jesse01/WebViewJavascriptBridge
抱歉不是你的项目,但我发现你们两个项目差不多,所以前来咨询一下。

如果不进行混淆,是运行没有问题,但我一混淆,4.4以上的系统没问题,4.4以下的就无法调用

主要代码
`
public void executeJavascript(final String script, final JavascriptCallback callback)
{

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        webView.evaluateJavascript(script, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                if (callback != null) {
                    if (value != null && value.startsWith("\"")
                            && value.endsWith("\"")) {
                        value = value.substring(1, value.length() - 1)
                                .replaceAll("\\\\", "");
                    }
                    callback.onReceiveValue(value);
                }
            }
        });
    } else {
        if (callback != null) {
            myInterface.addCallback(++uniqueId + "", callback);
            mHandler.post(new Runnable() {

                @Override
                public void run() {
                 if(webView!=null){
                     webView.loadUrl("javascript:window." + kInterface
                                + ".onResultForScript(" + uniqueId + "," + script + ")");
                 }  
                }
            });
        } else {
            mHandler.post(new Runnable() {

                @Override
                public void run() {
                    if (webView == null)
                        return;
                    webView.loadUrl("javascript:" + script);
                }
            });

        }
    }
}

`
我在proguard中添加了
-keep class xxx.xxx.xxx.WVJBWebViewClient{;}
-keep class xxx.xxx.xxx.WebViewActivity{
;}

WVJBWebViewClient 的子类是直接写在 WebViewActivity 中的

但混淆出来还是不行,希望你有时间能关注一下

gzsll commented

-keepclassmembers class xxx.xxx.WebViewActivity$onResultForScript {
public *;
}
应该是这样

@gzsll 感谢提醒,可能是我keep规则写的不对?加了没效果,在seeds中也找不到 MyJavascriptInterface .

最后我索性直接把 MyJavascriptInterface 和 WVJBMessage 择出来,放到bean目录下,以防被混淆,it works!

@gzsll One more question,如果我想keep com.xxx.a.java 文件(也就是文件下的所有内容以及文件名),该怎么写呢?

gzsll commented

-keepclassmembers class * {
@android.webkit.JavascriptInterface ;
}
-keepattributes Annotation
-keepattributes JavascriptInterface
上面的还要加上

@gzsll 其实这些我之前都加过了,不知道哪里出问题。顺便想学习一下,如果是随便的一个具体文件呢?该怎么keep?

gzsll commented

写错,应该是~
-keepclassmembers class xxx.xxx.WebViewActivity$MyJavascriptInterface {
public *;
}

@gzsll I have solved this.Anyway, have a good holiday