Android系统-深入理解ActivityManagerService(一)AMS的启动流程
AMS应该是作为Android开发经常听到的一个系统服务了,它是系统的引导服务,Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,在Android系统中非常重要。所以,接下来就深入了解一下AMS的世界,首先我们从它的启动流程开始。
AMS的启动
在之前的文章Android包管理机制(一)PMS服务启动中,我们有提到在SystemServer中启动引导服务,而AMS也是系统的引导服务,所以首先去看下SystemServer。
1 | private void startBootstrapServices() { |
启动AMS首先调用SystemServiceManager的startService方法,参数为ActivityManagerService.Lifecycle.class
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
1 | "unchecked") ( |
在startService中,首先根据传进来的Lifecycle得到它的构造器constructor,再调用constructor的newInstance方法来创建Lifecycle类型的service对象。接着将刚创建的service添加到ArrayList类型的mServices对象中来完成注册。最后调用service的onStart方法来启动service,并返回该service。
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
1 | public static final class Lifecycle extends SystemService { |
结合Lifecycle的代码,可以看到,startService中newInstance实际调用了Lifecycle(Context context){},创建了ActivityManagerService实例mService,当调用Lifecycle类型的service的onStart方法时,实际上是调用了AMS的start方法。
所以获取AMS实例代码,最后getService()会返回Lifecycle中创建的mService。
1 | mActivityManagerService = mSystemServiceManager.startService( |
AMS构造函数
1 | public ActivityManagerService(Context systemContext) { |
在构造函数中进行各个变量的初始化,创建ActivityManager,ActivityManager:kill,android.ui,CpuTracker线程
AMS.start
1 | private void start() { |
AMS.setSystemProcess
1 | public void setSystemProcess() { |
setSystemProcess就是注册各种服务到ServiceManager,加载名为“android”的package,然后为“android”创建ProcessRecord,用于描述进程的数据结构。
startOtherServices
上面的流程是在startBootstrapServices时,执行的AMS的创建等操作,但AMS的流程还没结束,在startOtherServices中仍然有AMS的后续操作。
1 | private void startOtherServices() { |
1 | public final void installSystemProviders() { |
##systemReady
在startOtherServices中调用mActivityManagerService.systemReady(),参数为Runable类型的goingCallback
在AMS中systemReady函数可以分为三个部分
1 | public void systemReady(final Runnable goingCallback) { |
###before goingCallback
1 | synchronized(this) { |
非persistent进程加入procsToKill,杀掉procsToKill中的进程, 杀掉进程且不允许重启
goingCallback.run()
1 | if (goingCallback != null) goingCallback.run(); |
这个goingCallback是在startOtherServices时传入的Callback
1 | private void startOtherServices() { |
这个过程会
- 启动监听Native Crash
- 启动WebView,并且会创建进程,这是zygote正式创建的第一个进程
- 启动SystemUI
- 启动WatchDog
- 执行一系列服务的systemRunning方法启动
after goingCallback
1 |
|
该阶段主要功能:
- 回调所有SystemService的onStartUser()方法;
- 启动persistent app(常驻内存应用);
- 启动home Activity;
- 发送广播USER_STARTED和USER_STARTING;
- 恢复栈顶Activity;
- 发送广播USER_SWITCHED;
startHomeActivityLocked
1 | boolean startHomeActivityLocked(int userId, String reason) { |
总结
AMS启动流程
- SystemServer调用Lifecycle 创建ActivityManagerService实例
- AMS构造函数初始化变量,创建ActivityManager,ActivityManager:kill,android.ui,CpuTracker线程
- setSystemProcess:注册AMS、meminfo、cpuinfo等服务到ServiceManager
- installSystemProviderss,加载SettingsProvider
- 启动SystemUIService,再调用一系列服务的systemReady()方法
- 启动HomeActivity(Launcher)