Android ANR 分析学习总结

本文详细介绍了Android ANR的三种主要类型:KeyDispatchTimeout、BroadcastTimeout和服务超时,并分析了KeyDispatchTimeout超时的原因,包括UI线程的阻塞和死锁。还通过实例解析了如何分析和定位ANR问题,包括查看trace.txt文件和识别线程状态。此外,提到了CPU饥饿导致的ANR,并给出了解决ANR的思路。
摘要由CSDN通过智能技术生成

我的简书Android ANR 分析学习总结

1. 什么情况下会发生anr

(1). KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应
(2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成
(3). ServiceTimeout(20 seconds) --小概率类型 Service在特定的时间内无法处理完成

2. KeyDispatchTimeout超时原因

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

首先要知道事件发生的线程,一般来说大多数可能是ui线程操作超时,那么ui线程都有哪些呢:
(1). Activity 生命周期
(2). View post 的runnable方法 、 handler(MainLooper) 的 handleMessage()
(3). Asycktask 的 onPreExecute(), onPostExecute() , onProgressUpdate()方法
(4). Broadcast 的onReceive()
(5). Service
其他原因造成的anr:
(1). 线程死锁
(2). cpu 饥饿

3. 举例

(1) 普通的,可以直接查看trace.txt (http://www.eoeandroid.com/thread-152008-1-1.html?_dsign=554288df)
获取trace.txt 文件 adb shell cat /data/anr/traces.txt > d:/traces.txt (拷贝到d盘)

----- pid 2328 at 2011-12-21 09:36:36 -----
Cmd line: system_server

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 SUSPENDED
  | group="main" sCount=1 dsCount=0 obj=0x4001f180 self=0xce48
  | sysTid=2328 nice=0 sched=0/0 cgrp=default handle=-1345006248
  | schedstat=( 2251911039 10737773873 799 )
  at java.util.ArrayList.size(ArrayList.java:~322)   这里就是案发现场
  at java.util.Collections.sort(Collections.java:1964)
  at com.android.server.IntentResolver.sortResults(IntentResolver.java:334)
  at com.android.server.IntentResolver.queryIntent(IntentResolver.java:305)
  at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:10288)
  at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:10478)
  at android.app.ContextImpl.sendStickyBroadcast(ContextImpl.java:736)
  at com.android.server.TelephonyRegistry.broadcastServiceStateChanged(TelephonyRegistry.java:500)
  at com.android.server.TelephonyRegistry.notifyServiceState(TelephonyRegistry.java:267)
  at com.android.internal.telephony.ITelephonyRegistry$Stub.onTransact(ITelephonyRegistry.java:81)
  at android.os.Binder.execTransact(Binder.java:320)
  at com.android.server.SystemServer.init1(Native Method)
  at com.android.server.SystemServer.main(SystemServer.java:854)
  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:839)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  at dalvik.system.NativeStart.main(Native Method)

"Binder Thread #6" prio=5 tid=46 NATIVE
  | group="main" sCount=1 dsCount=0 obj=0x406fd210 self=0x44b398
  | sysTid=2592 nice=0 sched=0/0 cgrp=default handle=4321440
  | schedstat=( 131676112 959825670 94 )
  at dalvik.system.NativeStart.run(Native Method)

"Thread-57" prio=5 tid=47 NATIVE
  | group=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值