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
}
}
我正在网络视图中加载一个小型 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
}
}