[转] ANR问题分析的一般套路
ANR(App Not Responding)基本上99%的App都有,即使是系统,也有system_anr,我相信虽然ANR问题这样的普遍,还是有很多人对ANR问题即熟悉又陌生的,ANR中log信息怎么看?发生的场景有哪些?广播会发生ANR吗?我的App啥事都没有干怎么发生了ANR了等等一些问题,今天通过三个案例总结一下ANR问题分析的一般套路,以做备忘。
一、ANR初步了解
1、发生原因
一句话总结:没有在规定的时间内,干完要干的事情,就会发生ANR。
2、ANR分类
从发生的场景分类:
- Input事件超过5s没有被处理完
- Service处理超时,前台20s,后台200s
- BroadcastReceiver处理超时,前台10S,后台60s
- ContentProvider执行超时,比较少见
从发生的原因分:
- 主线程有耗时操作,如有复杂的layout布局,IO操作等。
- 被Binder对端block
- 被子线程同步锁block
- Binder被占满导致主线程无法和SystemServer通信
- 得不到系统资源(CPU/RAM/IO)
从进程的角度分:
- 问题出在当前进程:
主线程本身耗时, 或则主线程的消息队列存在耗时操作;
主线程被本进程的其他子线程所blocked; - 问题出在远端进程(一般是binder call或socket等通信方式)
二、ANR的Log解读
2.1、Log获取
发生了ANR问题,通常会抓一份bugreport
adb bugreprot xxx
最为重要的是,生成的bugreport有anr的trace,如果要单独拿出来也行
adb pull /data/anr/traces.txt xxx
一份完整的bugreport包含下面的信息,对分析ANR问题很关键
Log名称 | 作用 | 获取命令 |
---|---|---|
system.log | 包含ANR发生时间点信息、ANR发生前的CPU信息,还包含大量系统服务输出的信息 | adb logcat –b system |
main.log | 包含ANR发生前应用自身输出的信息,可供分析应用是否有异常;此外还包含输出的GC信息,可供分析内存回收的速度,判断系统是否处于低内存或内存碎片化状态 | adb logcat –b main |
event.log | 包含AMS与WMS输出的应用程序声明周期信息,可供分析窗口创建速度以及焦点转换情况 | adb logcat –b event |
kernel.log | 包含kernel打出的信息,LowMemoryKiller杀进程、内存碎片化或内存不足,mmc驱动异常都可以在这里找到。 | 无 |
那么这些Log怎么看呢?看下面案例一
2.1、案例一:sp耗时问题导致应用ANR
一般先搜索ANR in获取最直观的信息,如下:
06-16 16:16:28.590 1853 2073 E ActivityManager: ANR in com.android.camera (com.android.camera/.Camera)
06-16 16:16:28.590 1853 2073 E ActivityManager: PID: 27661
06-16 16:16:28.590 1853 2073 E ActivityManager: Reason: Input dispatching timed out (com.android.camera/com.android.camera.Camera, Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 24. Wait queue head age: 5511.1ms.)
06-16 16:16:28.590 1853 2073 E ActivityManager: Load: 16.25 / 29.48 / 38.33
06-16 16:16:28.590 1853 2073 E ActivityManager: CPU usage from 0ms to 8058ms later:
06-16 16:16:28.590 1853 2073 E ActivityManager: 58% 291/mediaserver: 51% user + 6.7% kernel / faults: 2457 minor 4 major
06-16 16:16:28.590 1853 2073 E ActivityManager: 27% 317/mm-qcamera-daemon: 21% user + 5.8% kernel / faults: 15965 minor
06-16 16:16:28.590 1853 2073 E ActivityManager: 0.4% 288/debuggerd: 0% user + 0.3% kernel / faults: 21615 minor 87 major
06-16 16:16:28.590 1853 2073 E ActivityManager: 17% 27661/com.android.camera: 10% user + 6.8% kernel / faults: 2412 minor 34 major
06-16 16:16:28.590 1853 2073 E ActivityManager: 16% 1853/system_server: 10% user + 6.4% kernel / faults: 1754 minor 87 major
06