【问题标题】:WebView crashing my app with VALIDATION_ERROR_DESERIALIZATION_FAILEDWebView 使用 VALIDATION_ERROR_DESERIALIZATION_FAILED 使我的应用程序崩溃
【发布时间】:2019-01-28 23:22:17
【问题描述】:

我正在 web 视图中加载一个小的角度 webapp。除了 webpacked 包之外,我没有应用程序的控制权或任何信息。
在网络应用程序的某个确切位置,我的整个 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 浏览器上打开网络应用程序没有问题。 那么,你们中有人知道这个错误可能是什么吗?或者至少是我可以从哪里开始调试问题的线索?

【问题讨论】:

  • 嗨,马克,这看起来不像是崩溃的原因。一定有别的东西。您可以添加完整的堆栈跟踪吗?还要检查this 是否有助于找到错误。
  • 嗨 Anees,这是导致崩溃的原因,我在日志中添加了另一行。它以前不存在,因为出于测试原因,我正在处理 webview 上的 onRenderProcessGone 错误。
  • 从更新的问题看来,这是一个内存不足的问题。我怀疑您是否能够在不更改托管应用程序代码的情况下解决问题。

标签: android android-webview


【解决方案1】:

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

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

我仍然无法弄清楚为什么这条线会破坏它,但它是在 html 中的 jpeg 图像上设置的。看起来是铬的问题。我仍在试图弄清楚为什么铬有问题。

【讨论】:

  • 兄弟你救了我。我不得不在 7000 行 CSS 中找到问题,但我终于做到了。导致崩溃的行是filter:url(#blur);
  • 顺便说一句,为了调试,我发现激活WebView.setWebContentsDebuggingEnabled(true); 标志比代理更容易。然后您可以通过输入以下 URL 在连接到设备的计算机上的桌面 chrome 上进行调试:chrome://inspect
  • 为什么其他浏览器应用可以正常打开这个链接?
【解决方案2】:

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

因此,我需要替换导致问题的 CSS,因此我下载了原始应用程序 CSS,对其进行了修复,然后将其上传到我自己的服务器。然后,在 android 应用程序中,我覆盖了 Web 视图的 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);

【讨论】:

    【解决方案3】:

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

    我们以前有这个

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

    并改成这个并在更改后工作。

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

    【讨论】:

    • 您好,它违反了如此普遍的规则,这很奇怪。我认为这可能是您的代码停止破坏,因为在您的媒体查询后不再应用该规则。如果是这样的话,如果你在更大屏幕的设备上运行它会崩溃。
    【解决方案4】:

    使用这个解决方案

            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
                }
            }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 2013-08-20
        • 2021-08-28
        相关资源
        最近更新 更多