14. Android ANR分析

参考资料:http://hjxandhmr.github.io/2016/07/01/Android-ANRAnalysis/

ANR发生的条件

  1. 5s内没有响应用户输入事件
  2. 10s内广播接收器没有处理完毕
  3. 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文件夹)

14. Android ANR分析_第1张图片
Paste_Image.png

adb shell----su----cd data/anr----ls(如果有anr日志会有一个traces.txt文件)

Paste_Image.png
  • 怎样将traces.txt文件copy到指定位置?

adb pull /data/anr/traces.txt d:/mytraces.txt(在d盘中新建mytraces.txt,建议输入这个命令时粘贴复制,否则容易出错)

从哪几方面入手解决ANR

  • 首先分析log
  • 从trace.txt文件查看调用stack.
  • 看代码
  • 仔细查看ANR的成因(iowait?block?memoryleak?)

你可能感兴趣的:(14. Android ANR分析)