参考资料:http://hjxandhmr.github.io/2016/07/01/Android-ANRAnalysis/
ANR发生的条件
- 5s内没有响应用户输入事件
- 10s内广播接收器没有处理完毕
- 20s内服务没有处理完毕
如何避免ANR的发生
基本的思路就是将IO操作在工作线程来处理,减少其他耗时操作和错误操作
- 使用AsyncTask处理耗时IO操作。
- 使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREADPRIORITY
BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。 - 使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
- Activity的onCreate和onResume回调中尽量避免耗时的代码
BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。
1.获取ANR日志
-
查看traces.txt是否存在(首先Android设备需要root)
adb shell ----su----cd data----ls(应该会有一个anr文件夹)
adb shell----su----cd data/anr----ls(如果有anr日志会有一个traces.txt文件)
-
怎样将traces.txt文件copy到指定位置?
adb pull /data/anr/traces.txt d:/mytraces.txt(在d盘中新建mytraces.txt,建议输入这个命令时粘贴复制,否则容易出错)
从哪几方面入手解决ANR
- 首先分析log
- 从trace.txt文件查看调用stack.
- 看代码
- 仔细查看ANR的成因(iowait?block?memoryleak?)