WebView导致应用程序重新启动 – 致命信号11(SIGSEGV)

我有一个显示网页的活动。 在某些电话(例如,华为Ascend)上,该活动崩溃的方式导致应用程序重新启动,但不会导致通常的android报错popup窗口。 (其他手机(例如Nexus)从来没有崩溃。)它似乎总是在网页加载时崩溃,而不是在任何特定的点,例如有时在网页上加载,有时在onPageStarted或onPageFinished。

我认为WebView正在造成这种情况 –

08-29 21:08:22.577:A / libc(957):致命信号11(SIGSEGV)在0x00000008(代码= 1),线程957

– 但是我不知道为什么。

这是活动:

public class WebDisplay extends Activity { private String sentUrl = ""; public WebView myWebView; public ProgressBar spinner; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("WEBVIEW", "onCreate"); getWindow().setBackgroundDrawableResource(R.color.white); Bundle extras = getIntent().getExtras(); if (null != extras) { sentUrl = extras.getString("displayURL"); } setContentView(R.layout.webdisplay); myWebView = (WebView) findViewById(R.id.webDisplay); spinner = (ProgressBar) findViewById(R.id.webLoading); // WebView displays default to showing things in exact pixel size at 100% // resolution, meaning it generally opens on a zoomed in portion of the // top left of the web page and refuses to let you zoom out, so we have // to force it to display pages a bit more reasonably. myWebView.getSettings().setLoadWithOverviewMode(true); myWebView.getSettings().setUseWideViewPort(true); myWebView.getSettings().setPluginState(WebSettings.PluginState.ON); // By default, there is no javascript support or zoom controls, so // turn both of those on. WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(true); webSettings.setBuiltInZoomControls(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // We want links to continue opening inside the app. myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("WEBVIEW", "loadUrl="+url); view.loadUrl(url); // open link in the same web view. return true; } @Override public void onPageStarted(WebView view, String url, android.graphics.Bitmap favicon) { Log.d("WEBVIEW", "onPageStarted="+url); super.onPageStarted(view, url, favicon); if (View.GONE == spinner.getVisibility()) { spinner.setVisibility(View.VISIBLE); } } @Override public void onPageFinished(WebView view, String url) { Log.d("WEBVIEW", "onPageFinished="+url); super.onPageFinished(view, url); if (View.VISIBLE == spinner.getVisibility()) { spinner.setVisibility(View.GONE); } } @Override public void onReceivedError(WebView view, int errorCode, String description, String url) { Log.d("WEBVIEW", "onPageError="+url+"::descr="+description); } }); // Try to get YouTube videos working. myWebView.setWebChromeClient(new WebChromeClient() { }); // So the user doesn't have to back through their entire history to get // back to the app, we provide a "done browsing" button. Button doneButton = (Button) findViewById(R.id.doneButton); doneButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { finish(); } }); ImageButton backButton = (ImageButton) findViewById(R.id.webBackButton); backButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { myWebView.goBack(); } }); ImageButton fwdButton = (ImageButton) findViewById(R.id.webForwardButton); fwdButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { myWebView.goForward(); } }); ImageButton refreshButton = (ImageButton) findViewById(R.id.refreshButton); refreshButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { myWebView.reload(); } }); myWebView.loadUrl(sentUrl); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Save the state of the WebView myWebView.saveState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // Restore the state of the WebView myWebView.restoreState(savedInstanceState); } } 

这里是加载的布局:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" > <RelativeLayout android:id="@+id/webNavBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/abs__background_holo_light" android:layout_alignParentBottom="true" android:padding="2dp" > <Button android:id="@+id/doneButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/refreshButton" android:layout_alignTop="@+id/refreshButton" android:background="@drawable/custom_button" android:padding="5dp" android:text="@string/web_done" android:textColor="@color/white" android:textStyle="bold" /> <ImageButton android:id="@+id/refreshButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:background="@drawable/custom_button" android:src="@drawable/ic_action_refresh" android:contentDescription="@string/web_refresh" android:textColor="@color/white" android:padding="5dp" /> <ImageButton android:id="@+id/webBackButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginRight="5dp" android:layout_toLeftOf="@+id/webForwardButton" android:background="@drawable/custom_button" android:src="@drawable/navigation_back" android:padding="5dp" android:contentDescription="@string/web_back" android:textColor="@color/white" /> <ImageButton android:id="@+id/webForwardButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/custom_button" android:src="@drawable/navigation_forward" android:contentDescription="@string/web_forward" android:textColor="@color/white" android:padding="5dp" /> </RelativeLayout> <WebView android:id="@+id/webDisplay" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_above="@id/webNavBar" /> <ProgressBar android:id="@+id/webLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="80dp" style="@android:style/Widget.ProgressBar.Large" android:layout_centerHorizontal="true" /> </RelativeLayout> 

ETA:像这样closures硬件加速

 myWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

似乎停止了SIGSEV的事情,但也停止播放YouTubevideo(我仍然有audio,但没有图像)。

Solutions Collecting From Web of "WebView导致应用程序重新启动 – 致命信号11(SIGSEGV)"

确保WebView是RelativeLayout的第一个元素。 或者不要使用RelativeLayout,只需尝试LinearLayout。 或者移除WebView的属性android:layout_alignParentTop =“true”android:layout_above =“@ id / webNavBar”

 webSettings.setJavaScriptEnabled(true); 

上面的设置会导致一些使用java脚本的站点发生"Fatal signal 11 (SIGSEGV)"错误。 我在三星Galaxy Tab 3和Galaxy选项卡3 lite上重现了这个错误。 Android版本是两个设备的4.4.2。

如果我删除“setJavaScriptEnabled”function,它工作正常。