【Android】如何快速定位ANR

ANR(Android not responding)是指安卓程序无响应,android系统对于一些事件如果没有及时处理,在指定时间内没有完成则会造成anr。

哪些场景会出现anr

1.BroadcastQueue  :BroadcastReceiver在10s<前台> / 60s<后台>内无法处理完成
2.Service         :Service在20s<前台> / 10s<后台>内无法处理完成
3.InputDispatcher :按键或触摸事件在5s内无响应
4.ContentProvider :Provier在10s无法完成

如何分析anr

<1> 定位anr的具体位置
log中搜索关键字 "ANR in" ,快速定位出现anr的应用,查看 "Reason"定位anr原因,分析 "CPU usage"信息,查看是否哪个进程占用cpu过高

11-26 16:36:15.831 E/ActivityManager( 2763): ANR in com.xxx.launcher3 (com.xxx.launcher3/.LauncherActivity)
11-26 16:36:15.831 E/ActivityManager( 2763): PID: 4116
11-26 16:36:15.831 E/ActivityManager( 2763): Reason: Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it.  Outbound queue length: 0.  Wait queue length: 1.)
11-26 16:36:15.831 E/ActivityManager( 2763): Load: 8.25 / 2.17 / 0.73
11-26 16:36:15.831 E/ActivityManager( 2763): CPU usage from 17920ms to 0ms ago (2018-01-01 00:00:14.692 to 2019-11-26 16:36:13.933):
11-26 16:36:15.831 E/ActivityManager( 2763):   25% 2763/system_server: 18% user + 6.7% kernel / faults: 6833 minor 22 major
11-26 16:36:15.831 E/ActivityManager( 2763):   5% 1592/media.codec: 4.1% user + 0.9% kernel / faults: 10644 minor 36 major
11-26 16:36:15.831 E/ActivityManager( 2763):   4.7% 1556/surfaceflinger: 2.7% user + 1.9% kernel / faults: 392 minor
11-26 16:36:15.831 E/ActivityManager( 2763):   2.3% 1570/zygote: 0.6% user + 1.7% kernel / faults: 9274 minor
11-26 16:36:15.831 E/ActivityManager( 2763):   3.4% 901/mmcqd/0: 0% user + 3.4% kernel
11-26 16:36:15.831 E/ActivityManager( 2763):   3.2% 1007/HI_VPSS_Process: 0% user + 3.2% kernel
11-26 16:36:15.831 E/ActivityManager( 2763):   3.2% 1572/dtvserver: 1.1% user + 2% kernel / faults: 13 minor
11-26 16:36:15.831 E/ActivityManager( 2763):   1.8% 1561/tvserver: 0.8% user + 0.9% kernel / faults: 6 minor
11-26 16:36:15.831 E/ActivityManager( 2763):   1.3% 1552/logd: 0.5% user + 0.7% kernel / faults: 272 minor
11-26 16:36:15.831 E/ActivityManager( 2763):   0.8% 1553/lmkd: 0.3% user + 0.5% kernel
11-26 16:36:15.831 E/ActivityManager( 2763):   0.9% 1565/sharpservice: 0.5% user + 0.4% kernel / faults: 275 minor
11-26 16:36:15.831 E/ActivityManager( 2763):   0.5% 1941/main_thread: 0% user + 0.5% kernel
11-26 16:36:15.831 E/ActivityManager( 2763):   0.4% 1573/netd: 0% user + 0.4% kernel / faults: 1406 minor

<2> 分析trace文件
系统在出现anr时,会向文件data/trace/trace.txt写入关键信息,如上述步骤一种app:com.xxx.launcher3所示,trace.txt中会记录该app的相关信息:
查询关键字“com.xxx.launcher3” ,均是关于GC的相关信息,并且tid<线程>总计43个,其中13个在waiting,内存吃不消不断的gc,占用率都在99%,free memery只有5m,经过这样分析,结合app开发,发现app的图片框架和网络框架的线程池初始化是根据4核配置,但是平台是双核,需要进行缩减,优化后出现anr的概率大大下降。

