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

Posted

技术标签:

【中文标题】WebView 使用 VALIDATION_ERROR_DESERIALIZATION_FAILED 使我的应用程序崩溃【英文标题】:WebView crashing my app with 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 错误。 从更新的问题看来,这是一个内存不足的问题。我怀疑您是否能够在不更改托管应用程序代码的情况下解决问题。 【参考方案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】:

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

【讨论】:

以上是关于WebView 使用 VALIDATION_ERROR_DESERIALIZATION_FAILED 使我的应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

HarmonyOS之常用组件WebView的使用

如何使用crosswalk webview

[WebView学习之三]:使用WebView来创建Apps

安卓webview是啥东西

有没有办法使用 webview.goBack 和 navigation.goBack 在反应原生 webview 中使用相同的按钮?

使用GestureDetector后,单击或选择内部WebView无法正常工作