Android webview 崩溃“致命信号 5 (SIGTRAP)”
Posted
技术标签:
【中文标题】Android webview 崩溃“致命信号 5 (SIGTRAP)”【英文标题】:Android webview crash "Fatal signal 5 (SIGTRAP)" 【发布时间】:2017-08-13 00:28:51 【问题描述】:我有一个带有 Web 视图的应用程序,我在其中加载启用了 javascript 的 html 内容。 Web 视图位于片段内。
这就是我在片段的方法 onCreateView
中初始化 Web 视图的方式:
WebView webview = (WebView) mainView.findViewById(R.id.webview);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDisplayZoomControls(false);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDomStorageEnabled(true);
webSettings.setSupportMultipleWindows(true);
webview.setWebViewClient(new WebViewClient()
@Override
public void onPageFinished(WebView view, String url)
super.onPageFinished(view, url);
/*
* My code
*/
);
webview.setWebChromeClient(new WebChromeClient()
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)
WebView.HitTestResult result = view.getHitTestResult();
String data = result.getExtra();
if (data != null)
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));
startActivity(browserIntent);
return false;
);
webview.loadDataWithBaseURL(baseUrl, htmlData, "text/html", "utf-8", "");
在 web 视图中,地图是使用 JavaScript 加载的。在这张地图上,我们可以点击元素并加载照片。单击时,照片会显示在弹出窗口中(仍在网络视图中)。当我点击返回按钮返回地图时,应用程序崩溃了。
这是错误日志:
A/libc:致命信号 5 (SIGTRAP),tid 949 中的代码 1 (Chrome_InProcRe) [03-21 11:26:08.510 364:364 W/] 调试器:处理请求:pid=32610 uid=10289 gid=10289 tid=949
我在 android 7.1.1、6.0.1、5.0.2 上测试并遇到了崩溃。然后我尝试使用 Android 4.4.2,应用程序没有崩溃。
当我点击后退按钮时(正如我们在 GIF 上看到的那样),它应该回到之前的状态并关闭弹出窗口
【问题讨论】:
你是在设备还是模拟器上测试?请在 loadDataWithBaseUrl() 之前设置一个 webchromeclient,如下所示: webview .setWebChromeClient(new WebChromeClient()); 对于 Javascript 调试,最好覆盖 WebChromeClient 中的 onConsoleMessage @user2281606 它在模拟器上运行良好。另外,我已经在设置 webchrome 客户端。我在我的问题中编辑了代码。我尝试通过远程调试查看日志developers.google.com/web/tools/chrome-devtools/… 但没有日志 你有没有解决过这个@Eddybrtn?我看到的是一样的。我认为这与启用硬件加速有关,因为当我禁用硬件加速时,这些崩溃报告会消失……但是我的“慢速渲染”指标会飞涨……卡在岩石和坚硬的地方之间:-( @drmrbrewer 我想我们永远不会知道 【参考方案1】:尝试覆盖后退导航功能并自行关闭弹出窗口。
您不需要处理所有堆栈导航逻辑,只需在显示此弹出窗口时设置一个状态即可。 应用您自己的导航逻辑(例如手动关闭弹出窗口)。
void onBackPressed()
if(isTheBuggyPopupIsOn)
closeTheBuggyPopup();
else
super.onBackPressed();
【讨论】:
【参考方案2】: webView.setWebViewClient(new MyBrowser());
public class MyBrowser extends WebViewClient
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
// TODO Auto-generated method stub
if (url.equals(""YOUR URL))
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
else
return false;
【讨论】:
【参考方案3】:试试这个....
先添加这个
webView.setWebViewClient(new MyBrowser());
然后添加这个
public class MyBrowser extends WebViewClient
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
// TODO Auto-generated method stub
if (url.equals(""YOUR URL))
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
else
return false;
【讨论】:
它不起作用,回调没有捕捉到点击。请问您有进一步的解释吗?以上是关于Android webview 崩溃“致命信号 5 (SIGTRAP)”的主要内容,如果未能解决你的问题,请参考以下文章
Android Webview 在三星和 Android 11 上崩溃
尝试退出插件 webview 时,带有集成插件的 Cordova 应用程序在 webview 上崩溃(android 测试)