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