WebView 使用 VALIDATION_ERROR_DESERIALIZATION_FAILED 使我的应用程序崩溃

WebView crashing my app with VALIDATION_ERROR_DESERIALIZATION_FAILED

我正在网络视图中加载一个小型 angular 网络应用程序。除了 webpacked 捆绑包之外,我没有应用程序的控制权或任何信息。
在 Web 应用程序的某个确切位置,我的整个 Android 应用程序崩溃并显示以下日志:

08-22 09:13:33.980 29145-29191/com.my.app E/chromium: [ERROR:validation_errors.cc(87)] Invalid message: VALIDATION_ERROR_DESERIALIZATION_FAILED
08-22 09:13:33.981 29145-29191/com.my.app E/chromium: [ERROR:render_process_host_impl.cc(4399)] Terminating render process for bad Mojo message: Received bad user message: Validation failed for SynchronousCompositorControlHost::ReturnFrame deserializer [VALIDATION_ERROR_DESERIALIZATION_FAILED]
    [ERROR:bad_message.cc(25)] Terminating renderer for bad IPC message, reason 123
08-22 10:05:25.284 18717-18717/mx.tide.fiuanalyticsapp E/chromium: [ERROR:aw_browser_terminator.cc(86)] Render process (18816) kill (OOM or update) wasn't handed by all associated webviews, killing application.

除了定义错误的 chromium 源代码外,我在网络上没有找到任何东西,我不知道如何调试这个问题,因为直接在移动设备上打开网络应用程序没有问题 Chrome 浏览器.
那么,你们中有人知道这个错误可能是什么吗?或者至少是我可以从哪里开始调试问题的线索?

我 运行 遇到了完全相同的问题。我能够发现 css 属性、will-change: transform 导致了问题,但我不确定为什么,因为这个 属性 正在同一个地方的其他地方使用文件,但不会导致错误。

我能够找到罪魁祸首,使用 charles 代理在网页响应上设置断点,并系统地从 html 中删除脚本和 links。最终我发现通过删除主 css link,应用程序不再崩溃。然后我不得不系统地从该 css 文件中删除行,直到我找到破坏 WebView 的行。

我还是没弄明白为什么这一行会打断它,但它是在 html 中的一个 jpeg 图像上设置的。看起来像是铬的问题。我仍在努力弄清楚为什么铬有问题。

不过感谢@P,我的问题已经解决了。 G. 的回答,我想添加解决问题的方法,而无需访问原始网络应用程序代码,这可能会对其他人有所帮助。

所以,我需要更换导致问题的 CSS,所以我下载了原始应用程序 CSS,修复了它,并将其上传到我自己的服务器。然后,在 android 应用程序中,我重写了网络视图的 shouldInterceptRequest 方法,每当应用程序尝试加载 CSS 时,我都会用我自己的方法替换它。
代码:

 mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request){

            String urls = request.getUrl().toString();

            //To prevent the WebView from crashing, we serve our own css modified version
            if( urls.equals("https://originalapphost.com/theircssfile.css")  ) {
                try {
                    URL url = new URL("https://myhost.com/mymodifiedcssfile.css");
                    URLConnection connection = url.openConnection();
                    return new WebResourceResponse(connection.getContentType(), connection.getHeaderField("encoding"), connection.getInputStream());
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

            return super.shouldInterceptRequest(view, request);
        }
    });

此外,我认为拥有一个使 android webview 崩溃的 css 列表真的很有帮助。我会从这里开始,如果您找到另一个,请随时在这里发表评论,我会更新这个答案。

  • will-change: transform;
  • filter:url(#blur);

我们也有类似的问题,经过大量分析后发现,这种情况发生在 CSS 文件中,与宽度有关。

我们之前有这个

.card,
.footer {
    margin: auto;
    max-width: 600px
}

并更改为此并在更改后工作。

@media (min-width:601px) {
    .card,
    .footer {
        margin: auto;
        max-width: 600px
    }
}

我通过禁用硬件加速解决了这个问题。

使用这个解决方案

        webView.webViewClient = object : WebViewClient() {
            override fun onRenderProcessGone(
                view: WebView?,
                detail: RenderProcessGoneDetail?
            ): Boolean {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                    if (detail?.didCrash() == false) {
                        webView.loadUrl(url)
                        return true
                    }
                return false
            }
        }