一、Android ANR概念
不论从事安卓应用开发,还是安卓系统研发,应该都遇到应用无响应(ANR,Application Not Responding)问题,
当应用程序一段时间无法及时响应,则会弹出ANR对话框,让用户选择继续等待,还是强制关闭。
二、常见的ANR 类型:
第一种:KeyDispatchTimeout:最常见的一种类型,原因是View事件或者触摸事件在特定时间内(5s)无法得到响应
第二种:BroadcastTimeout:BroadcastReceiver的onReceive函数运行在主线程,并在特定的时间内(10s)无法完成处理
第三种:ServiceTimeout:Service的各个生命周期函数在特定时间内(20s)无法完成响应
三、典型的ANR场景
1、主线程的频繁的IO操作,比如读写文件或者数据库。
2、硬件操作,比如调用相机或者录音功能。
3、多线程操作的死锁,导致主线程等待超时。(非主线程持有主线程需要的锁对象,导致主线程等待超时)
4、耗时动画/耗资源行为导致CPU负载过重。
5、service binder数量达到上限(这个不理解)。
四、Thread 状态
suspend 暂停的意思
获取trace文件:adb pull /data/anr/trace.txt
五、案例
案例 1:关键词:ContentResolver in AsyncTask onPostExecute, high iowait
Process:com.android.email
Activity:com.android.email/.activity.MessageView
Subject:keyDispatchingTimedOut
CPU usage from 2550ms to -2814ms ago:
5%187/system_server: 3.5% user + 1.4% kernel / faults: 86 minor 20major
4.4% 1134/com.android.email: 0.7% user + 3.7% kernel /faults: 38 minor 19 major
4% 372/com.android.eventstream: 0.7%user + 3.3% kernel / faults: 6 minor
1.1% 272/com.android.phone:0.9% user + 0.1% kernel / faults: 33 minor
0.9%252/com.android.systemui: 0.9% user + 0% kernel
0%409/com.android.eventstream.telephonyplugin: 0% user + 0% kernel /faults: 2 minor
0.1% 632/com.android.devicemonitor: 0.1% user + 0%kernel
100% TOTAL: 6.9% user + 8.2% kernel +84%iowait
-----pid 1134 at 2010-12-17 17:46:51 -----
Cmd line:com.android.email
DALVIK THREADS:
(mutexes: tll=0 tsl=0tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 WAIT
|group="main" sCount=1 dsCount=0 obj=0x2aaca180self=0xcf20
| sysTid=1134 nice=0 sched=0/0 cgrp=[fopen-error:2]handle=1876218976
at java.lang.Object.wait(Native Method)
-waiting on <0x2aaca218> (a java.lang.VMThread)
at