Android ANR (2) - トリガーの原則

1.サービスANR

原因: メイン スレッドは、指定された時間 (フォアグラウンドで 20 秒、バックグラウンドで 200 秒) 内にサービスの各ライフサイクル関数の実行を完了しませんでした。

プロンプト: 理由: 実行中のサービス + パッケージ名

サービス ANR トリガー プロセス:

ここに画像の説明を挿入

サービスのタイムアウトを検出する方法:

ここに画像の説明を挿入

ここでは、タイムアウト メッセージが最初に送信されます。サービス タスクがしきい値の時間範囲内に完了すると、serviceDoneExecuting が呼び出されてメッセージが削除されます。それ以外の場合は、ANR プロセスがトリガーされます。

2.ブロードキャストANR

原因: メイン スレッドは指定された時間 (フォアグラウンドで 10 秒、バックグラウンドで 60 秒) 内に BroadcastReceiver の onReceive 関数の実行を終了しませんでした。

Prompt : Reason: Broadcast of Intent { act=XXX flg=XXX cmp=XXX }

ブロードキャスト ANR トリガー プロセス:

ここに画像の説明を挿入

ブロードキャスト タイムアウトを検出する方法:

ここに画像の説明を挿入
ここに画像の説明を挿入

三、ContentProvider ANR

原因: メイン スレッドは、指定された時間 (10 秒) 内に ContentProvider 関連の操作の実行を終了しませんでした。

プロンプト: 理由: コンテンツ プロバイダーの公開がタイムアウトしました (ANR の箇条書きボックスは報告されません)。

ContentProvider ANR トリガー プロセス:

ここに画像の説明を挿入

ContentProvider タイムアウトを検出する方法:

ここに画像の説明を挿入

4.入力ANR

原因: メイン スレッドが指定された時間 (5S) 内に現在の入力イベントの処理を完了せず、次の入力時間が来て、処理が完了するのを待っています (次の入力がない場合、タイムアウトは発生しません)。

プロンプト: 理由: 入力ディスパッチがタイムアウトしました (理由には多くの理由があります)

最後に、ANR の実行を見てみましょう。

Input を含むこれまでの主要なコンポーネントは、最後にタイムアウト メッセージを送信し、一連の判断を経て、最終的に AppErrors の appNotResponding メソッドが呼び出され、ANR 処理が実行されます。

ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入

ここでは主に ANR 操作について説明します。主な内容は、メイン ログでの ANR 情報の収集、ダンプ操作の実行、DropBox の追加、ANR を促すポップアップ ウィンドウなどです。

転載:https://www.jianshu.com/p/fe7373d224ca

おすすめ

転載: blog.csdn.net/gqg_guan/article/details/130526630