SystemServer 启动流程
概述
SystemServer
由 Zygote
进程孵化而来。init
进程启动后,会解析 init.rc
文件,启动 Zygote
进程。Zygote
随后会启动 SystemServer
SystemServer
的 main
方法是一个入口,真正的启动工作在一个名为 run
的方法中完成。启动过程分为三个主要阶段:
- 引导阶段:启动最小化的、至关重要的基础服务
- 核心阶段:启动核心的系统服务,这些服务对 Android 的正常运行至关重要,但可能依赖于引导服务
- 其他阶段:启动所有其他的服务,包括图形、传感器、蓝牙等,这些服务通常依赖于前两个阶段的服务
详细启动流程分解
1. 入口:main
方法
frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {public static void main(String[] args) {new SystemServer().run();}private void run() {// ... 详细的启动逻辑都在这里}
}
非常简单,就是创建一个 SystemServer
实例并调用其 run
方法
2. run
方法内的关键阶段
run
方法非常长,我们聚焦于其分阶段启动服务的逻辑
Phase 1: 准备工作及引导服务
在真正启动服务之前,会进行一些关键的准备工作:
- 设置默认时区、语言区域等
- 设置
VM
的一些参数 - 加载
Android
运行时所需的共享库(如libandroid_servers.so
) - 创建系统级别的
Context
对象 - 最重要的是:创建
SystemServiceManager
(SSM)和Looper
。SSM
是管理所有系统服务生命周期的核心组件,负责启动、注册、以及按阶段回调服务的生命周期方法
// 创建 SystemServiceManager,它是服务的“大管家”
mSystemServiceManager = new SystemServiceManager(mSystemContext);
// 将 SSM 添加到本地服务池,方便其他服务获取和使用
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);// 启动引导服务
startBootstrapServices();
Phase 2: 启动引导服务
startBootstrapServices()
方法启动了最基础、相互依赖最强的服务。这些服务是其他所有服务的基础
- ActivityManagerService (AMS):
○ 作用:管理的核心,负责四大组件的生命周期、进程管理、任务栈管理等
○ 启动时机:最早启动的服务之一。因为它提供了其他服务注册、管理进程的基本框架。AMS
的setSystemProcess
方法会将其自身注册到ServiceManager
,并为系统进程创建初始的Application
○ mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService(); - PowerManagerService (PMS):
○ 作用:管理设备的电源状态,如屏幕亮灭、CPU休眠等
○ 依赖:需要AMS
来管理其相关的wakelocks
○ mSystemServiceManager.startService(PowerManagerService.class); - PackageManagerService (PMS):
○ 作用:应用程序包的管理者,负责应用的安装、卸载、权限管理和解析等
○ 启动时机:非常早,因为几乎所有服务都需要查询应用信息。它的启动过程非常耗时,因为它要扫描所有已安装的 APK
○ PackageManagerService.main(...)
; - 其他关键引导服务:
○DisplayManagerService
:显示管理
○UserManagerService
:多用户管理
○SensorService
:传感器服务
Phase 3: 启动核心服务
startCoreServices()
方法启动了一些核心的、非引导但必不可少的服务
- BatteryService:电池状态服务
- UsageStatsService:应用使用情况统计服务
- WebViewUpdateService:WebView 更新服务
Phase 4: 启动其他服务
startOtherServices()
方法是整个启动过程中最长的方法,它启动了剩下的所有服务。这些服务通常依赖于前面启动的引导和核心服务
这个阶段的服务非常多,我们列举几个最重要的:
- WindowManagerService (WMS):
○ 作用:窗口管理、屏幕绘制、输入事件分发等
○ 依赖:严重依赖AMS
(管理应用窗口)、PowerManagerService
(控制屏幕亮灭)、DisplayManagerService
(获取显示设备信息)
○wm = WindowManagerService.main(...);
○ ServiceManager.addService(Context.WINDOW_SERVICE, wm)
; // 注册到 ServiceManager - InputManagerService (IMS):
○ 作用:管理输入设备(触摸屏、按键等)并将输入事件分发给合适的窗口
○ 依赖:依赖WMS
(获取窗口信息来决定事件目标)
○ inputManager = new InputManagerService(...);
一个关键动作:AMS.systemReady()
在所有其他服务都启动完毕后,会调用 ActivityManagerService
的 systemReady
方法。这是一个非常重要的信号,它标志着系统服务已经全部就绪
// 在 startOtherServices 方法的最后
mActivityManagerService.systemReady(() -> {// 当系统真正准备就绪后,会回调这里Slog.i(TAG, "Making services ready");// 启动SystemUI(状态栏、导航栏等)// 显示系统启动完毕的锁屏界面
}, BOOT_TIMINGS_TRACE_LOG);
在 AMS.systemReady()
内部,它会:
- 发送
ACTION_BOOT_COMPLETED
广播,通知所有应用系统启动已完成 - 启动系统自带的应用程序(如桌面 Launcher)。如果没有 Launcher 启动,用户将看不到任何界面
- 完成最终的准备工作
总结与设计思想
阶段 | 主要服务 | 特点与依赖 |
---|---|---|
引导阶段 | ActivityManagerService , PowerManagerService , PackageManagerService , DisplayManagerService | 最小依赖集。这些服务是系统的基石,相互之间存在紧密的依赖关系,必须最先启动 |
核心阶段 | BatteryService , UsageStatsService | 系统核心功能。这些服务不参与引导,但对系统正常运行至关重要,且依赖引导服务 |
其他阶段 | WindowManagerService , InputManagerService , BluetoothService , NotificationManagerService 等 | 功能型服务。这些服务数量庞大,提供具体的系统功能,通常严重依赖于引导和核心服务 |
设计思想:
- 解耦与依赖管理:通过分阶段启动,清晰地定义了服务之间的依赖关系。后启动的服务可以安全地调用先启动的服务
- 并行启动优化:
SystemServiceManager
会尝试并行启动那些没有相互依赖的服务(例如,在startOtherServices
阶段),以缩短系统启动时间 - 生命周期管理:所有系统服务都实现了一个通用的
SystemService
接口。SSM
会在不同的启动阶段回调服务的onBootPhase(int phase)
方法(如PHASE_BOOT_COMPLETED
),让服务知道系统当前启动到了哪个阶段,以便执行相应的初始化工作 - “就绪”信号:
AMS.systemReady()
是系统启动完成的最终标志,它协调了服务启动和应用程序启动之间的衔接
整个流程就像搭建一座大楼:先打地基(引导服务),再建主体结构(核心服务),最后进行装修和安装各种设施(其他服务),最终宣布大楼正式投入使用(systemReady
)