Android ANR分析

·  阅读 72

Android ANR分析
什么时候会出现ANR
1keyDispatchTimeout
input事件5秒内没有处理完发生了ANR
Logcat 关键字, input event dispatching timed out
2 broadcastTimeout
前台广播,onReceiver 10s 内没有处理完发生ANR
后台广播,onReceiver 60s 呢没有处理完发生ANR
Logcat 关键字,timeout of boradcast BroadcastRecord
3 ServiceTimeout
前台Service onCreate ,onStart onBind 等生命周期在20s 内没有处理完发生ANR
后台Service onCreate ,onStart onBind 等生命周期在200s 内没有处理完发生ANR
Logcat 关键字,Timeout executing service
4 ContentProviderTimeout
ContentProvider 在10s内 没有处理完发生ANR
Logcat 关键字,timeout publishing content providers
为什么出现ANR
1 主线程频繁进行耗时的IO操作:如数据库读写
2 多线程操作的死锁,主线程被block
3 主线程被binder对端block
4 System Server 中WatchDog 出现ANR
5 service binder 的链接达到上线无法和System server 通信
6 系统资源以耗尽(管道,CPU,IO)

CPU一般都是多核的
比如8核的CPU
0-3 是小核 4-5 是中核 6-7 是大核
为什么手机完游戏的时候会卡,因为游戏打开的时候可能就已经绑定到大核上面了 ,其他的应用可能只能使用中小核所以会卡

ANR发生后如何解决
1 线下直接看logcat 解决
2 线上一般集成bugly 获取ANR的日志 解决问题
3 线上可以实现自己ANR的监控方案

读懂trace文件
通过logcat 日志,traces 文件确认anr发生时间点
traces文件和cpu使用率
/data/anr/trace*.txt
主线程状态
其他线程状态
解决ANR的关键信息
1 ANR时间 :08-29 12:32:23.431
2 进程pid 1480
3 进程名 com.xxx.xxx
4 ANR 类型:KeyDispathcTimeout
5 trace文件中
(1) 26% total : 22% user + 3.6% kernel +0% iowait + 0.1 softirg
说明 这个时候 cpu使用率不是很高,发生anr不是应为资源问题,
Iowait io堵塞 使用率 0% 也不是io的问题 ,
(2) 搜索是否有 help by 相关字眼, 如果有的话可能是主线程被block主了
(3) “mian”线程 ,查找main线程看出现什么问题
主要看 help mutexes=
Waiting xxx

线程的状态
Running 运行 wait 等待 starting 就绪未运行 ,等其他

// Adb shell 链接模拟器

Anr线上监控,
1 继承 FileObserver 监控牧歌文件/目录,状态发生改变,创建,删除文件
监听 data/anr 文件目录,然后上传trace文件
2 AnrWatchDog extends Thread
3 leakcanary

分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改