AMS总结(一)

从另一个维度,简要总结下四大组件的超时统计区间,以及Handler情况。

一. 组件超时统计

1.1 Service

序号App端方法生命周期计时起点计时终点
1AT.handleCreateServiceonCreateAS.realStartServiceLockedserviceDoneExecuting
2AT.handleServiceArgsonStartCommandAS.sendServiceArgsLockedserviceDoneExecuting
3AT.handleBindServiceonBind/onRebindAS.requestServiceBindingLockedserviceDoneExecuting
4AT.handleUnbindServiceonUnbindAS.removeConnectionLockedserviceDoneExecuting
5AT.handleStopServiceonDestroyAS.bringDownServiceLockedserviceDoneExecuting

说明:

  • 其中AS是指ActiveServices;
  • 方法1,2,5组成startService/stopService方式的生命周期;
  • 方法1,3,4,5组成bindService/unbindService方式的生命周期;
  • 每一个生命周期回调方法ANR情况
    • 计时方式: 起点是对端方法, 终点是serviceDoneExecuting()方法
    • 前台进程启动的service不允许超过20s(ActiveServices.SERVICE_TIMEOUT)
    • 后台进程启动的service不允许超过200s
    • 前后台判断标准callerFg = callerApp.setSchedGroup != Process.THREAD_GROUP_BG_NONINTERACTIVE;
  • 必须等到QueuedWork执行完成才结束的生命周期:
    • handleServiceArgs
    • handleServiceArgs

另外, AS.bringDownServiceLocked过程也会触发handleUnbindService.

1.2 Broadcast

序号App端方法生命周期System端方法计数终点
1handleReceiveronReceiveBQ.processCurBroadcastLockedsendFinished
2ReceiverDispatcher.Args.runonReceiveBQ.performReceiveLockedsendFinished

说明:

  • 其中BQ是指BroadcastQueue,ReceiverDispatcher是LoadedApk的静态内部类;
  • 静态注册的广播接收者:
    • 生命周期回调为handleReceiver;
    • 不论何种广播都会调用sendFinished();
  • 动态注册的广播接收者:
    • 周末周期回调为ReceiverDispatcher.Args.run;
    • 发送的是串行广播, 则会调用sendFinished();
    • 发送的是并行广播, 则无需调用sendFinished();
  • 广播ANR的情况:
    • 计时方式: 在广播没有处理完之前, 采用周期为mTimeoutPeriod的轮询方式
    • 静态注册的广播, 以及发送的本身就是串行广播, 都会采用串行方式处理.
    • 串行方式ANR情况1:某个广播总处理时间 > 2* receiver总个数 * mTimeoutPeriod;
      • 前台队列mTimeoutPeriod默认为10s(AMS.BROADCAST_FG_TIMEOUT),
      • 后台队列mTimeoutPeriod默认为60s;
      • 前后台判定isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
    • 串行方式ANR情况2:某个receiver的执行时间超过mTimeoutPeriod;
  • 必须等到QueuedWork执行完成才结束的生命周期:
    • handleReceiver

1.3 ContentProvider

序号App端方法生命周期计数起点计数终点
1installProvideronCreateAMS.attachApplicationLockedAMS.publishContentProviders

说明:

  • Provider发布过程,从计数起点到终点,当超过10s没有执行完成,则会弹出ANR;
  • 其中AMS.CONTENT_PROVIDER_PUBLISH_TIMEOUT=10s;

1.4 Activity

序号App端方法生命周期计时起点计时终点 
1handleLaunchActivityonCreate/onStart/onResume   
2handleResumeActivityonResume   
3handlePauseActivityonPausestartPausingLockedactivityPausedLocked 
4handleStopActivityonStopstopActivityLockedactivityStoppedLocked 
5handleDestroyActivityonDestroydestroyActivityLockedactivityDestroyedLocked 
6handleRelaunchActivity    
7handleNewIntentonNewIntent   
8handleSleeping    
9handleSendResultonActivityResult   

说明:

  • onPause
    • 当超时500ms没有执行完成handlePauseActivity(), 则直接进入AS.activityPausedLocked();
  • ActivityRecord.setSleeping
    • 该过程会触发handleSleeping.
  • 必须等到QueuedWork执行完成才结束的生命周期:
    • handleStopActivity
    • handleSleeping

1.4.1 Activity超时常量

事件Timeout文件
LAUNCH_TICK0.5sActivityStack
PAUSE_TIMEOUT0.5sActivityStack
STOP_TIMEOUT10sActivityStack
DESTROY_TIMEOUT10sActivityStack
APP_SWITCH_DELAY_TIME5sAMS
SLEEP_TIMEOUT5sASS
IDLE_TIMEOUT10sASS
LAUNCH_TIMEOUT10sASS

注:ASS是指ActivityStackSupervisor.

二. Handler角度

2.1 四大组件相关Handler

Handler数据类型运行线程
AMS.mUiHandlerUiHandlerandroid.ui
AMS.mBgHandlerHandlerandroid.bg
AMS.mHandlerMainHandlerActivityManager
ASS.mHandlerActivityStackSupervisorHandlerActivityManager
AS.mHandlerActivityStackHandlerActivityManager
BroadcastQueue.mHandlerBroadcastHandlerActivityManager
ActiveServices.mServiceMapServiceMapActivityManager

说明:

  • AMS.MainHandler
    • 处理service、process、provider的超时问题;
  • BroadcastHandler:
    • 处理broadcast的超时问题;
  • ActivityStackSupervisorHandler:
    • 处理IDLE_TIMEOUT,SLEEP_TIMEOUT,LAUNCH_TIMEOUT
  • ActivityStackHandler:
    • 处理PAUSE_TIMEOUT,STOP_TIMEOUT,DESTROY_TIMEOUT
    • 处理TRANSLUCENT_TIMEOUT,LAUNCH_TICK
  • ActiveServices.ServiceMap:
    • 处理BG_START_TIMEOUT

以上所有跟超时相关的工作都运行在ActivityManager线程,唯独input的超时处理过程并非发生在ActivityManager线程,而是inputDispatcher线程发生的。

2.2 UI相关Handler

对于ANR/Crash/Error等几乎所有错误、警告相关的对话框都运行在android.ui线程,例如:

  • BaseErrorDialog.mHandler
  • AppErrorDialog
  • StrictModeViolationDialog
  • AppNotRespondingDialog
  • AppWaitingForDebuggerDialog
  • UserSwitchingDialog
    原文作者:Gityuan
    原文地址: http://gityuan.com/2017/06/25/ams_summary_1/
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