如何避免Android ANR和Crash

266 阅读2分钟

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中查找T1T2这段时间内的堆栈信息,并且从mCpuInfoEntries中查找T1T2这段时间内的CPU及内存信息。并且将信息格式化后保存到本地文件,并且通知用户

Crash

程序异常退出,强制退出

出现crash的原因

  • 内存管理错误:可能是可用内存过低,app所需的内存超过设备的限制,app跑不起来导致App crash。或是内存泄露,程序运行的时间越长,所占用的内存越大,最终用尽全部内存,导致整个系统崩溃
  • 程序逻辑错误:数组越界、堆栈溢出、并发操作、逻辑错误。
  • 设备兼容:由于设备多样性,app在不同的设备上可能会有不同的表现。
  • 网络因素:可能是网速欠佳,无法达到app所需的快速响应时间,导致app crash。或者是不同网络的切换也可能会影响app的稳定性。

如何解决

通过获取响应的crash信息进行相应的更改,针对上述可能原因做出相应的改变