WebView вызывает перезапуск приложения - Fatal signal 11 (SIGSEGV)

У меня есть активность, которая отображает веб-страницы. На некоторых телефонах (например, Huawei Ascend) это действие приводит к сбоям, что приводит к перезапуску приложения, но не вызывает всплывающее всплывающее сообщение об ошибке для Android. (Другие телефоны (например, 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 (у меня все еще есть звук, но нет изображения).

Ответ 1

убедитесь, что WebView является первым элементом RelativeLayout. или не используйте RelativeLayout, просто попробуйте LinearLayout. или удалить атрибуты андроид: layout_alignParentTop = "истина" андроид: layout_above = "@идентификатор/webNavBar" WebView

Ответ 2

webSettings.setJavaScriptEnabled(true);

Настройки выше приводят к ошибке "Fatal signal 11 (SIGSEGV)" для некоторых сайтов с помощью java script. Я воспроизвел эту ошибку на вкладке Samsung Galaxy Tab 3 и Galaxy Tab 3 lite. Версия Android для обоих устройств - 4.4.2.

Если я удалю функцию setJavaScriptEnabled, она работает нормально.