第一步检查类型:
第一类:Input Dispatcher ANR:
具体的检查输入分发的类型:
A .没有焦点窗口
ANR 的时间点是否在应用onresume结束前,若是,是否在绘画布局window,若是则是窗口问题,否则,和app相关;若不是onresume前发生的anr,就是app的问题。
B .等待前一个Event处理
app是否空闲,若是的话,则是View的问题。否则则是app本身的问题。
第二类:Broadcast/Service ANR
APP 的问题
第三类:Content provider ANR
Timeout contain ANR PID?
check callStack of Receiver Part。
APP ANR 问题定位大致流程
CPU loading >95%
分为IO的使用 workload >=70% -----Io 的issue
否则:
看下前三的Top3,如果是,low memory
非95%
check callStack --- 查看下主线程的堆栈
继续Deadlock 查找lock的原因
binder的locked
Native call 找对应的so
导致ANR 的原因:
应用导致:
a 函数阻塞,死循环,主线程IO ,处理大数据
b. 锁出错
c. 内存紧张
系统导致的:
后台广播会被抢占CPU ,若是前台占用大量的cpu。
ANR 的关键字
event log 中 am_ANR
main -log ANR in
补充定位:
一)导致ANR主要有3种原因:
ANR的产生原因就是由于应用程序的主线程响应超时导致的,只要超过最大限制的超时时间就必然会产生ANR:
1.KeyDispatchTimeout(5 seconds)–按键或触摸事件在特定时间内无响应;(输入事件)
2. BroadcastTimeout(10 seconds)–BroadcastReceiver在特定时间内无法处理完成;(特定操作)
3. ServiceTimeout(20 seconds)–Service在特定的时间内无法处理完成;(特定操作)
(二)处理方法
1.获取实时log: adb logcat -v time >anr.log 或 adb logcat -v time | tee anr.log
2.获取traces.txt文件:adb pull /data/anr/traces.txt C:\monkey
(三)分析log
从log可以看出ANR的类型:
1.cpu使用量接近100%,说明当前设备很忙,有可能是cpu饥饿导致ANR;
2.cpu使用量很低,说明主线程有可能被阻塞;
3.IOwait很高,说明有可能是主线程在进行I/O操作导致ANR;
(四)分析traces