Android中ANR问题分析

157 阅读3分钟

场景

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文件路径

image.png

image.png

image.png