ANR问题分析流程

什么是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 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、流程
这里写图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值