前言
本章主要围绕 ANR 如何监控以及优化;
基本概念
ANR(Android Not Responding) 是指应用程序未响应,Android 系统对于一些事件需要在一定的时间范围内完成,如果超过预订时间未能得到有效响应或者响应时间过长,都会造成 ANR。
ANR 常见类型
input 事件
input事件在5s内没有处理完;
- logcat关键字:input event dispatching timed out;
- tag:对于input来说,即便某次事件执行时长超过了timeout时长,只要后续没有再生成输入事件,则不会发生anr;
Input 的超时机制与其他不同,对于 input 事件来说即便某次事件执行时间超过了 timeout 时长,只要用户后续再没有生成输入事件,则不会触发 ANR;
broadcast事件
- 前台广播:10s内没有处理完;
- 后台广播:60s内没有处理完;
logcat关键字:timeout of broadcast BroadcastRecord
service事件
- 前台service:20s内没有处理完;
- 后台service:200s内没有处理完;
logcat关键字:timeout executing service;
provider 事件
10s内没有处理完;
logcat关键字:timeout publishing content provider;
ANR 出现的原因
- 主线程进行耗时的 IO 操作;
- 例如数据库读写
- 网络操作
- 序列化
- 文件读写
- sp 操作
- 多线程操作的死锁,导致主线程被block;
- traces.txt中的关键字:held mutexes / held by
- 系统资源被耗尽(管道 CPU IO);
- 主线程被 binder,对端 block;
- binder 通信默认是同步的,也可以异步实现,如果同步通信的时候,如果对端被 block 之后,导致主端就会无限等