LoginSignup
12
11

More than 5 years have passed since last update.

Android の WebView で signal 11 (SIGSEGV) が出る件の解決策

Last updated at Posted at 2015-11-25

Android で WebView を使ってると、signal 11 (SIGSEGV) で落ちることが多々ありました。
具体的には、mWebView.reload(); や、adb から再インストール→起動した時、などに発生します。

調べたところ、次の組み合わせで落ちていた模様。

mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
mWebView.getSettings().setJavaScriptEnabled(true);

js ファイルのキャッシュが悪さをしている…?

解決策1:Javascript をオフにしてみる

mWebView.getSettings().setJavaScriptEnabled(false);

とりあえず落ちなくなりました。でも Javascript が使えないと困ります。

解決策2:キャッシュをオフにしてみる

mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

これでも落ちなくなりました。でもキャッシュは使いたいです。

解決策3:onPageStarted 時にキャッシュをクリアしてみる

public void onPageStarted(WebView webView, String url, Bitmap favicon) {
webView.clearCache(true);
}

解決策2とあまり変わりません。
ここで js ファイルのキャッシュのみ削除とかができれば良さそうなのですが…。

解決策4:js ファイルのみキャッシュが発生しないようにしてみる

<script type="text/javascript" src="<? echo "hoge.js?" . time(); ?>"></script>

よくある js ファイルの URL を毎回変えてあげる手です。
通信量が増える、キャッシュが膨れ上がる、そもそもサーバー側が弄れない場合は使えない、などなど多々問題がありますが、
場合によってはこれで解決できそうです。

追記(未検証):shouldInterceptRequest でごにょごにょ

shouldInterceptRequest を使えば、js がリクエストされたときのみ独自で js を取得するなどが可能かも。
ただ shouldInterceptRequest を使うことで SIGSEGV が発生する事例もあるようなので、
もっと根が深いところで落ちてるのかも…。
もうちょっと検証する必要がありそうです。

補足

data/data/{パッケージ名}/caches
data/data/{パッケージ名}/databases

キャッシュはこのあたりに sqlite などで入ってるようです。
興味がある人は覗いてみるといろいろ分かるかも知れません。
onPageStarted 時にここを直接弄るという手も考えたのですが、今後も通じるとは限らないのでオススメはできません。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11