您的位置:首页 > 移动开发 > Android开发

ANR问题分析流程

2016-12-24 22:06 531 查看
什么是ANR?

ANR即Application Not Responding。出问题时,弹出对话框,提示“XXX无响应“。

ANR有哪些类型?

1、按键分发超时

按键按下/抬起/触摸等事件分发超时。Android默认超时时间5s,厂商定制后超时时间可能有差别,5s~15s不等。根据Android版本/按键事件所处的阶段,默认超时时间可能不一样。

2、广播超时

BroadcastReceiver接受到消息后,在10s内未能把事情做完。Android默认超时时间10s。

3、服务超时

请求服务(Service–四大组件之一)超时,20s内没能启动服务。Android默认超时时间20s。

ANR与报异常Exception的区别

ANR提示“XXX无响应“,确认“强行关闭“会杀掉进程。

Exception提示“XXX停止“。

ANR的本质是什么?

1、JAVA进程都用于一个主线程和主线程消息队列,这里的主线程就是ActivityThread;

2、主线程负责监听、接受和处理UI事件,比如绘制界面等;

3、主线程会从主线程队列中读取消息,而且需要尽快分发出去;

4、主线程只有在完成当前消息处理后,才从消息队列取出下一个消息;

5、如果主线程在处理某个消息时卡住了,没能及时分发,就会发生ANR。

ANR诊断的关键点和文件

关键点:ANR诊断的关键是需要知道主线程为什么没能及时的处理消息

1、没能获取到CPU时间?

2、正在等待某个时间的发生,从而决定下一步动作?

3、当前消息的处理事项过于复杂?

文件:MTKlog & Trace.txt

mobile log之main_log,例如

01-01 08:45:57.396  2781  2781 I AEE/AED : Exception 'ANR' raised


mobile log之event_log,例如

01-01 08:45:52.740   767   817 I am_anr : [0,1555,com.android.phone,1082670597,executing service com.android.phone/com.gionee.Phone.StartPhoneAppService]
01-01 08:45:55.889   767  1518 I am_kill : [0,1636,android.process.acore,15,empty #13]
01-01 <
4000
span class="hljs-number">08:45:56.000   767  1436 I am_proc_died: [0,1636,android.process.acore]
01-01 08:45:57.363   767   817 I am_kill : [0,1555,com.android.phone,-12,bg anr]
01-01 08:45:57.378   767  1574 I am_proc_died: [0,1555,com.android.phone]


trace.txt

----- pid 1583 at 2016-01-01 08:04:38 -----
Cmd line: com.android.phone
......
DALVIK THREADS (14):
"main" prio=5 tid=1 TimedWaiting
| group="main" sCount=1 dsCount=0 obj=0x750fefb8 self=0x7f864af800
| sysTid=1583 nice=0 cgrp=default sched=0/0 handle=0x7f8a445eb0
| state=S schedstat=( 93166071 48310311 345 ) utm=6 stm=3 core=2 HZ=100
| stack=0x7fd6b99000-0x7fd6b9b000 stackSize=8MB
| held mutexes=
at java.lang.Object.wait!(Native method)
- waiting on <0x3d2f5a31> (a com.android.providers.telephony.TelephonyProviderApp)
at java.lang.Object.wait(Object.java:422)
at com.android.providers.telephony.TelephonyProviderApp.onCreate(TelephonyProviderApp.java:37)
- locked <0x3d2f5a31> (a com.android.providers.telephony.TelephonyProviderApp)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1017)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4874)
at android.app.ActivityThread.access$1500(ActivityThread.java:178)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1531)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invoke!(Native method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)


ANR问题DEBUG流程

1、找到ANR问题发生的时间

在main_log和event_log中搜索“anr“关键词,找到对应的时间点

2、流程

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ANR