JavaScript 接口找不到函数

JavaScript Interface Cannot Find Function

我有一个只有一个功能的 JavaScriptInterface class。该函数用 @JavascriptInterface 注释,我相信我已经正确设置了它。

public class JavaScriptInterface {

    ...

    @JavascriptInterface
    public void processBody(String uri, String body) {
        Log.d(TAG, "Process body");
        ...
    }
}

然后我在 WebView 上设置 JavaScriptEnabled 并尝试调用函数:

final WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "java");

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        Log.d(TAG, "Page finished");
        callJavaScript();
    }
});

页面完成加载,然后我尝试了多种方法从我的 JavaScriptInterface 调用 JavaScript 函数。使用这两种方法之一:

view.evaluateJavascript(javascript);

view.loadUrl("javascript:" + javascript);

其中一个 javascript 字符串:

"(function() { window.java.processBody('" + url + "', document.body.innerHTML); })()"

"(function() { processBody('" + url + "', document.body.innerHTML); })()"

"window.java.processBody('" + url + "', document.body.innerHTML);"

"processBody('" + url + "', document.body.innerHTML);"

每次我收到错误信息:

I/chromium: [INFO:CONSOLE(1)] "Uncaught TypeError: processBody is not a function", source: (1)

虽然在旧设备(KitKat 之前)上错误消息从未出现,但该函数从未被调用。

此方法之前也一直有效,我相信我没有为此更改任何代码 activity。我今天早上才知道这个错误。

正如我们与 Bryan 一起发现的那样,问题是由于 ProGuard 剥离了未从 Java 调用的函数。一个快速简单的测试是在Java中添加一些调用JS接口函数的代码,看看是否有帮助。

有关如何配置 ProGuard 以不去除注入的 Java 对象的方法的信息,请参阅 How to configure proguard for javascript interface?