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

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