web-dev-qa-db-ja.com

Android WebViewがクラッシュし始めましたAndroid 9

Hello Expert Android開発者:

Androidアプリがあり、基本的なワークフローは以下のとおりです

  1. ユーザーにメールまたはテキストメッセージでリンクが送信されます
  2. ユーザーがリンクをクリックすると、ChromeまたはAndroidデフォルトのブラウザで開かれたページに[〜#〜] join [〜 #〜]
  3. ユーザーがこの[〜#〜] join [〜#〜]ボタンをクリックすると、アプリが起動し、Webviewにページが表示され、ユーザーに名、姓、電話/メールアドレスの入力を求めます次に、ユーザーは[〜#〜] initiate [〜#〜]という名前のボタンをクリックします
  4. 情報を検証します-ユーザーが新規の場合、レコードを作成し、ユーザーが存在し、それを更新するなどして、セッションが記録されることを通知するポップアップを表示します。
  5. ユーザーがポップアップで[OK]をクリックするとすぐに、コントロールがWebビューに存在し、ユーザーはネイティブのAndroid=ページにいます。

問題ネイティブアプリページが数週間前まで正常に起動するWebビューで[OK]ボタンをタップするとすぐに、アプリがクラッシュし、Webビューページの最初に戻り、詳細を入力してください。

以下の警告に注意してください。

  • まず、これはAndroid 9の場合にのみ発生します。9。Samsung Galaxy S8およびS9でテストしました。毎回発生するわけではありませんが、かなり定期的に発生します。 3回のうち2回と言うこともあるでしょう。
  • このコードは過去1年ほどの間正常に実行されており、この問題は発生していません。それは、過去3〜4週間で発生し始めました。
  • 同じ問題が観察されないiOSアプリもあります。

役立つコードスニペットを次に示します。これが、Webビューをロードする方法です。

webview = findViewById(R.id.webview);
    webview.setVisibility(View.VISIBLE);
    final ProgressDialog pd = ProgressDialog.show(ActivtyName.this, "", "Please wait", true);
    webview.setGeolocationEnabled(true);
    webview.setMixedContentAllowed(true);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setDomStorageEnabled(true);
    webview.getSettings().setLoadWithOverviewMode(true);

    webview.setWebChromeClient(new WebChromeClient()

=======ここでは多くのメソッドをオーバーライドし、その後に

webview.setWebViewClient(new WebViewClient()

=======ここでメソッドをオーバーライドします。

何が起こっているのでしょうか? USBモードでデバッグしながらログを確認してみましたが、Android Consoleに以下のように表示されているものを除いて、ログにはほとんど表示されません。

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.a****d.xyzapp <<<

backtrace:

#00  pc 0000000001b61620  /data/app/com.Android.chrome-DpcaMBOCm2oa08upmw1Tug==/base.apk

これは要求されたより詳細なログです:

2019-05-18 11:58:01.694 23217-23217/com.a**d.xyzapp.debug A/chromium: 

[FATAL:crashpad_client_linux.cc(404)] Render process (28925)'s crash wasn't handled by all associated  webviews, triggering application crash.
Fatal signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x7ab7b9d620 in tid 23217 (atientapp.debug), pid 23217 (atientapp.debug) (edited) 
16
cooler

あなたの場合、レンダリングプロセスはクラッシュし、システムによって強制終了されません。

したがって、説明したように here 、オーバーライドした場合

_onRenderProcessGone(WebView view,
            RenderProcessGoneDetail detail)
_

上記のメソッドの場合、detail.didCrash()trueを保持します。その場合、メモリアクセス違反などの内部エラーのためにレンダラーがクラッシュしました。レンダラーがクラッシュしたことを検出すると、アプリ自体がクラッシュします。

クラッシュを処理してアプリの実行を継続するには、以下の手順に従ってください。

  1. 現在のWebViewインスタンスを破棄します。
  2. アプリの実行を継続する方法をビジネスロジックに指定します。
  3. onRenderProcessGoneをオーバーライドして、trueを返します。

問題ネイティブアプリページが数週間前まで正常に起動するWebビューで[OK]ボタンをタップするとすぐに、アプリがクラッシュし、詳細の入力を求めるWebViewページの最初に戻ります。

これは、特定のWebページのロード中にレンダラーがクラッシュした場合、その同じページを再度ロードしようとすると、新しいWebViewオブジェクトが同じレンダリングクラッシュ動作を示す可能性があるためです。

詳細は このリンク のコードを確認してください。

これがお役に立てば幸いです。

4

Mopub広告プラットフォームを使用していますか?もしそうなら、彼らは彼らのSDKに関連するこのバグを持っています。
通常、ロードしようとしているWebページのバグに関連しています。
Webviewの動作方法にもAndroid 8.0から変更されています。マルチプロセスベースになり、これらの種類のエラーを処理できるようになりました(レンダラーがなくなりました) 、メモリ不足など)。
このオーバーライドを実装する必要があります

public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail)

これについての詳細は here です。

更新:mopubまたはwebviewを使用している場合、Android 9.0はすべての非httpsトラフィックをブロックします。代替の使用を検討してくださいmopubのような方法 ここに実装

1
Vanshaj Daga

これはメモリの問題のようで、いくつかのスレッドから見つけることができます。

Webビューのフラグメント/アクティビティoverride onLowMemory()でこれを行い、ログを追加します。

@Override
public void onLowMemory() {
    Log.d("TAG_MEMORY", "Memory is Low");
    super.onLowMemory();
}

クラッシュを再現してみてくださいonLowMemory()が呼び出された場合次に、それが根本的な原因です。たぶん、いくつかのwebviewページはメモリが多すぎます。

0
TheAnkush

これが以前に直面した問題と同じであることを願っています。 Android 9セキュリティの点でいくつかの変更が行われます。したがって、基本的にデフォルトでは、セキュリティで保護されていない、またはSSL認定されていないアプリで使用するすべてのURLとドメインをブロックします。

デフォルトで有効になっているネットワークTLSアプリがAndroid 9以上)をターゲットにしている場合、isCleartextTrafficPermitted()メソッドはデフォルトでfalseを返します。アプリで特定のドメインのクリアテキストを有効にする必要がある場合は、cleartextTrafficPermittedを明示的に設定して、アプリのネットワークセキュリティ構成のそれらのドメインに該当します。

そのドメインをSSLで認証し、このコードをマニフェストに追加する必要があります

<applicaton ....>
<uses-library
            Android:name="org.Apache.http.legacy"
            Android:required="false" />
</application>

また、アプリのbuild.gradleファイルの依存関係ブロックに以下のコードを追加します。

dependencies {
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}

また、現在ドメインの保護に慣れていない場合は、ネットワーク構成でそのドメインを除外することもできます。詳細な手順はこのページに記載されています

Androidのセキュリティ設定

0