Android ANR分析与总结



一、什么是ANR?

Android Not Response : 通常是UI线程做耗时操作会导致ANR。
      A  界面操作按钮的点击等待响应时间超过5秒
      B  HandleMessage回调函数执行超过10秒,BroadcasterReciver里的onRecive()方法处理超过10秒


二、导出日志

1. 导出log到文件中
adb logcat -d > /sdcard/logcat.txt

2. 导出ANR文件的命令
anr日志的存放目录:\data\anr\traces.txt
adb pull \data\anr\traces.txt ./traces.txt
导出到当前目录下



三、现象CPU耗尽导致ANR


CPU usage from 4834ms to -10002ms ago:
  127% 31817/co.lvdou.superuser: 112% user + 14% kernel / faults: 1980 minor 13 major
  9.7% 624/system_server: 6.1% user + 3.5% kernel / faults: 4082 minor 140 major
  ......
99% TOTAL: 69% user + 19% kernel + 10% iowait + 0.6% softirq

1. CPU在ANR前的使用情况
CPU usage from 4834ms to -10002ms ago:

2.
9.7% 624/system_server: 6.1% user + 3.5% kernel / faults: 4082 minor 140 major
624 进程ID
system_server 进程名
9.7% 是指?
faults: 4082 minor 140 major?

3. 最总CPU使用情况
99% TOTAL: 69% user + 19% kernel + 10% iowait + 0.6% softirq
CPU总使用99%,说明主线程被BLOCK了
用户使用占比 69%
IO等待占比10%,说明ANR有可能是主线程在进行I/O操作造成的
softirq 0.6% ?


没查到以下的:
CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量

四、 线程状态

Thread状态
ThreadState (defined at “dalvik/vm/thread.h “)
THREAD_UNDEFINED = -1, /* makes enum compatible with int32_t */
THREAD_ZOMBIE = 0, /* TERMINATED */
THREAD_RUNNING = 1, /* RUNNABLE or running now */
THREAD_TIMED_WAIT = 2, /* TIMED_WAITING in Object.wait() */
THREAD_MONITOR = 3, /* BLOCKED on a monitor */
THREAD_WAIT = 4, /* WAITING in Object.wait() */
THREAD_INITIALIZING= 5, /* allocated, not yet running */
THREAD_STARTING = 6, /* started, not yet on thread list */
THREAD_NATIVE = 7, /* off in a JNI native method */
THREAD_VMWAIT = 8, /* waiting on a VM resource */
THREAD_SUSPENDED = 9, /* suspended, usually by GC or debugger */

SUSPENDED 这种等待状态容易出现问题。


五、常见问题原因

1. 数据库操作I/O被阻塞
iowait、ContentResolver.query、onPostExecute

2. 在UI线程进行网络数据的读写

3. 内存不足导致block在创建bitmap上
atdalvik.system.VMRuntime.trackExternalAllocation(NativeMethod)
atandroid.graphics.Bitmap.createBitmap(Bitmap.java:468)

4. 程序异常退出,uncausedexception      (Fatal)

5. 程序强制关闭,ForceClosed (简称FC)       (Fatal)
      
6. 通过搜索ANR定位问题

* 其他 LOG中一些日志的解释
System server process 2094 has been created; 2094就是你需要的PID,进程创建LOG
Sending signal. PID: 2094 SIG: 3
Process(  220): Sending signal. PID:    21404 SIG: 3---发生ANR的时间和生成trace.txt的时间?
这里发了SIGQUIT ----向system server进程发quit信号,这里是“果”
信号3发给了进程号是2094的进程,



* 问题分类
1,程序异常退出,uncausedexception      (Fatal)
2,程序强制关闭,ForceClosed (简称FC)       (Fatal)
3,程序无响应,ApplicationNo Response(简称ANR)
    ANR出现的情况有以下两种
      A  界面操作按钮的点击等待响应时间超过5秒
      B  HandleMessage回调函数执行超过10秒,BroadcasterReciver里的onRecive()方法处理超过10秒
      
      
* 查找原因:
1,如果是ANR问题, 则搜索“ANR”关键词。
2,如果是uncausedexception或者ForceClosed,搜索"Fatal"关键词
3,定位到关键事件信息后, 如果信息不够明确的,再去搜索应用程序包的ANR文件信息,查看具体的进程和线程跟踪的日志,来定位到代码。 


六、资料

浅谈ANR及log分析ANR
http://blog.csdn.net/itachi85/article/details/6918761
Android中对Log日志文件的分析
http://blog.csdn.net/andy_android/article/details/6851828


你可能感兴趣的:(Android)