转一篇非常棒的文章戳这里
顺便写下点分析ANR的笔记
- step1 Trace文件中cmd line 看group=”main” 中的blocked-wait,有些trace文件中可以直接找到ANR堆栈信息。
- step2 分析找不到问题所在就看event log 中的am_anr字段,找到原因所在。如果是inputevent事件没有响应就看5s前做了什么操作,类似地如果是BroadcastTimeOut就分析10s前都干了些啥
- step3 ANR信息是在AppErrors中的appNotResponed()中生成并保存在trace文件以及DropBox中的。最新的ANR会保存在trace中,DropBox会保存最近几天的信息。
appNotResponed()是在AMS中被调用的。常见的ANR有两种情况:
广播发送10s,onReciver没有处理完事件。会在setBroadcastTimeoutLocked中调用appNotResponed()
input事件5s内没有响应。会在inputDispatchingTimeOut中调用appNotResponded()
trace文件中最为重要的是cmd oneline 中的main,以及cpu在ANR前后的使用情况,其中有表示平均负载的三个参数(Load: xx/xx/xx),分别表示ANR之前1分钟、10分钟、15分钟时的CPU平均负载,作为手持移动设备,我们通常看前1分钟即可。