本文基于 Android 9.0 , 代码仓库地址 : https://github.com/lulululbj/android_9.0.0_r45
系列文章目录:
https://juejin.im/post/5d8f73bf51882555b149dc64
https://juejin.im/post/5da341f451882561ba64b9da
https://juejin.im/post/5da5e7da518825740064f951
文中相关源码链接:
https://github.com/lulululbj/android_9.0.0_r45/blob/master/frameworks/base/services/java/com/android/server/SystemServer.java
https://github.com/lulululbj/android_9.0.0_r45/blob/master/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
之前介绍 https://juejin.im/post/5da341f451882561ba64b9da 的时候说到,SystemServer 进程启动了一系列的系统服务,ActivityManagerService 是其中最核心的服务之一。它和四大组件的启动、切换、调度及应用进程的管理和调度息息相关,其重要性不言而喻。本文主要介绍其启动流程,它是在 SystemServer 的 main() 中启动的,整个启动流程经历了 startBootstrapServices 、startCoreService() 、startOtherService()。下面就顺着源码来捋一捋 ActivityManagerService 的启动流程,下文中简称 AMS。
private void startBootstrapServices() {
...
// 1. AMS 初始化
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
// 设置 AMS 的系统服务管理器
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
// 设置 AMS 的应用安装器
mActivityManagerService.setInstaller(installer);
...
mActivityManagerService.initPowerManagement();
...
// 2. AMS.setSystemProcess()
mActivityManagerService.setSystemProcess();
...
}
private void startCoreServices{
...
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
...
}
private void startherService{
...
// 3. 安装系统 Provider
mActivityManagerService.installSystemProviders();
...
final Watchdog watchdog = Watchdog.getInstance();
watchdog.init(context, mActivityManagerService);
...
mActivityManagerService.setWindowManager(wm);
...
networkPolicy = new NetworkPolicyManagerService(context, mActivityManagerService,
networkManagement);
...
if (safeMode) {
traceBeginAndSlog("EnterSafeModeAndDisableJitCompilation");
mActivityManagerService.enterSafeMode();
// Disable the JIT for the system_server process
VMRuntime.getRuntime().disableJitCompilation();
traceEnd();
}
...
mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
...
// 4. AMS.systemReady()
mActivityManagerService.systemReady(() -> {
...
mActivityManagerService.startObservingNativeCrashes();
}
}
AMS 初始化
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
AMS 通过 SystemServiceManager.startService() 方法初始化,startService() 在之前的文章中已经分析过,其作用是根据参数传入的类通过反射进行实例化,并回调其 onStart() 方法。注意这里传入的是 ActivityManagerService.Lifecycle.class,LifeCycle 是 AMS 的一个静态内部类。
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
// 构造函数中新建 ActivityManagerService 对象
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
mService.start();
}
@Override
public void onBootPhase(int phase) {
mService.mBootPhase = phase;
if (phase == PHASE_SYSTEM_SERVICES_READY) {
mService.mBatteryStatsService.systemServicesReady();
mService.mServices.systemServicesReady();
}
}
@Override
public void onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
return mService;
}
}
Lifecycle 的构造函数中初始化了 AMS。再来看看 AMS 的构造函数。
public ActivityManagerService(Context systemContext) {
mInjector = new Injector();
// AMS 上下文
mContext = systemContext;
mFactoryTest = FactoryTest.getMode();
// ActivityThread 对象
mSystemThread = ActivityThread.currentActivityThread();
// ContextImpl 对象
mUiContext = mSystemThread.getSystemUiContext();
mPermissionReviewRequired = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_permissionReviewRequired);
// 线程名为 ActivityManager 的前台线程,ServiceThread 继承于 HandlerThread
mHandlerThread = new ServiceThread(TAG,
THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
// 获取 mHandlerThread 的 Handler 对象
mHandler = new MainHandler(mHandlerThread.getLooper());
// 创建名为 android.ui 的线程
mUiHandler = mInjector.getUiHandler(this);
// 不知道什么作用
mProcStartHandlerThread = new ServiceThread(TAG + ":procStart