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 使我的应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
[WebView学习之三]:使用WebView来创建Apps
有没有办法使用 webview.goBack 和 navigation.goBack 在反应原生 webview 中使用相同的按钮?