android ams,AMS总结(一)

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

| 博客

留言区交流

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值