Android ANRの問題の概要

1. tracesファイル分析

ANRスタック情報はファイル/data/anr/traces.txtに出力されます

2. 3つの一般的な問題

a。メインスレッドがブロックされ、onClickイベントなどの5秒間の入力イベントに対する応答がありません。

b.BroadcastReceiverはプログラムのメインスレッドで実行されており、BroadcastReceiverのランタイムはデフォルトで10秒です。

c.Serviceはコンピューティングコンポーネントです。バックグラウンドで実行されますが、基本的にはメインスレッドで実行されます。サービスでCPUを集中的に使用する(MP3再生など)、またはブロックする(ネットワークなど)操作が必要な場合は、サービスを子スレッドでは、それ以外の場合はanrが発生するまでに20秒以上かかります。

3.その他の理由

a。CPUが集中的で、メインスレッドがCPUタイムスライスを捕捉できないため、CPU使用率が高いプロセスに注意を払う
b。データベースへの不適切なアクセスなどのIOが高いと、データベースの負荷が過剰になる(CPUがログでiowaitを使用する)高い
cメモリ不足などのメモリ不足(メモリ不足)により、ブロックはビットマップを作成します
。デッドロックはANRをトリガーし、非メインスレッドはメインスレッドが必要とするロックオブジェクトを保持するため、メインスレッドはタイムアウトを待機します。通常、ログには次のフィールドがあります-locked |ロック待機中|スレッドによって保持され、現時点ではほとんどのCPUはアイドル状態であり、使用率は非常に低い
です。e。現在のアプリケーションプロセスは、プロセス間通信を実行して他のプロセスを要求します。他のプロセスの操作には、ハードウェアカメラ
fの操作など、長時間フィードバックがありません。。サービスバインダーの数が上限に達したg。system_serverで
WatchDog ANRをトリガーする

4. ANRを回避する方法

a。ネットワークデータの送受信、大量の計算の実行、データベースの操作、ファイルの読み取りと書き込みなど、複雑で時間のかかる操作をメインスレッドで実行しないでください。
b.broadCastReceiver複雑な操作を実行するには、onReceive()メソッドでIntentServiceまたはJobIntentServiceを開始して実行できます。
c.Serviceでの時間のかかる操作も、非同期タスクを使用するのに最適です。
d。設計/コード作成段階での同期/デッドロックやデッドループなどの不適切な状況を回避します。

5.ログ分析

关键词:ブロック| -ロック済み| ロックを待っています| | ANRManagerのスレッド| ANRが保持:理由

元の記事を142件公開 賞賛された258件 160,000回

おすすめ

転載: blog.csdn.net/conconbenben/article/details/105329095