Android ANR
背景
当应用的UI线程阻塞过长时间,就会触发应用程序无响应(Application No Responding)。
触发条件
- 当应用的Activity处于前台,应用没有在5秒内响应一个输入事件(例如按键或者触摸屏幕)或者广播接收者。
- 当没有Activity处于前台,应用的广播接收者没有在相当长的时间内完成执行。
探测和诊断ANR
-
Android vitals
-
诊断ANR问题一些可能路径
-
主线程进行IO操作
-
主线程进行耗时计算
-
主线程同步等待另一个进程的绑定调用,而另一个进程需要长时间才能返回。
-
主线程阻塞等待另一个线程同步代码的操作
-
主线程和其他线程死锁了。
-
工作线程持有主线程必须的加锁的资源也会导致ANR
-
一些手段
-
启用严格模式StrictMode有助于发现偶然的主线程IO操作影响。
-
启用后台ANR对话框(开发者模式-启用所有的ANR).
-
使用Traceview工具获取应用运行时的跟踪信息,确定主线程繁重操作的地方。
-
ANR发生时会生成追踪文件,分析该文件中的信息有助于查找ANR产生的原因。老版本的OS:/data/anr/traces.txt,新版本的OS:/data/anr/trace_xxx.txt.通过adb导出该文件:
adb root adb shell ls /data/anr adb pull /data/anr/<filename>

网友评论