继上篇《Android系统启动之一-启动Zygote》,本篇继续来看 SystemServer 进程做了什么事情。
Zygote 和 SystemServer 是 Android 系统最重要的两个进程,Zygote 负责创建新进程,而 SystemServer 负责创建应用所需要的服务,例如 ActivityManagerService。
源码:frameworks/base/services/java/com/android/server/SystemServer.java
main 方法没有什么内容,就是 new 了一个 SystemServer 类之后调用它的 run 方法。
/** * The main entry point from zygote. */ public static void main(String[] args) { new SystemServer().run(); } 复制代码
run 方法的主要工作:
初始化自身和环境;
加载 android_server native 库;
创建 SystemContext 和 SystemServiceManager;
启动各类 Service;
Looper 当前线程,开始接收消息。
private void run() { ... //取消 Java 虚拟机的内存限制, VMRuntime.getRuntime().clearGrowthLimit(); ... // Increase the number of binder threads in system_server BinderInternal.setMaxThreads(sMaxBinderThreads); ... // Prepare the main looper thread (this thread). //准备 Looper android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); Looper.prepareMainLooper(); ... //创建系统 context createSystemContext(); // Create the system service manager. mSystemServiceManager = new SystemServiceManager(mSystemContext); mSystemServiceManager.setStartInfo(mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); ... // Start services. //启动各项服务 startBootstrapServices(); startCoreServices(); startOtherServices(); ... //开始 Looper Looper.loop(); } 复制代码
关于如何创建系统 context 流程比较长,借用一图(来源:gityuan)来看比较清晰。
该函数负责启动一些关键性的系统服务,以便 Android 系统能开始第一步正常运行。例如安装服务、屏幕显示服务等。
private void startBootstrapServices(){ //启动 WatchDog final Watchdog watchdog = Watchdog.getInstance(); watchdog.start(); ... //启动安装服务 Installer installer = mSystemServiceManager.startService(Installer.class); ... //启动亮屏服务 mSystemServiceManager.startService(LightsService.class); ... } 复制代码
这个函数启动一些重要的服务,但是不会影响到 Android 系统正常的启动。例如电池服务、用量统计服务等。
private void startCoreServices() { // 电池服务 mSystemServiceManager.startService(BatteryService.class); ... //用量统计服务 mSystemServiceManager.startService(UsageStatsService.class); mActivityManagerService.setUsageStatsManager( LocalServices.getService(UsageStatsManagerInternal.class)); ... //设备缓存服务 mSystemServiceManager.startService(CachedDeviceStateService.class); } 复制代码
启动其他服务,例如 WindowManagerService、InputManagerService 和 NetworkManagementService 等。
最后最重要的是 AMS 的 systemReady 方法,调用这个方法表示 SystemServer 已经准备好其他服务了,等待 AMS 做最后的状态准备,AMS 回调完成后表示 AMS 可以开始接受启动其他应用程序。
private void startOtherServices() { ... // We now tell the activity manager it is okay to run third party // code. It will call back into us once it has gotten to the state // where third party code can really run (but before it has actually // started launching the initial applications), for us to complete our // initialization. mActivityManagerService.systemReady(() -> { ... }) } 复制代码
最后,Looper.loop() 进入等待状态,SystemServer 启动完成,等待其他线程发送消息再进行下一步动作。