https://rainmonth.github.io/posts/A191018.html
在这里非常感谢Gityuan的博客,让人受益匪浅。
摘要
AMS,即ActivityManagerService,是Android系统的核心服务,负责四大组件的启动、切换、调度以及应用进程的调度和管理,其API并未对我们直接开放,在开放的ActivityManager中主要通过ActivityManagerNative来使用AMS提供的一些API,本文主要介绍AMS的启动过程。
[TOC]
AMS的启动过程
startBootstrapServices()
该方法在SystemServer.java
(包名com.android.server,还有一个android/os/SystemServer.java
)中定义,由于Zygote是Java进程的鼻祖,可以推测system_server进程也是由Zygote孵化而来。startBootstrapServices中AMS有关的内容
1 | private void startBootstrapServices() { |
启动AMS服务
上述方法执行到mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
,变启动了AMS服务。
AMS的构造方法
AMS的构造方法如下,该方法在主线程中调用,但方法内部涉及到Handler与其他线程的绑定,所以处理的时候需要额外关注使用的是那个Thread的Looper
1 | public ActivityManagerService(Context systemContext) { |
在AMS的构造方法里,开启了三个线程,分别是:
- mHandler->MainHandler,其对应的是名为“ActivityManager”的前台ServiceThread(拥有很高的优先级);
- mUiHandler->UiHandler,其对应的是名为“android.ui”的UiThread(继承自ServiceThread);
- mProcessCpuThread,直接通过new Thread构造,名称为“CpuTracer”;
AMS的start方法
该方法在AMS内部类Lifecycle对象的start方法中被调用
1 | private void start() { |
setSystemProcess方法
该方法在SystemServer
的startBootstrapServices()
中被调用,主要作用是:
- 注册各种服务;
- 注册package为android 的包信息,最终是通过LoadedApk的
installSystemApplicationInfo
完成的 - 采用Lru算法更新app进程信息
1 | public void setSystemProcess() { |
这里面的几个Binder是不是很熟悉,对的,就是我们adb shell dumpsys 经常用到的拉取信息分析性能用的。
到这statBootstrapServices()
中关于AMS的内容就完了,接下来看看startOtherServices()
中关于AMS的部分。
startOtherServices()
先列出该方法中AMS相关的调用
1 | private void startOtherServices() { |
systemReady()
重点说说AMS的systemReady方法,在SystemServer中调用AMS的systemReady方法时,传递了一个Runnable对象。
根据goingCallback的执行情况,该方法可以分三个阶段:
- before goingCallback run;
- goingCallback running,goingCallback运行阶段;
- after goingCallback run;
before goingCallback
该阶段主要功能:
- 向
ACTION_PRE_BOOT_COMPLETED
的接收者发送广播,由deliverPreBootCompleted
方法完成; - 杀掉processToKill中的进程,且不允许重启
- 系统和process都达到ready状态
1 | synchronized(this) { |
deliverPreBootCompleted
1 | private boolean deliverPreBootCompleted(final Runnable onFinishCallback, |
PreBootContinuation
AMS的内部类PreBootContinuation,主要通过go方法完成广播的发送工作。
1 | final class PreBootContinuation extends IIntentReceiver.Stub { |
goingCallback.run()
即执行systemReady传递过来的Runnable的run方法,该方法主要完成:
- 进入SystemServer的phase550阶段;(ActivityManager ready阶段)
- 启动WebView,启动systemUi;
- 启动一些列服务,并调用他们的systemReady方法
- 进入SystemServer的phase600阶段(第三方App可以启动了)
after goingCallback
- 回调所有service的startuser方法;
- 启动persistent进程(App);
- 启动Home Activity;
- 发送USER_STARTED和USER_STARTING广播;
- 恢复栈顶Activity
- 发送用户切换广播
1 | // 回调所有service的starUser方法(mSystemServiceManager在SystemServer的startBootstrapServices()方法中初始化 |
小结
大致讲过上面的步骤,AMS启动相关的工作就做完了,再来梳理一下:
- 在SystemServer的startBoostrapServices()方法中创建AMS对象,并启动服务,构造函数完成了相关线程的创建;
- 在SystemServer的startBoostrapServices()方法中调用AMS的setSystemProcess()方法,完成了AMS、meminfo等在SystemServer中的注册,我们adb shell dumpsys的一系列命令就是这里提供的;
- AMS对四大组件均有涉及,因为以下对象都在其构造方法里面创建
- BroadcastQueue,对应BroadcastReceiver;
- ActiveService,对应于Service;
- ProvideMap,对应于ContentProvider;
- ActivityStackSupervisor,对应于Activity;
- UIHandler完成了系统级弹窗的处理,如ANR、调试弹窗、用户错误弹窗等;
- MainHander完成设置更新、后台GC、Service超时、等系统级配置变化的处理;