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

时间:2013-08-29 20:58:21

标签: android webview segmentation-fault

我有一个显示网页的活动。在某些手机上(例如华为Ascend),此活动会以导致应用程序重新启动的方式崩溃,但不会导致通常的安装错误弹出窗口进行报告。 (其他手机(例如Nexus)根本不会崩溃。)在网页加载时似乎总是崩溃,但在任何特定点都没有,例如有时在shoulOverrideUrlLoading,有时在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:像这样关闭硬件加速

myWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

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

2 个答案:

答案 0 :(得分:3)

确保WebView是RelativeLayout的第一个元素。 或者不要使用RelativeLayout,只需尝试使用LinearLayout。 或删除属性   机器人:layout_alignParentTop =&#34;真&#34;   机器人:layout_above =&#34; @ ID / webNavBar&#34; WebView

答案 1 :(得分:0)

webSettings.setJavaScriptEnabled(true);

使用java脚本的某些网站上面的设置会导致"Fatal signal 11 (SIGSEGV)"错误。我在三星Galaxy Tab 3和Galaxy tab 3 lite上重现了这个错误。两种设备的Android版本均为4.4.2。

如果我删除&#34; setJavaScriptEnabled&#34;功能,它工作正常。