从另一个维度,简要总结下四大组件的超时统计区间,以及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 | 博客 留言区交流