----- pid 4116 at 2019-11-26 16:37:00 -----
Cmd line: com.xxx.launcher3
Build fingerprint: 'XXXX/lcd_xxeos5a/lcd_xxeos5a:7.0/NRD90M/1.02190906:user/release-keys'
ABI: 'arm'
Build type: optimized
Zygote loaded classes=4368 post zygote classes=1240
Intern table: 43259 strong; 314 weak
JNI: CheckJNI is off; globals=536 (plus 431 weak)
Libraries: /system/lib/libandroid.so /system/lib/libcompiler_rt.so /system/lib/libjavacrypto.so /system/lib/libjnigraphics.so /system/lib/libmedia_jni.so /system/lib/libmesalink-jni.so /system/lib/libwebviewchromium_loader.so libjavacore.so libopenjdk.so (9)
Heap: 26% free, 14MB/20MB; 70404 objects
Dumping cumulative Gc timings
Start Dumping histograms for 4 iterations for partial concurrent mark sweep
ProcessMarkStack:   Sum: 51.761ms 99% C.I. 0.002ms-17.868ms Avg: 4.313ms Max: 17.924ms
UpdateAndMarkImageModUnionTable:    Sum: 28.834ms 99% C.I. 0.896us-6290us Avg: 554.500us Max: 7155us
UpdateAndMarkZygoteModUnionTable:   Sum: 16.878ms 99% C.I. 1.588ms-6.878ms Avg: 4.219ms Max: 6.878ms
...
...
...
ScanGrayImageSpaceObjects:  Sum: 797us 99% C.I. 0.254us-457us Avg: 15.326us Max: 555us
MarkAllocStackAsLive:   Sum: 750us 99% C.I. 60us-330us Avg: 187.500us Max: 330us
SweepSystemWeaks:   Sum: 688us 99% C.I. 132us-196us Avg: 172us Max: 196us
ImageModUnionClearCards:    Sum: 513us 99% C.I. 0.252us-73.999us Avg: 4.932us Max: 91us
...
...
...
(Paused)ScanGrayZygoteSpaceObjects: Sum: 46us 99% C.I. 11us-13us Avg: 11.500us Max: 13us
SwapBitmaps:    Sum: 37us 99% C.I. 7us-11us Avg: 9.250us Max: 11us
ForwardSoftReferences:  Sum: 31us 99% C.I. 3us-20us Avg: 7.750us Max: 20us
...
...
...
Done Dumping histograms
sticky concurrent mark sweep paused:    Sum: 6.790ms 99% C.I. 1.076ms-2.261ms Avg: 1.697ms Max: 2.261ms
sticky concurrent mark sweep total time: 754.673ms mean time: 188.668ms
sticky concurrent mark sweep freed: 59119 objects with total size 5MB
sticky concurrent mark sweep throughput: 78407.2/s / 7MB/s
Total time spent in GC: 911.002ms
Mean GC size throughput: 5MB/s
Mean GC object throughput: 104879 objects/s
Total number of allocations 165949
Total bytes allocated 20MB
Total bytes freed 5MB
Free memory 5MB
Free memory until GC 5MB
Free memory until OOME 241MB
Total memory 20MB
Max memory 256MB

suspend all histogram:  Sum: 1.391ms 99% C.I. 6us-760.959us Avg: 86.937us Max: 814us
DALVIK THREADS (41):
"Signal Catcher" daemon prio=5 tid=3 Runnable
...
...
...
"Jit thread pool worker thread 0" prio=5 tid=2 Native (still starting up)
...
...
...
"Okio Watchdog" daemon prio=5 tid=43 TimedWaiting
----- end 4116 -----

如何避免ANR
1.合理使用 UI 主线程,耗时操作放入其他线程工作;
2.合理使用 Handler 异步消息处理机制来处理其他线程请求。
3.合理使用并遵循 Android 生命周期, 避免在 onCreate() and onResume()做过多的事情;
4.使用一些架构形成规范来避免内存等问题,例如:MVP、RxJava;
5.经常使用工具来检查内存问题,例如:MAT、TraceView、AS 自带等工具;
6.避免加载大图片引起内存不足导致 ANR;
7.避免内存泄露;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容