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的信息收集过程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章