ANR和Crash
ANR
App在特定时间无法响应屏幕触摸或键盘输入时间,特定的事件没有处理完,就会出现Anr,即程序无响应
Anr发生的原因
Service Timeout:前台服务在20s内未执行完成;
BroadcastQueue Timeout:前台广播在10s内未执行完成
ContentProvider Timeout:内容提供者在publish过超时10s;
InputDispatching Timeout:输入事件分发超时5s,包括按键和触摸事件
主线程阻塞或主线程数据读取,CPU满负荷,I/O阻塞,内存不足 等均会导致Anr
避免Anr
避免死锁的出现,使用子线程来处理耗时操作或阻塞任务。尽量避免在主线程query provider、不要滥用SharePreferenceS
文件读写或数据库操作放在子线程异步操作。防止内存泄漏,优化内存
获取Anr信息
- 通过log进行打印查看
- 通过查看/data/anr目录下生成的trace.txt文件,将异常信息写入到traces文件中,系统会记录异常的位置cpu和内存的使用情况
- BlockCanary启动一个线程负责保存ui线程的堆栈信息,将堆栈信息以及cpu信息保存起来每条信息都以时间撮为key保存BlockCanary注册了logging来获取事件开始结束时间。如果检测到事件处理时间超过阈值(默认值1s),则从mThreadStackEntries中查找T1
T2这段时间内的堆栈信息,并且从mCpuInfoEntries中查找T1T2这段时间内的CPU及内存信息。并且将信息格式化后保存到本地文件,并且通知用户
Crash
程序异常退出,强制退出
出现crash的原因
- 内存管理错误:可能是可用内存过低,app所需的内存超过设备的限制,app跑不起来导致App crash。或是内存泄露,程序运行的时间越长,所占用的内存越大,最终用尽全部内存,导致整个系统崩溃
- 程序逻辑错误:数组越界、堆栈溢出、并发操作、逻辑错误。
- 设备兼容:由于设备多样性,app在不同的设备上可能会有不同的表现。
- 网络因素:可能是网速欠佳,无法达到app所需的快速响应时间,导致app crash。或者是不同网络的切换也可能会影响app的稳定性。
如何解决
通过获取响应的crash信息进行相应的更改,针对上述可能原因做出相应的改变