Hello Expert Android開発者:
Androidアプリがあり、基本的なワークフローは以下のとおりです
問題ネイティブアプリページが数週間前まで正常に起動するWebビューで[OK]ボタンをタップするとすぐに、アプリがクラッシュし、Webビューページの最初に戻り、詳細を入力してください。
以下の警告に注意してください。
役立つコードスニペットを次に示します。これが、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)
あなたの場合、レンダリングプロセスはクラッシュし、システムによって強制終了されません。
したがって、説明したように here 、オーバーライドした場合
_onRenderProcessGone(WebView view,
RenderProcessGoneDetail detail)
_
上記のメソッドの場合、detail.didCrash()
はtrue
を保持します。その場合、メモリアクセス違反などの内部エラーのためにレンダラーがクラッシュしました。レンダラーがクラッシュしたことを検出すると、アプリ自体がクラッシュします。
クラッシュを処理してアプリの実行を継続するには、以下の手順に従ってください。
onRenderProcessGone
をオーバーライドして、trueを返します。問題ネイティブアプリページが数週間前まで正常に起動するWebビューで[OK]ボタンをタップするとすぐに、アプリがクラッシュし、詳細の入力を求めるWebViewページの最初に戻ります。
これは、特定のWebページのロード中にレンダラーがクラッシュした場合、その同じページを再度ロードしようとすると、新しいWebView
オブジェクトが同じレンダリングクラッシュ動作を示す可能性があるためです。
詳細は このリンク のコードを確認してください。
これがお役に立てば幸いです。
Mopub広告プラットフォームを使用していますか?もしそうなら、彼らは彼らのSDKに関連するこのバグを持っています。
通常、ロードしようとしているWebページのバグに関連しています。
Webviewの動作方法にもAndroid 8.0から変更されています。マルチプロセスベースになり、これらの種類のエラーを処理できるようになりました(レンダラーがなくなりました) 、メモリ不足など)。
このオーバーライドを実装する必要があります
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail)
これについての詳細は here です。
更新:mopubまたはwebviewを使用している場合、Android 9.0はすべての非httpsトラフィックをブロックします。代替の使用を検討してくださいmopubのような方法 ここに実装 。
これはメモリの問題のようで、いくつかのスレッドから見つけることができます。
Webビューのフラグメント/アクティビティoverride onLowMemory()でこれを行い、ログを追加します。
@Override
public void onLowMemory() {
Log.d("TAG_MEMORY", "Memory is Low");
super.onLowMemory();
}
クラッシュを再現してみてくださいonLowMemory()が呼び出された場合次に、それが根本的な原因です。たぶん、いくつかのwebviewページはメモリが多すぎます。
これが以前に直面した問題と同じであることを願っています。 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'
}
また、現在ドメインの保護に慣れていない場合は、ネットワーク構成でそのドメインを除外することもできます。詳細な手順はこのページに記載されています