AMS总结(一)

Posted by Gityuan on June 25, 2017

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

一. 组件超时统计

1.1 Service

序号 App端方法 生命周期 计时起点 计时终点
1 AT.handleCreateService onCreate AS.realStartServiceLocked serviceDoneExecuting
2 AT.handleServiceArgs onStartCommand AS.sendServiceArgsLocked serviceDoneExecuting
3 AT.handleBindService onBind/onRebind AS.requestServiceBindingLocked serviceDoneExecuting
4 AT.handleUnbindService onUnbind AS.removeConnectionLocked serviceDoneExecuting
5 AT.handleStopService onDestroy AS.bringDownServiceLocked serviceDoneExecuting

说明:

  • 其中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端方法 计数终点
1 handleReceiver onReceive BQ.processCurBroadcastLocked sendFinished
2 ReceiverDispatcher.Args.run onReceive BQ.performReceiveLocked sendFinished

说明:

  • 其中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端方法 生命周期 计数起点 计数终点
1 installProvider onCreate AMS.attachApplicationLocked AMS.publishContentProviders

说明:

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

1.4 Activity

序号 App端方法 生命周期 计时起点 计时终点  
1 handleLaunchActivity onCreate/onStart/onResume      
2 handleResumeActivity onResume      
3 handlePauseActivity onPause startPausingLocked activityPausedLocked  
4 handleStopActivity onStop stopActivityLocked activityStoppedLocked  
5 handleDestroyActivity onDestroy destroyActivityLocked activityDestroyedLocked  
6 handleRelaunchActivity        
7 handleNewIntent onNewIntent      
8 handleSleeping        
9 handleSendResult onActivityResult      

说明:

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

1.4.1 Activity超时常量

事件 Timeout 文件
LAUNCH_TICK 0.5s ActivityStack
PAUSE_TIMEOUT 0.5s ActivityStack
STOP_TIMEOUT 10s ActivityStack
DESTROY_TIMEOUT 10s ActivityStack
APP_SWITCH_DELAY_TIME 5s AMS
SLEEP_TIMEOUT 5s ASS
IDLE_TIMEOUT 10s ASS
LAUNCH_TIMEOUT 10s ASS

注:ASS是指ActivityStackSupervisor.

二. Handler角度

2.1 四大组件相关Handler

Handler 数据类型 运行线程
AMS.mUiHandler UiHandler android.ui
AMS.mBgHandler Handler android.bg
AMS.mHandler MainHandler ActivityManager
ASS.mHandler ActivityStackSupervisorHandler ActivityManager
AS.mHandler ActivityStackHandler ActivityManager
BroadcastQueue.mHandler BroadcastHandler ActivityManager
ActiveServices.mServiceMap ServiceMap ActivityManager

说明:

  • 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 | 微博 weibo.com/gityuan | 博客 留言区交流