-
一:什么是
ANR
ANR:Application Not
Responding
,即应用无响应
二:
ANR
的类型
ANR
一般有三种类型:
1
:
KeyDispatchTimeout(5
seconds) --
主要类型
按键或触摸事件在特定时间内无响应
2
:
BroadcastTimeout(10
seconds)
BroadcastReceiver
p>
在特定时间内无法处理完成
3
:
ServiceTimeout(20 seconds)
--
小概率类型
Service
p>
在特定的时间内无法处理完成
三:
KeyDispatchTimeout
Akey or touch event was not dispatched
within the specified time
(按键或触摸事件在特定
时间内无响应)
具体的超时时间的定义在<
/p>
framework
下的
//How long we
wait until we timeout on key
dispatching.
staticfinal int
KEY_DISPATCHING_TIMEOUT = 5*1000
四:为什么会超时呢?
超时时间的计
数一般是从按键分发给
app
开始。超时的原因一般有两种
p>
:
(1)
当前的
事件没有机会得到处理(即
UI
线程正在处理前一个事件,没有
及时的完成或者
looper
被某种原因阻塞住了)
(2)
当前的事件正在处理,但没有及时完成<
/p>
五:如何避免
KeyDispatch
Timeout
1
:
UI
线程尽量只做跟
UI
相关
的工作
2
:耗时的工作(比如数据库
操作,
I/O
,连接网络或者别的有可能阻碍
< br>UI
线程的操作)把
它放入单独的线程处理
3
:尽量用
Handle
r
来处理
UIthread
和别的
p>
thread
之间的交互
六:
UI
线程
说了那么多的
UI
线程,那么哪些属于
UI
线程呢?
UI
线程主要包括如下:
Activity:onCreate(), onResume(),
onDestroy(), onKeyDown(), onClick(),etc
AsyncTask: onPreExecute(),
onProgressUpdate(), onPostExecute(),
onCancel,etc
Mainthread
handler: handleMessage(), post*(runnable r),
etc
other
七
:
如何去分析
ANR
先看个
LOG:
04-01 13:12:11.572
I/InputDispatcher( 220): Application is not
responding
:
Window{/cree
n
Activitypaused=false}.
5009.8ms since event, 5009.5ms since
waitstarted
04-0113:12:11.572 I/WindowManager(
220): Input event dispatching timedout sending
/creenActivity
04-01
13:12:14.123
I/Process(
220): Sending
signal. PID: 21404 SIG: 3---
发生
ANR
的时
间和生成
的时间
04-01 13:12:14.123
I/dalvikvm(21404):threadid=4: reacting to signal 3
……
04-0113:12:15.872 E/ActivityManager(
220): ANR in
(/.creenActivity)
04-0113:12:15.872 E/ActivityManager(
220):
Reason:keyDispatchingTimedOut
04-0113:12:15.872 E/ActivityManager(
220): Load: 8.68 / 8.37 /
8.53
04-0113:12:15.872
E/ActivityManager(
220):
CPUusage from 4361ms to
699ms
ago
----
CPU<
/p>
在
ANR
发生前的使用情况
04-0113:12:15.872
E/ActivityManager(
220):
5.5%21404/:
1.3%
user + 4.1% kernel / faults: 10
minor
04-0113:12:15.872
E/ActivityManager(
1.5% kernel /
faults: 11 minor 2 major
04-0113:12:15.872 E/ActivityManager(
kernel
04-0113:12:15.872 E/ActivityManager(
kernel
04-0113:12:15.872 E/ActivityManager(
user + 0% kernel
04-0113:12:15.872 E/ActivityManager(
87% iowait
04-0113:12:15.872 E/ActivityManager(
p>
ANR
后
CPU
的
使用量
04-0113:12:15.872
E/ActivityManager(
220):
4.3%220/system_server: 2.7%
user +
220):
0.9%52/spi_qsd.0: 0% user + 0.9%
220):
0.5%65/irq/170-cyttsp-: 0% user + 0.5%
220):
0.5%296/ui: 0.5%
220):
100%TOTAL: 4.8% user + 7.6% kernel +
220):
CPUusage from 3697ms to
4223ms later
:--
220):
25%21404/: 25%
user + 0% kernel / faults: 191
minor
04-0113:12:15.872
E/ActivityManager(
220):
16%
21603/__eas(: 16%
user + 0%
kernel
04-0113:12:15.872
E/ActivityManager(
220):
7.2% 21406/GC: 7.2% user + 0%
kernel
04-0113:12:15.872 E/ActivityManager(
220):
1.8%
21409/Compiler: 1.8% user + 0%
kernel
04-0113:12:15.872 E/ActivityManager(
220):
5.5%220/system_server: 0%
user +
5.5% kernel / faults: 1
minor
04-0113:12:15.872
E/ActivityManager(
220):
5.5% 263/InputDispatcher: 0% user +
5.5% kernel
04-0113:12:15.872 E/ActivityManager(
220):
32%TOTAL:
28% user + 3.7% kernel
从
LOG
可以看出
AN
R
的类型,
CPU
的使用情况,如果<
/p>
CPU
使用量接近
100%
,说明当前
设备很忙,有可能是
CPU
饥饿导致了
ANR
如果<
/p>
CPU
使用量很少,
说明主线程被
BLOCK
了
如果
IOwait
很高,说明
ANR
有可能是主线程在进行
I/O
操作造成的
p>
除了看
LOG
,
解决
ANR
还得需要
< br>文件,
如何获取呢?可以用如下命令获取
$$chmod 777 /data/anr
$$rm /data/anr/
$$ps
$$kill
-3
PID
adbpull
data/anr/ ./
从
文件,看到最多的是如下的信息:
-----pid 21404 at
2011-04-01
13:12:14
-----
Cmdline:
DALVIK
THREADS:
(mutexes:
tll=0tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
NATIVE
|
group=
| sysTid=21404 nice=0
sched=0/0cgrp=[fopen-error:2]
handle=1876218976
PollOnce(Native Method)
(:119)
(:110
)
at (:3688)
at Native(Native
Method)
(:507)
Init$$(:866)
at (:624)
at (Native
Method)
说明主线程在等待下条消息进入消息队列
八:
Thread
状态
ThreadState (defined at
“
dalvik/vm/thread.h
“
)
THREAD_
UNDEFINED
= -1, /* makes enum compatible with int32_t
*/
THREAD_
ZOMBIE
=
0, /* TERMINATED */
THREAD
p>
_
RUNNING
= 1, /*
RUNNABLE or running now */
T
HREAD
_
TIMED_WAIT
= 2, /* TIMED_WAITING in () */
< br>THREAD
_
MONITOR
= 3, /* BLOCKED on a monitor */
THREAD
_
WAIT
=
4, /* WAITING in () */
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 */
-
-
-
-
-
-
-
-
-
上一篇:语言学复习试题及参考答案
下一篇:托福词汇大全