ANR
分类
(1)KeyDispatchTimeout,5s
(2)BroadcastTimeout,前台10s,后台60s
(3)ServiceTimeout,前台20s,后台200s
ANR执行流程
(1)发生ANR
(2)进程接受异常终止信号,开始写入进程ANR信息
(3)弹出ANR提示框(ROM表现不一)
ANR解决套路
(1)线下分析,使用如下命令:
adb pull data/anr/traces.txt 存储信息
然后分析:CPU,IO,锁
模拟由锁冲突导致的ANR
// 以下代码是为了演示Msg导致的主线程卡顿
new Handler().post(new Runnable() {
@Override
public void run() {
LogUtils.i("Msg 执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 然后,在主线程中获取锁
使用命令: “ adb pull ” 导出文件。
线上ANR监控方案
(1)通过FileOberver监控文件变化,高版本权限问题
ANR-WatchDog
(1)非侵入式的ANR监控组件
(2)弥补高版本无权限问题
(3)网站:https://github.com/SalomonBrys/ANR-WatchDog
这个代码的原理是:每隔5秒,向主线程发生一个加一的操作,如果主线程卡住了,那么就不能加一,于是报错。
使用这种方法,能检测出,具体是哪一行。
于 AndroidPerformanceMonitor 的区别
(1)AndroidPerformanceMonitor 监控主线程每个 msg 的执行
(2)ANR-WatchDog:看最终结果
结论:前者适合监控卡顿,后者适合补充ANR监控