- ANR工作原理
Application Not Responding,应用程序无响应。工作线程向检测线程发送请求,检测线程初始化检测状态,开始计时,工作线程业务执行完成后向检测线程发送清除检测请求,检查线程在计时时间内未收到清除请求则进行超时处理并发送ANR弹窗。
- ANR分类
- 应用ANR:按键超时(5s),广播处理超时(10s),服务处理超时(20s)
- 系统ANR:Watchdog超时(60s) ,监控整个system_service进程的,超时会重启系统
- ANR问题的分析方法
- 原因:
1)在主线程里面有耗时的操作,或者逻辑里面有异常进入死循环的状态。
2)线程之间通信造成阻塞(trace文件),或者线程挂起后没有被唤起。
3)其他进程抢占CPU。 - ANR现场
1)apps/android.txt 出错进程,出错原因,CPU占用率
2)anr/traces.txt 出错进程内部线程的堆栈信息
广播ANR分析
广播投递即开始计时,并设置超时消息。广播事件共享UI线程消息队列,要排队,此队列消息处理直接影响广播事件的处理。调用onReceive()处理广播,处理效率直接影响计时。finishReceiver()通知AMS不及时,将影响到超时消息的移除。
'adb shell dumpsys activity broadcasts' 查看广播注册信息,查看广播都有谁接收。ANR问题的分析方法
1)查找ANR进程原因。
2)检查cpu负载情况,cpu是否被抢占
3)查看调用堆栈,分析代码(耗时,死循环,线程阻塞或挂起)ANR问题的优化方向
- 避免在主线程进行复杂的操作
- 广播接收不要进行复杂的操作
- 服务生命周期函数不要进行复杂操作
- 编码注意边界条件控制 避免死循环
- 在设计及编码阶段避免出现同步/死锁