场景
Service Time,BroadcastQueue Timeout、ContentProvider Timeout InputDispatching Timeout
Timeout时长
对于前台服务,则超时为SERVICE_TIMEOUT=20s
对于后台服务,则超时为SERVICE_BACKGROUND_TIMEOUT = 200s
对于前台广播,则超时为BROADCAST_FG_TIMEOUT = 10s
对于后台广播,则超时为BROADCAST_BG_TIMEOUT = 60s
ContentProvider超时为CONTENT_PUBLISH_TIMEOUT = 10s
inputDispatching Timeout:输入时间分发超时5s,包括按键和触摸事件
注意事项:Input的超时机制与其他的不同,对于input来说即使某次执行事件超过timeout时长,只要用户后续没有再生成输入事件,则不会触发ANR
超时检测机制
1,service超时检测机制
超过一定时间没有执行完相应操作来触发移除延时消息,则会触发anr
2,BroadcastReceiver超时检测机制
有序广播的总执行时间超过2receiver个数timeout时长,则会触发anr;
有序广播的某一个receiver执行过程timeout时长,则会触发anr
3,另外
对于Service、Broadcast、input发生ANR之后,最终都会调用AMS.appNotResponding
对于provider,在其进程启动时public过程可能会出现ANR,则会直接杀进程以及清理相应信息而不会弹出ANR弹窗
ANR类型
KeyDipatchTimeout(常见)
Input事件在5s内没有处理完成发生了ANR
Logcat日志关键字,input event dispatching timed out
BroadcastTimeout
前台Broadcast:onReceiver在10s内没有处理完成发生ANR
后台Broadcast:onReceiver在60s内没有处理完成发生ANR
ServiceTimeout
前台Service:onCreate,onStart,onBind等生命周期在20s内没有处理完成发生ANR
后台Service:onCreate,onStart,onBind等生命周期在200s内没有处理完成发生ANR
ContentProviderTimeout
ContentProvider在10s内没有处理完成发生ANR
Logcat日志关键字:timeout publishing content providers
ANR触发机制
对于知识学习的过程,要知其然知其所以然,才能做到包丁解牛游刃有余,要深入理解ANR,就需要从根上去找寻答案,那就是ANR是如何触发的
ANR是一套监控android应用响应是否及时的机制,可以把发生ANR比作是引爆炸弹,那么整个流程包含三个部分组成
埋定时炸弹:中控系统(system_server进程)启动倒计时,在规定时间内如果目标应用进程没有干完所以的活,则中控系统会定向炸毁(杀进程)目标
拆炸弹:在规定的时间内干完工地的所以活,并及时向中控系统报告完成,请求解除定时炸弹,则幸免于难
引爆炸弹:中控系统立即封装线程,抓取快照,搜集目标执行慢的罪证(traces)便于后续的案件侦破(调式分析)最后是炸毁目标
常见的ANR有service、broadcast、provider以及input
为什么出现ANR
主线程频繁进行耗时的IO操作,如数据库读写
多线程操作的死锁,主线程被block
主线程被Binder对端block
System server中WatchDog出现ANR
Service binder的连接达到上线无法和System Server通信
系统资源已耗尽(管道、CPU、IO)
ANR问题如何解决
traces_*.txt: 一般是firstPid,即发生anr的pid
ActivityManagerservice中实现,通过appNotResponding(), dumpStackTraces() 两个主要方法来生成应用的anr
trace_SystemServer_WDT.txt(watchdog): Watchdog中实现;System_server进程栈信息
traces.txt(dalvik.vm.stack-trace-file) 系统定义的默认trace文件路径