相信大部分Android 开发人员都遇到过ANR问题,本文根据一些实际的开发经历介绍一下如何解决和避免ANR问题。
一,何为ANR
ANR是“Application Not Responding”的缩写,即“应用程序无响应”。在Android中,ActivityManagerService(简称AMS)和WindowManagerService
(简称WMS)会监测应用程序的响应时间,如果应用程序主线程(即UI线程)在超时时间内对输入事件没有处理完毕,或者对特定操作没有执行完毕,就会出现ANR。对于输入事件没有处理完毕产生的ANR,Android会显示一个对话框,提示用户当前应用程序没有响应,用户可以选择继续等待或者关闭这个应用程序(也就是杀掉这个应用程序的进程)。
产生ANR的原因:
由于广播接收器和Service都是无界面的,在上述三种ANR事件中只有1有界面提示,其他两种只输出日志。三种ANR均会输出log日志,同时还会将各个应用程序进程的函数堆栈输出到/data/data/anr/trace.txt中,这个文件是分析ANR原因的关键文件。
二,如何分析ANR
在Android测试工具Monkey博文中介绍了通过Monkey工具可以发现一些潜在的ANR风险,这里将介绍一旦出现ANR异常如何来分析。log和trace.txt就是两个利器。老规矩,还是先贴个例子上来分析。
log 信息分析:
:Sending Flip keyboardOpen=true
:Sending Touch (ACTION_DOWN): 0:(24.0,570.0)
//[calendar_time:2014-08-16 12:44:38.403 system_uptime:263794]
// Sending event #3300
:Sending Touch (ACTION_UP): 0:(51.368206,570.24054)
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.hybroad.launcher/.activity.PreLauncherActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.hybroad.launcher/.activity.PreLauncherActivity } in package com.hybroad.launcher
:Sending Touch (ACTION_DOWN): 0:(1101.0,1020.0)
:Sending Touch (ACTION_UP): 0:(1165.5239,1050.6898)
[ 183.601062] RTL871X: survey done event(2)
// Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=android/com.android.internal.app.ResolverActivity } in package android
:Sending Touch (ACTION_DOWN): 0:(1672.0,963.0)
:Sending Touch (ACTION_UP): 0:(1607.745,971.0462)
// NOT RESPONDING: com.hybroad.launcher (pid 6012)
// com.hybroad.lanucher 出现了ANR,由SubMenuActivity里的操作导致的
ANR in com.hybroad.launcher (com.hybroad.launcher/.activity.SubMenuActivity)
// ANR 原因是keyDispatching 超时,UI线程超5秒未响应
Reason: keyDispatchingTimedOut
Load: 3.97 / 2.2 / 0.93
// 下面是CPU使用率,system_server 占用CPU过多,ago表示发生ANR之前的CPU使用情况。
//later 是ANR之后CPU使用情况
CPU usage from 6313ms to 101ms ago:
98% 1375/system_server: 52% user + 45% kernel / faults: 2239 minor
75% 1630/com.hybroad.phone_remote: 39% user + 35% kernel / faults: 131 minor
68% 2385/com.hybroad.airplay: 40% user + 28% kernel / faults: 17 minor
18% 1035/tvos: 9.3% user + 9.1% kernel
18% 6012/com.hybroad.launcher: 13% user + 5.3% kernel / faults: 3363 minor 5 major
5.6% 1019/surfaceflinger: 2% user + 3.5% kernel
2.5% 5657/mediaserver: 0.3% user + 2.2% kernel / faults: 18 minor
0.6% 1608/com.hybroad.inputmethod.remote: 0.6% user + 0% kernel / faults: 1 minor
0.6% 4772/com.android.commands.monkey: 0.3% user + 0.3% kernel / faults: 24 minor
0.3% 1029/livecap: 0% user + 0.3% kernel
0.3% 2255/RTW_CMD_THREAD: 0% user + 0.3% kernel
0.1% 5/kworker/u:0: 0% user + 0.1% kernel
0.1% 22/kworker/u:1: 0% user + 0.1% kernel
0.1% 420/cifs_mem_clear: 0.1% user + 0% kernel
0.1% 1812/mdnsd: 0% user + 0.1% kernel / faults: 1 minor
0% 2244/rel_supplicant: 0% user + 0% kernel / faults: 51 minor 3 major
49% TOTAL: 27% user + 21% kernel + 0% softirq
CPU usage from 681ms to 1214ms later:
67% 1375/system_server: 37% user + 30% kernel / faults: 23 minor
7.5% 1728/Binder_7: 5.6% user + 1.8% kernel
5.6% 1688/Binder_3: 3.7% user + 1.8% kernel
5.6% 1689/Binder_4: 1.8% user + 3.7% kernel
5.6% 1729/Binder_8: 3.7% user + 1.8% kernel
5.6% 1899/Binder_A: 3.7% user + 1.8% kernel
3.7% 1375/system_server: 1.8% user + 1.8% kernel
3.7% 1386/Binder_1: 3.7% user + 0% kernel
3.7% 1387/Binder_2: 1.8% user + 1.8% kernel
3.7% 1397/ActivityManager: 0% user + 3.7% kernel
3.7% 1714/Binder_5: 1.8% user + 1.8% kernel
3.7% 1715/Binder_6: 3.7% user + 0% kernel
3.7% 1730/Binder_9: 1.8% user + 1.8% kernel
3.7% 1900/Binder_B: 3.7% user + 0% kernel
33% 1630/com.hybroad.phone_remote: 24% user + 9.4% kernel / faults: 1 minor
30% 1813/Timer-0: 22% user + 7.5% kernel
16% 1035/tvos: 3.7% user + 13% kernel
3.7% 1369/1035keypad Inpu: 1.8% user + 1.8% kernel
3.7% 1414/HDMITx_Task: 3.7% user + 0% kernel
3.7% 1700/Mdebug Monitor: 0% user + 3.7% kernel
1.8% 1406/Picture Monitor: 0% user + 1.8% kernel
1.8% 1698/Internal_MHLthr: 0% user + 1.8% kernel
3.7% 1019/surfaceflinger: 0% user + 3.7% kernel
3.7% 1186/SurfaceFlinger: 0% user + 3.7% kernel
3.7% 2385/com.hybroad.airplay: 3.7% user + 0% kernel
3.7% 2402/Timer-0: 3.7% user + 0% kernel
33% TOTAL: 17% user + 15% kernel
procrank:
PID Vss Rss Pss Uss cmdline
1375 70196K 69848K 47811K 44824K system_server
1515 66980K 64488K 43472K 40784K com.android.systemui
6012 55568K 43604K 23783K 21476K com.hybroad.launcher
1035 56792K 18508K 17888K 17580K /applications/bin/tvos
1630 31496K 31412K 13415K 12060K com.hybroad.phone_remote
1020 37196K 37072K 10593K 5184K zygote
5511 39404K 28252K 9760K 7964K com.android.systemui:screenshot
4772 22584K 22556K 9660K 6436K com.android.commands.monkey
1954 24868K 24780K 6770K 5188K com.miui.mihome2
1921 23480K 23388K 6647K 5312K com.miui.mihome.lockscreen
5657 10796K 10792K 6327K 5164K /system/bin/mediaserver
1532 22468K 22380K 5764K 4708K android.process.media
1660 24420K 24344K 5759K 4224K system:ui
1560 23100K 23004K 5574K 4172K com.miui.mihome2:download
1641 21048K 20948K 4481K 3524K com.jrm.servicecontainer
1608 20764K 20680K 4463K 3532K com.hybroad.inputmethod.remote
2385 18860K 18764K 3807K 3048K com.hybroad.airplay
1019 46628K 7604K 3380K 2328K /system/bin/surfaceflinger
1778 18440K 18348K 3262K 2504K com.hybroad.dlna
1574 18404K 18296K 3024K 2200K com.mstar.android.providers.tv
1794 17868K 17772K 2728K 1812K com.hybroad.phone_remote.daemon
1820 17444K 17344K 2621K 1868K org.opencv.engine:OpenCVEngineProcess
1652 17396K 17296K 2531K 1772K com.broadcom.bluetoothmonitor
1871 16808K 16712K 2434K 1708K com.android.settings
2035 16416K 16312K 2223K 1500K com.jrm.localmm
1018 2440K 2440K 2101K 2088K /system/bin/debuggerd
1905 16432K 16332K 2095K 1388K com.android.onetimeinitializer
2426 16104K 16004K 2064K 1356K com.mstar.tvsetting
1029 5072K 5072K 1818K 1260K /system/bin/livecap
1021 4372K 4372K 1490K 1024K /system/bin/drmserver
6274 1652K 1652K 1410K 1404K procrank
1028 1252K 1252K 975K 968K /system/bin/upnp_tv_receiver
2244 1892K 1892K 955K 832K rel_supplicant
1027 22020K 2180K 788K 316K /system/bin/virtualkeypad
1017 1612K 1612K 744K 644K /system/bin/netd
1015 1508K 1508K 679K 596K /system/bin/vold
1812 848K 848K 553K 544K /system/bin/mdnsd
1 536K 536K 450K 388K /init
1024 1228K 1228K 435K 360K /system/bin/keystore
2242 356K 356K 356K 356K /system/bin/busybox
1016 928K 928K 355K 316K /system/bin/resourcemanager
1031 716K 716K 226K 208K /system/bin/browserserver
2905 488K 488K 205K 128K sh
1036 476K 476K 197K 120K /system/bin/sh
2091 504K 504K 187K 176K /system/bin/dhcpcd
1023 456K 456K 162K 152K /system/bin/installd
674 220K 220K 154K 92K /sbin/ueventd
1037 168K 168K 148K 148K /sbin/adbd
6216 432K 428K 147K 132K /system/bin/dnssd
1014 348K 344K 109K 104K /system/bin/servicemanager
1026 348K 344K 105K 100K /system/bin/logwrapper
1034 332K 332K 94K 88K /system/bin/dnssd_daemon
------ ------ ------
267207K 226160K TOTAL
再看trace文件,只载录部分:
----- pid 6012 at 2014-08-16 12:44:43 -----
Cmd line: com.hybroad.launcher
//开头显示进程号、ANR发生的时间点和进程名称
JNI: CheckJNI is off; workarounds are off; pins=0; globals=159
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
//依次是:线程名、线程优先级、线程创建时的序号线程当前状态
"main" prio=5 tid=1 SUSPENDED
// 线程名:main 优先级5 创建序号 1 线程状态:SUSPENDED
| sysTid=6012 nice=0 sched=0/0 cgrp=apps handle=1074671612
| state=S schedstat=( 2402929933 1242053208 8116 ) utm=191 stm=48 core=1
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:~1585)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1045)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5522)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:773)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
at dalvik.system.NativeStart.main(Native Method)
"PriorityExecutor #5" prio=5 tid=15 WAIT
| group="main" sCount=1 dsCount=0 obj=0x4214d3d8 self=0x52301318
| sysTid=6041 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1378883432
| state=S schedstat=( 341597 4190770 3 ) utm=0 stm=0 core=0
at java.lang.Object.wait(Native Method)
- waiting on <0x4214d550> (a java.lang.VMThread) held by tid=15 (PriorityExecutor #5)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
at com.lidroid.xutils.task.PriorityObjectBlockingQueue.take(PriorityObjectBlockingQueue.java:274)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
"PriorityExecutor #4" prio=5 tid=14 WAIT
| group="main" sCount=1 dsCount=0 obj=0x4214c958 self=0x5272d980
| sysTid=6040 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1383259600
| state=S schedstat=( 16335142 37377692 95 ) utm=1 stm=0 core=0
at java.lang.Object.wait(Native Method)
- waiting on <0x4214ca98> (a java.lang.VMThread) held by tid=14 (PriorityExecutor #4)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
at com.lidroid.xutils.task.PriorityObjectBlockingQueue.take(PriorityObjectBlockingQueue.java:274)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
"PriorityExecutor #3" prio=5 tid=13 WAIT
| group="main" sCount=1 dsCount=0 obj=0x4214be90 self=0x5272e6a8
| sysTid=6039 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1383257392
| state=S schedstat=( 1407948 916560 16 ) utm=0 stm=0 core=0
at java.lang.Object.wait(Native Method)
- waiting on <0x4214c140> (a java.lang.VMThread) held by tid=13 (PriorityExecutor #3)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
at com.lidroid.xutils.task.PriorityObjectBlockingQueue.take(PriorityObjectBlockingQueue.java:274)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
"PriorityExecutor #2" prio=5 tid=12 WAIT
| group="main" sCount=1 dsCount=0 obj=0x42154638 self=0x5272cc90
| sysTid=6038 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1383256288
| state=S schedstat=( 20251581 51870492 151 ) utm=1 stm=0 core=0
at java.lang.Object.wait(Native Method)
- waiting on <0x421547d0> (a java.lang.VMThread) held by tid=12 (PriorityExecutor #2)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
at com.lidroid.xutils.task.PriorityObjectBlockingQueue.take(PriorityObjectBlockingQueue.java:274)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
"PriorityExecutor #1" prio=5 tid=11 WAIT
| group="main" sCount=1 dsCount=0 obj=0x42154370 self=0x52730630
| sysTid=6037 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1103892024
| state=S schedstat=( 2237642 16217040 18 ) utm=0 stm=0 core=0
at java.lang.Object.wait(Native Method)
- waiting on <0x42154530> (a java.lang.VMThread) held by tid=11 (PriorityExecutor #1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
at com.lidroid.xutils.task.PriorityObjectBlockingQueue.take(PriorityObjectBlockingQueue.java:274)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
"Binder_2" prio=5 tid=10 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x421416c0 self=0x41c1e638
| sysTid=6024 nice=0 sched=0/0 cgrp=apps handle=1103225840
| state=S schedstat=( 2307968 2046145 22 ) utm=0 stm=0 core=0
#00 pc 0001b320 /system/lib/libc.so (__ioctl+8)
#01 pc 0002b9ab /system/lib/libc.so (ioctl+14)
#02 pc 0001b539 /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+140)
#03 pc 0001bcd7 /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+154)
#04 pc 0001fae9 /system/lib/libbinder.so
#05 pc 00011a8d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
#06 pc 0004bd21 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
#07 pc 00011581 /system/lib/libutils.so
#08 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#09 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
"Binder_1" prio=5 tid=9 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x421409b8 self=0x41c1db88
| sysTid=6023 nice=0 sched=0/0 cgrp=apps handle=1103223104
| state=S schedstat=( 3963651 6845165 24 ) utm=0 stm=0 core=2
#00 pc 0001b320 /system/lib/libc.so (__ioctl+8)
#01 pc 0002b9ab /system/lib/libc.so (ioctl+14)
#02 pc 0001b539 /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+140)
#03 pc 0001bcd7 /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+154)
#04 pc 0001fae9 /system/lib/libbinder.so
#05 pc 00011a8d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
#06 pc 0004bd21 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
#07 pc 00011581 /system/lib/libutils.so
#08 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#09 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
"FinalizerWatchdogDaemon" daemon prio=5 tid=8 WAIT
| group="system" sCount=1 dsCount=0 obj=0x4213d7e8 self=0x41c1d0a0
| sysTid=6022 nice=0 sched=0/0 cgrp=apps handle=1103222000
| state=S schedstat=( 169252 273121 4 ) utm=0 stm=0 core=2
at java.lang.Object.wait(Native Method)
- waiting on <0x41ea2830> (a java.lang.Daemons$FinalizerWatchdogDaemon)
at java.lang.Object.wait(Object.java:364)
at java.lang.Daemons$FinalizerWatchdogDaemon.waitForObject(Daemons.java:230)
at java.lang.Daemons$FinalizerWatchdogDaemon.run(Daemons.java:207)
at java.lang.Thread.run(Thread.java:841)
"FinalizerDaemon" daemon prio=5 tid=7 WAIT
| group="system" sCount=1 dsCount=0 obj=0x4213d638 self=0x59cd1148
| sysTid=6021 nice=0 sched=0/0 cgrp=apps handle=1506612632
| state=S schedstat=( 19178147 5530289 45 ) utm=1 stm=0 core=3
at java.lang.Object.wait(Native Method)
- waiting on <0x41e8b568> (a java.lang.ref.ReferenceQueue)
at java.lang.Object.wait(Object.java:401)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
at java.lang.Thread.run(Thread.java:841)
"ReferenceQueueDaemon" daemon prio=5 tid=6 WAIT
| group="system" sCount=1 dsCount=0 obj=0x4213d4d0 self=0x59cd08a8
| sysTid=6020 nice=0 sched=0/0 cgrp=apps handle=1506610424
| state=S schedstat=( 2228290 3801987 33 ) utm=0 stm=0 core=2
at java.lang.Object.wait(Native Method)
- waiting on <0x41e8b490>
at java.lang.Object.wait(Object.java:364)
at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:130)
at java.lang.Thread.run(Thread.java:841)
"Compiler" daemon prio=5 tid=5 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4213d3e0 self=0x59cd0250
| sysTid=6019 nice=0 sched=0/0 cgrp=apps handle=1506607112
| state=S schedstat=( 365619316 81085896 3099 ) utm=17 stm=18 core=1
#00 pc 0001c5f0 /system/lib/libc.so (__futex_syscall3+8)
#01 pc 0000e6a8 /system/lib/libc.so (__pthread_cond_timedwait_relative+48)
#02 pc 0000e708 /system/lib/libc.so (__pthread_cond_timedwait+64)
#03 pc 0007307b /system/lib/libdvm.so
#04 pc 0005440d /system/lib/libdvm.so
#05 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#06 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
"JDWP" daemon prio=5 tid=4 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4213d2f8 self=0x59298370
| sysTid=6018 nice=0 sched=0/0 cgrp=apps handle=1495892264
| state=S schedstat=( 526723 2311140 11 ) utm=0 stm=0 core=2
#00 pc 0001c0c4 /system/lib/libc.so (recvmsg+8)
#01 pc 00060a5b /system/lib/libdvm.so
#02 pc 00060c8f /system/lib/libdvm.so
#03 pc 0006395f /system/lib/libdvm.so
#04 pc 0005440d /system/lib/libdvm.so
#05 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#06 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
"Signal Catcher" daemon prio=5 tid=3 RUNNABLE
| group="system" sCount=0 dsCount=0 obj=0x4213d200 self=0x59297ad0
| sysTid=6017 nice=0 sched=0/0 cgrp=apps handle=1495890056
| state=R schedstat=( 17944062 3806465 24 ) utm=1 stm=0 core=2
at dalvik.system.NativeStart.run(Native Method)
"GC" daemon prio=5 tid=2 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4213d120 self=0x59297230
| sysTid=6016 nice=0 sched=0/0 cgrp=apps handle=1495887848
| state=S schedstat=( 46052188 14643875 115 ) utm=3 stm=0 core=0
#00 pc 0001c5f0 /system/lib/libc.so (__futex_syscall3+8)
#01 pc 0000e6a8 /system/lib/libc.so (__pthread_cond_timedwait_relative+48)
#02 pc 0000e708 /system/lib/libc.so (__pthread_cond_timedwait+64)
#03 pc 00071d5f /system/lib/libdvm.so
#04 pc 0005440d /system/lib/libdvm.so
#05 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#06 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
NATIVE THREADS:
"ybroad.launcher" sysTid=6044 nice=0 sched=0/0 cgrp=apps
| state=S schedstat=( 28535 0 1 ) utm=0 stm=0 core=2
"ybroad.launcher" sysTid=6045 nice=0 sched=0/0 cgrp=apps
| state=S schedstat=( 5934826 18041494 192 ) utm=0 stm=0 core=0
"ybroad.launcher" sysTid=6047 nice=0 sched=0/0 cgrp=apps
| state=S schedstat=( 41991903 31647623 449 ) utm=0 stm=3 core=0
"ybroad.launcher" sysTid=6048 nice=0 sched=0/0 cgrp=apps
| state=S schedstat=( 8821631 43405553 239 ) utm=0 stm=0 core=1
----- end 6012 -----
----- pid 1375 at 2014-08-16 12:44:43 -----
Cmd line: system_server
JNI: CheckJNI is off; workarounds are off; pins=3; globals=593 (plus 30 weak)
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x41e9a578 self=0x41d10778
| sysTid=1375 nice=0 sched=0/0 cgrp=apps handle=1074671612
| state=S schedstat=( 23099158711 5734754939 194687 ) utm=1476 stm=833 core=0
#00 pc 0001b320 /system/lib/libc.so (__ioctl+8)
#01 pc 0002b9ab /system/lib/libc.so (ioctl+14)
#02 pc 0001b539 /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+140)
#03 pc 0001bcd7 /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+154)
#04 pc 000013c3 /system/lib/libsystem_server.so (system_init+378)
#05 pc 0001dc4c /system/lib/libdvm.so (dvmPlatformInvoke+112)
#06 pc 0004df2f /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
#07 pc 00027060 /system/lib/libdvm.so
#08 pc 0002b64c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#09 pc 0006023f /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+350)
#10 pc 00067e3f /system/lib/libdvm.so
#11 pc 00027060 /system/lib/libdvm.so
#12 pc 0002b64c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#13 pc 0005ff81 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+292)
#14 pc 00049bc7 /system/lib/libdvm.so
#15 pc 0004bd87 /system/lib/libandroid_runtime.so
#16 pc 0004ca17 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+378)
#17 pc 0000105b /system/bin/app_process
#18 pc 0000db4f /system/lib/libc.so (__libc_init+50)
#19 pc 00000d7c /system/bin/app_process
at com.android.server.SystemServer.init1(Native Method)
at com.android.server.SystemServer.main(SystemServer.java:1183)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:773)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
at dalvik.system.NativeStart.main(Native Method)
"AsyncTask #2" prio=5 tid=89 WAIT
| group="main" sCount=1 dsCount=0 obj=0x423a6b98 self=0x59771d08
| sysTid=2391 nice=0 sched=0/0 cgrp=apps handle=1500973936
| state=S schedstat=( 3672799 2067535 16 ) utm=0 stm=0 core=3
at java.lang.Object.wait(Native Method)
- waiting on <0x421a1be8> (a java.lang.VMThread) held by tid=89 (AsyncTask #2)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
"WifiMonitor" prio=5 tid=88 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x42334b20 self=0x59767270
| sysTid=2262 nice=0 sched=0/0 cgrp=apps handle=1496667712
| state=S schedstat=( 2650153 18957633 18 ) utm=0 stm=0 core=2
#00 pc 0001c4b0 /system/lib/libc.so (poll+12)
#01 pc 00005ccb /system/lib/libhardware_legacy.so (wifi_ctrl_recv+66)
#02 pc 00005d85 /system/lib/libhardware_legacy.so (wifi_wait_on_socket+44)
#03 pc 0006bd8f /system/lib/libandroid_runtime.so
#04 pc 0001dc4c /system/lib/libdvm.so (dvmPlatformInvoke+112)
#05 pc 0004df2f /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
#06 pc 00027060 /system/lib/libdvm.so
#07 pc 0002b64c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#08 pc 0005ff81 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+292)
#09 pc 0005ffab /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
#10 pc 00054d2b /system/lib/libdvm.so
#11 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#12 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at android.net.wifi.WifiNative.waitForEvent(Native Method)
at android.net.wifi.WifiNative.waitForEvent(WifiNative.java:101)
at android.net.wifi.WifiMonitor$MonitorThread.run(WifiMonitor.java:428)
"WifiMonitor" prio=5 tid=79 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x423b1ab8 self=0x59766e20
| sysTid=2243 nice=0 sched=0/0 cgrp=apps handle=1500579736
| state=S schedstat=( 18832173 27053387 77 ) utm=0 stm=1 core=1
#00 pc 0001c4b0 /system/lib/libc.so (poll+12)
#01 pc 00005ccb /system/lib/libhardware_legacy.so (wifi_ctrl_recv+66)
#02 pc 00005d85 /system/lib/libhardware_legacy.so (wifi_wait_on_socket+44)
#03 pc 0006bd8f /system/lib/libandroid_runtime.so
#04 pc 0001dc4c /system/lib/libdvm.so (dvmPlatformInvoke+112)
#05 pc 0004df2f /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
#06 pc 00027060 /system/lib/libdvm.so
#07 pc 0002b64c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#08 pc 0005ff81 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+292)
#09 pc 0005ffab /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
#10 pc 00054d2b /system/lib/libdvm.so
#11 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#12 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at android.net.wifi.WifiNative.waitForEvent(Native Method)
at android.net.wifi.WifiNative.waitForEvent(WifiNative.java:101)
at android.net.wifi.WifiMonitor$MonitorThread.run(WifiMonitor.java:428)
"Binder_C" prio=5 tid=87 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x423125c0 self=0x5977ef58
| sysTid=1901 nice=0 sched=0/0 cgrp=apps handle=1496648368
| state=S schedstat=( 26136515152 5573609667 186413 ) utm=1517 stm=1096 core=3
#00 pc 0001c5f4 /system/lib/libc.so (__futex_syscall3+12)
#01 pc 0000e6a8 /system/lib/libc.so (__pthread_cond_timedwait_relative+48)
#02 pc 00020771 /system/lib/libinput.so
#03 pc 00022019 /system/lib/libinput.so (android::InputDispatcher::injectInputEvent(android::InputEvent const*, int, int, int, int, unsigned int)+800)
#04 pc 0000a9ff /system/lib/libandroid_servers.so
#05 pc 0001dc4c /system/lib/libdvm.so (dvmPlatformInvoke+112)
#06 pc 0004df2f /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
#07 pc 00027060 /system/lib/libdvm.so
#08 pc 0002b64c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#09 pc 0005ff81 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+292)
#10 pc 0004cc91 /system/lib/libdvm.so
#11 pc 0006b213 /system/lib/libandroid_runtime.so
#12 pc 0006f82f /system/lib/libandroid_runtime.so
#13 pc 00017f1d /system/lib/libbinder.so (android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+60)
#14 pc 0001b8e5 /system/lib/libbinder.so (android::IPCThreadState::executeCommand(int)+508)
#15 pc 0001bcf3 /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+182)
#16 pc 0001fae9 /system/lib/libbinder.so
#17 pc 00011a8d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
#18 pc 0004bd21 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
#19 pc 00011581 /system/lib/libutils.so
#20 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#21 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at com.android.server.input.InputManagerService.nativeInjectInputEvent(Native Method)
at com.android.server.input.InputManagerService.injectInputEvent(InputManagerService.java:534)
at android.hardware.input.IInputManager$Stub.onTransact(IInputManager.java:170)
at android.os.Binder.execTransact(Binder.java:388)
at dalvik.system.NativeStart.run(Native Method)
"Binder_B" prio=5 tid=86 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x4236ee80 self=0x5978c908
| sysTid=1900 nice=0 sched=0/0 cgrp=apps handle=1501033856
| state=S schedstat=( 18675932575 2816663578 195259 ) utm=1086 stm=781 core=0
#00 pc 0001b320 /system/lib/libc.so (__ioctl+8)
#01 pc 0002b9ab /system/lib/libc.so (ioctl+14)
#02 pc 0001b539 /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+140)
#03 pc 0001bcd7 /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+154)
#04 pc 0001fae9 /system/lib/libbinder.so
#05 pc 00011a8d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
#06 pc 0004bd21 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
#07 pc 00011581 /system/lib/libutils.so
#08 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#09 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
"Binder_A" prio=5 tid=82 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x422c66e0 self=0x59288458
| sysTid=1899 nice=0 sched=0/0 cgrp=apps handle=1473754056
| state=S schedstat=( 28407006674 1139065291 197317 ) utm=1753 stm=1086 core=3
#00 pc 0001b320 /system/lib/libc.so (__ioctl+8)
#01 pc 0002b9ab /system/lib/libc.so (ioctl+14)
#02 pc 0001b539 /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+140)
#03 pc 0001bcd7 /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+154)
#04 pc 0001fae9 /system/lib/libbinder.so
#05 pc 00011a8d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
#06 pc 0004bd21 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
#07 pc 00011581 /system/lib/libutils.so
#08 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#09 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
"pool-1-thread-1" prio=5 tid=85 WAIT
| group="main" sCount=1 dsCount=0 obj=0x42360de0 self=0x5977c7c8
| sysTid=1869 nice=0 sched=0/0 cgrp=apps handle=1501023256
| state=S schedstat=( 36792546 37524468 105 ) utm=2 stm=1 core=1
at java.lang.Object.wait(Native Method)
- waiting on <0x422ad870> (a java.lang.VMThread) held by tid=85 (pool-1-thread-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
"SoundPoolThread" prio=5 tid=84 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x4234dd18 self=0x59288008
| sysTid=1787 nice=0 sched=0/0 cgrp=apps handle=1501052992
| state=S schedstat=( 2719918 1463037 21 ) utm=0 stm=0 core=1
#00 pc 0001c5f0 /system/lib/libc.so (__futex_syscall3+8)
#01 pc 0000e6a8 /system/lib/libc.so (__pthread_cond_timedwait_relative+48)
#02 pc 0000e708 /system/lib/libc.so (__pthread_cond_timedwait+64)
#03 pc 000697e9 /system/lib/libmedia.so
#04 pc 0006983b /system/lib/libmedia.so (android::SoundPoolThread::read()+16)
#05 pc 000699e7 /system/lib/libmedia.so (android::SoundPoolThread::run()+14)
#06 pc 0004bd21 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
#07 pc 00011581 /system/lib/libutils.so
#08 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#09 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
"SoundPool" prio=5 tid=83 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x422b7470 self=0x5977fdc8
| sysTid=1785 nice=0 sched=0/0 cgrp=apps handle=1501039224
| state=S schedstat=( 43918396 52908113 631 ) utm=0 stm=4 core=1
#00 pc 0001c5f0 /system/lib/libc.so (__futex_syscall3+8)
#01 pc 0000e6a8 /system/lib/libc.so (__pthread_cond_timedwait_relative+48)
#02 pc 0000e708 /system/lib/libc.so (__pthread_cond_timedwait+64)
#03 pc 0006937f /system/lib/libmedia.so (android::SoundPool::run()+20)
#04 pc 0004bd21 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68)
#05 pc 00011581 /system/lib/libutils.so
#06 pc 0000ca58 /system/lib/libc.so (__thread_entry+72)
#07 pc 0000cbd4 /system/lib/libc.so (pthread_create+208)
at dalvik.system.NativeStart.run(Native Method)
参考frameworks\base\services\java\com\android\server\am\ActivityManagerService.java 中的appNotResponding函数的处理流程可以看出trace.txt 文件的生成过程,
在trace.txt 文件中一般第一进程为发生ANR的进程。分析上面的trace.txt中的第一个进程 com.hybroad.launcher
是产生ANR的进程,与Log日志也匹配,通过查看线程状态,可以看出ViewRoot刷新UI是阻塞了。trace日志中还能看出com.hybroad.launcher中多个异步任务都是在在WAIT状态,如PriorityExecutor #5" prio=5 tid=15 WAIT
,这些异步任务是从后台下载图片显示。这里巧合的是Monkey程序触发的操作逻辑导致UI刷新阻塞。
三、如何避免ANR
要想不出现ANR是很困难的,但也是有办法能避免的。在主线程中所做的任何耗时的操作都有可能造成ANR,因为这些耗时的操作会使得主线程没有机会处理用户输入事件或者广播事件。因此在主线程中执行的任何函数所做的工作都应该尽可能的少,特别是对于Activity的生命周期函数来说。网络和数据库操作,读写设备,以及诸如位图变换的一些耗时的操作,都应该放在子线程中完成。主线程不需要等待子线程的执行,主线程应该创建一个与其绑定的Handler对象,子线程执行完毕后通过 Handler通知主线程。