ANRの理由
1. ANR(アプリケーションが応答しないアプリケーションが応答しない)。
2. Androidアプリケーションのインターフェーススレッドが長時間ブロックされると、「アプリケーションが応答しない」(ANR)エラーがトリガーされます。アプリケーションがフォアグラウンドにある場合、次の図に示すように、システムはユーザーにダイアログボックスを表示します。ANRダイアログボックスは、アプリケーションを強制的に終了するオプションをユーザーに提供します。
3.
InputDispatchingタイムアウトがトリガーされるタイミング:5秒以内に画面タッチイベントまたはキーボード入力イベントに応答できない
BroadcastQueueタイムアウト:フォアグラウンドブロードキャスト(BroadcastReceiver)のonReceive()関数が実行されると、処理が10秒で完了せず、バックグラウンドは60秒です。
サービスのタイムアウト:フォアグラウンドサービスは20秒以内で、バックグラウンドサービスは200秒以内に実行されません。
ContentProviderタイムアウト:ContentProviderの公開が10秒以内に完了しません。
ANR診断
1.いくつかの一般的なANRモード
- アプリケーションは、メインスレッドでI / Oを伴う操作を非常にゆっくり実行します。
- アプリケーションはメインスレッドで長期的な計算を実行します。
- メインスレッドが別のプロセスへの同期バインダー呼び出しを行っており、後者は戻るのに長い時間がかかります。
- メインスレッドはブロックされた状態にあり、別のスレッドで発生する長い操作の同期ブロックを待機しています。
- デッドロックは、プロセス内のメインスレッドと別のスレッドの間、またはバインダーの呼び出しを通じて発生します。メインスレッドは、長い操作の完了を待機しているだけでなく、デッドロック状態にもなっています。
- GC時間が長すぎるなど
2.バックグラウンドのANRダイアログボックスを
有効にするデバイスの開発者オプションで[ すべてのANRを表示] が有効になっている場合のみ、Androidは、ブロードキャストメッセージの処理に時間がかかりすぎるアプリケーションに対してANRダイアログボックスを表示します。したがって、システムは常にユーザーにバックグラウンドのANRダイアログを表示するわけではありませんが、アプリケーションでパフォーマンスの問題が発生する可能性があります。
3.アプリケーションのonCreateで厳密モードが呼び出されるようにします
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() //
.detectAll()
.penaltyLog()
.penaltyDeath()
.build());
4.TraceView TraceView
を使用して、ユースケースを表示し、メインスレッドがビジーである場所を確認するときに、実行中のアプリケーションのトレース情報を取得できます。
デバイスで「バグレポートを生成」開発者オプションを使用するか、開発マシンでadb bugreportコマンドを使用して、物理デバイスからバグレポートを取得できます。
adb root
adb shell ls /data/anr
adb pull /data/anr/<filename> /Desktop/anr
デバイスを接続した後、デバイスファイルエクスプローラーでデバイスを直接表示することもできます。下の図に示すように、
anrの下でトレースファイル名を取得するか上部を開くと、発生時間がわかり、ANRが発生したおおよその時間を見つけて、ログで先頭を見つけます「メイン」に関連するログを次の図に示します。この図は、Xcrashのネイティブテストをテストするために使用した問題を示しています。同じ分析方法は、メインを見つけて次のスタックを分析することです。
ANRの問題を回避する
メインスレッド(UIスレッド)での時間のかかる操作は避けてください。