如何分析ANR

参考文章:http://blog.csdn.net/dadoneo/article/details/8270107
书籍:Andriod高阶进阶

一、什么是Anr:

application not responding 程序无响应。程序在规定的时间内没有响应。
超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:**

1.当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
2.当前的事件正在处理,但没有及时完成

二、Anr的主要原因

ANR一般有三种类型:

1:KeyDispatchTimeout(5 seconds) --主要类型
按键或触摸事件在特定时间内无法得到响应

2:BroadcastTimeout(10 seconds)
BroadcastReceiver在的onRecieve运行在主线程中,短时间内无法处理完成导致

3:ServiceTimeout(20 seconds) --小概率类型
Service的各个声明周期在特定时间内无法处理完成

Anr场景分析

1.使用命令导出anr日志

adb pull /data/anr/traces.txt  ~/Desktop/

**2.分析关键信息
以每行的重点内容没准,每行自带时间戳

Process:anr发生的时间和进程,和生成traces文件的时间
CPUusage ... ago :cpu在anr发生前的使用情况
CPUusage ...later: cpu在anr后的使用情况
ABI:         手机的cpu架构
HEAP:     堆的内存信息
ANR in: 包名,和类名
Reason:原因
TOTAL:总的CPU使用率
prio:线程的优先级
tid:线程锁id  主线程的id为1  主要看这个线程的
Sleeping:线程的状态
sCount:线程被挂起的次数
dsCount:线程是否被调试
04-01 13:12:11.572** I/InputDispatcher( 220): Application is not responding**:Window{2b263310com.[Android](http://lib.csdn.net/base/android).email/com.android.email.activity.SplitScreenActivitypaused=false}.  5009.8ms since event, 5009.5ms since waitstarted
04-0113:12:11.572 I/WindowManager( 220): Input event dispatching timedout sending tocom.android.email/com.android.email.activity.SplitScreenActivity
04-01 **13:12:14.123 I/Process(  220): Sending signal. PID: 21404 SIG: 3---****发生**ANR**的时间和生成**trace.txt**的时间**
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 com.android.email(com.android.email/.activity.SplitScreenActivity)
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在ANR发生前的使用情况

04-0113:12:15.872 E/ActivityManager(  220):   5.5%21404/com.android.email: 1.3% user + 4.1% kernel / faults: 10 minor
04-0113:12:15.872 E/ActivityManager(  220):   4.3%220/system_server: 2.7% user + 1.5% kernel / faults: 11 minor 2 major
04-0113:12:15.872 E/ActivityManager(  220):   0.9%52/spi_qsd.0: 0% user + 0.9% kernel
04-0113:12:15.872 E/ActivityManager(  220):   0.5%65/irq/170-cyttsp-: 0% user + 0.5% kernel
04-0113:12:15.872 E/ActivityManager(  220):   0.5%296/com.android.systemui: 0.5% user + 0% kernel
04-0113:12:15.872 E/ActivityManager(  220): **100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait**
04-0113:12:15.872 E/ActivityManager(  220): **CPUusage from 3697ms to 4223ms later**:-- ANR后CPU的使用量
04-0113:12:15.872 E/ActivityManager(  220):   25%21404/com.android.email: 25% user + 0% kernel / faults: 191 minor
04-0113:12:15.872 E/ActivityManager(  220):    16% 21603/__eas(par.hakan: 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**

典型的分析情况

1.如果TOTAL的和接近100,有可能是因为当前使用的app占用的cpu太高,导致系统将你的杀死。
2.如果TOTAL很小,则说明线程被阻塞了,主线程在等待下条消息的进入,任务在等待时anr。
3.如果ioWait很高,则说明是io操作导致的

分析
因为主线程被阻塞导致的关键信息。
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:110)

DALVIK THREADS:(mutexes: tll=0tsl=0 tscl=0 ghl=0 hwl=0 
hwll=0)"main" prio=5 tid=1NATIVE  | group="main" sCount=1 
dsCount=0obj=0x2aad2248 self=0xcf70  | sysTid=21404 nice=0 
sched=0/0cgrp=[fopen-error:2] 
handle=1876218976  
**at android.os.MessageQueue.nativePollOnce(Native Method)  
at android.os.MessageQueue.next(MessageQueue.java:119)  
at android.os.Looper.loop(Looper.java:110**) 
at android.app.ActivityThread.main(ActivityThread.java:3688)
 at java.lang.reflect.Method.invokeNative(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:507)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
at dalvik.system.NativeStart.main(Native Method)

io读写导致的anr

关键点:ioWait很高,ContentResolver in AsyncTask onPostExecute
1.首先看到total中ioWait很高,说明是io操作导致的。

CEE1266B-9D96-40F2-8D20-8255B5B15355.png

2.具体原因
可以看到关键词sqlite,ContentResolver
474549C1-9397-40D2-9412-A0C713CA6220.png

在主线程进行了网络访问

关键词OSNetworkSystem.receiveStreamnet

828A13CA-3C5C-40FB-AFBD-CA132D27A92D.png

内存不足导致

可以看到TOTAL的使用率有98,所以内存不足。


F8E5A2DD-13F9-403C-8F6A-C72509E73CC7.png

关键词:VMWAITVMRuntime.trackExternalAllocation

广播阻塞导致anr

android.intent.action.SCREEN_OFF广播为order,即如果其中注册了此广播的任何应用在处理此广播时未返回,则会导致后续broadcast的失败,出现ANR,导致系统无法唤醒。而导致广播未被及时处理的原因,除了可能是由于对应的Receiver处理函数中一些操作长时间未完成外,也可能是由于整个应用进程被block了,从而没有机会去调用Receiver函数。
1.针对onRecieve中的耗时操作,可以将业务单独加入到一个线程中执行

Paste_Image.png

快速定位anr

1.如果是ANR问题 , 则搜索“ANR”关键词 。 快速定位到关键事件信息 。
2.如果是ForceClosed(程序强制关闭) 和其它异常退出信息,则搜索"Fatal" 关键词, 快速定位到关键事件信息 。

ANR的避免和检测

使用StrictModel
它是android sdk提供的一个用来检测代码中是否存在违规操作的工具类
1.线程检测策略
ThreadPolicy
1.detectCustomSlowCalls:检测耗时操作
2.detectDiskWrites:检测磁盘写入
3.detectDiskRead:检测磁盘读取
4.detectNetWork:检测网络
5.detectAll:启用所有策略
VmPolicy
虚拟机检测策略
1.detectActivityLeaks:是否存在activity泄露
2.detectLeakedClosableObjects:是否存在没有关闭的closable对象
3.detectLeakedSqlLiteObjects:是否存在sqlite对象泄露
4.detectClassInstanceLimit:是否存在实力个数超限制
5.detectALL:启用所有策略

使用方式

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,189评论 25 707
  • ANR问题,相信是每位开发日常都会遇到的问题,对于这类问题的分析,按照官方的推荐,或网络博客的总结思路能解决一定的...
    tiger桂阅读 17,782评论 5 28
  • 引起ANR问题的根本原因,总的来说可以归纳为两类: 应用进程自身引起的,例如:主线程阻塞、挂起、死循环应用进程的其...
    ahking17阅读 37,124评论 11 49
  • ==================================================== 一:什么...
    爱情小傻蛋阅读 9,688评论 3 31
  • 上午被领导抓了壮丁,下午去上了一节入司培训的课。 想当年若是听了叔叔的话,高考的时候选择了他推荐的学校与专业,现在...
    月儿16圆阅读 70评论 0 0