ANR service TimeOut 超时判断
android-9.0.0_r8
Service超时判断
前台进程中 service 生命周期不能超过20秒
后台进程中 service 生命周期不能超过200秒
Service启动设置Handler超时消息
ContextImpl.startService -> ContextImpl.startServiceCommon -> AMS.startService -> ActiveServices.startServiceLocked -> ActiveServices.startServiceInnerLocked -> ActiveServices.bringUpServiceLocked -> ActiveServices.realStartServiceLocked -> ActiveServices.bumpServiceExecutingLocked -> ActiveServices.scheduleServiceTimeoutLocked
- AMS.MainHandler 设置超时消息ActivityManagerService.SERVICE_TIMEOUT_MSG
- 超时时间:前台SERVICE_TIMEOUT;后台SERVICE_BACKGROUND_TIMEOUT
AMS.MainHandler超时响应SERVICE_TIMEOUT_MSG
- 超时响应 SERVICE_TIMEOUT_MSG
- 调用ActiveServices.serviceTimeout
ActiveServices.serviceTimeout
- proc.execServicesFg 判断前后台 Service,计算 maxTime 超时时间点
- mAm.mLruProcesses.contains 判断执行 Service 超时的进程是否在最近运行进程列表,如果不在,则忽略这个ANR
- ServiceRecord timeout为空或者不在 mLruProcesses 中重置超时时间 mAm.mHandler.sendMessageAtTime
- anrMessage 的内容为”executing service [发送超时serviceRecord信息]”,不为空调用mAm.mAppErrors.appNotResponding输出Log
AppErrors.appNotResponding输出Log
- 第一次更新cpu统计信息
- PowerManager.reboot() 会阻塞很长时间,因此忽略关机时的ANR
- ANR Log 输出到 Event Log
- ANR Log 输出到 Main Log
- 输出traces信息,对于后台的ANRs不通过 ProcessCpuTracker 收集
- 第二次更新cpu统计信息,并收集cpuinfo
- 将traces文件 和 CPU使用率信息保存到dropbox,即data/system/dropbox目录
- 设置app的ANR状态,并查询错误报告receiver
- 向ui线程发送SHOW_NOT_RESPONDING_MSG消息,弹出ANR对话框
何时清除超时消息SERVICE_TIMEOUT_MSG
ActivityThread.handleCreateService -> AMS.serviceDoneExecuting -> ActiveServices.serviceDoneExecutingLocked
该方法的主要工作是当service启动完成,则移除服务超时消息SERVICE_TIMEOUT_MSG。
感谢
ANR机制以及问题分析
理解Android ANR的触发原理
Android深入四大组件(二)Service的启动过程
理解Android ANR的信息收集过程