2. SystemServer 启动与 AMS 初始化
SystemServer 是 Android 系统从 Zygote 孵化出来的第一个 Java 进程,承担着所有系统级服务的创建、注册与生命周期管理职责。AMS 作为系统“大管家”,其初始化顺序、依赖关系与 SystemServer 的启动流程深度绑定。理解这一过程,是掌握 Android 系统架构入口的关键。
2.1 启动流程与模块边界
SystemServer 的启动是 Android 系统从原生层过渡到 Java 框架层的桥梁。整个流程可划分为以下阶段:
- Zygote fork — Zygote 进程通过
ZygoteConnection.processOneCommand解析启动参数,fork 出 SystemServer 进程,并执行SystemServer.main()。 - Native 初始化 — 加载
libandroid_servers.so,初始化 JNI 函数表,建立与底层服务的 IPC 通道。 - 系统上下文创建 — 调用
createSystemContext()构造 ActivityThread 实例,初始化 ContextImpl、ResourcesManager 等基础设施。 - 系统服务启动池 — 按依赖顺序启动约 80 个系统服务,其中 AMS 是首批启动的“核心服务”之一。
- AMS 构造与加入 — 创建
ActivityManagerService实例,完成内部子模块(ActivityStackSupervisor、UserController、BroadcastQueue 等)初始化。 - systemReady 回调 — 当必备服务(PMS、WMS、PowerManager 等)就绪后,AMS 调用
systemReady()正式进入活动管理状态。 - 注册到 ServiceManager — 将 Binder 对象
"activity"注册到 ServiceManager,供其他进程远程调用。
边界划分提示: SystemServer 只负责“启动和注册”,不直接参与组件管理。AMS 的“职责边界”在
systemReady() 之后才完全激活,在此之前仅完成数据结构和线程池的搭建。
2.2 关键初始化步骤
| 步骤 | 核心操作 | 依赖组件 | 产出物 |
|---|---|---|---|
| 1. SystemServer.main() | 设置线程优先级,加载libandroid_servers | Zygote、RuntimeInit | Dalvik/ART 运行时环境 |
| 2. createSystemContext | 创建 ActivityThread,并初始化 ContextImpl、Resources | ActivityThread、DisplayManager | SystemContext 全局单例 |
| 3. AMS 构造 | 初始化 HandlerThread、Looper、ActivityStackSupervisor、UserController、BroadcastQueue、TaskPersister 等 | Context、PowerManager、PackageManager | AMS 对象 (mAm) |
| 4. AMS.setSystemProcess | 将 AMS 自身 Binder 注册到 ServiceManager(名称 "activity"),并创建 ProcessRecord 系统条目 | ServiceManager | ServiceManager 注册表更新 |
| 5. AMS.systemReady | 恢复最近任务、启动桌面(Launcher)、发送 SYSTEM_READY 广播 | WindowManager、PackageManager、UserController | AMS 进入正式工作状态 |
核心源码片段(SystemServer.java):
// SystemServer.main() 入口
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
// 1. 创建系统上下文
createSystemContext();
// 2. 启动关键服务
ActivityManagerService ams = mSystemServiceManager.startService(
ActivityManagerService.class);
// 3. 将AMS注册到ServiceManager
ServiceManager.addService(Context.ACTIVITY_SERVICE, ams);
// 4. 其他服务启动后调用ams.systemReady()
ams.systemReady();
}
2.3 层次划分与核心组件职责
SystemServer 启动阶段涉及的层次可划分为:
- Linux 进程层 — Zygote 进程与 SystemServer 进程的领地。
- Native 层 — libandroid_servers.so 提供 JNI 桥接,负责与 HAL 及底层驱动交互。
- Java 框架层 — SystemServer.java 作为启动主入口,创建并管理所有服务。
- 服务注册层 — ServiceManager 作为全局 Binder 注册中心,维护服务名称到 Binder 引用的映射。
核心组件职责对照:
| 组件 | 在初始化阶段的职责 |
|---|---|
| ActivityManagerService | 调度进程启动、管理 Activity 栈、处理广播/服务请求 |
| ActivityThread | 应用主线程的消息循环调度器,AMS 依赖其进行进程通信 |
| ActivityStackSupervisor | 管理系统所有显示栈(ActivityStack),决定焦点切换 |
| UserController | 多用户身份管理,处理用户切换时的行为限制 |
| BroadcastQueue | 有序/无序广播的排队与分发,与 AMS 的 mHandler 交互 |
| TaskPersister | 持久化保存最近任务列表,用于系统重启后恢复 |
2.4 控制流与数据流
控制流: 从 Zygote→SystemServer 的进程启动,到 AMS 内部多个 HandlerThread 的分发,形成以下信任链路:
- Zygote → SystemServer:通过 socket 传递启动参数,信任链基于 Unix 文件描述符继承。
- SystemServer → AMS:同步调用构造器,确保 AMS 在依赖服务(如 PackageManager)就绪前不被外部访问。
- AMS → ServiceManager:单次注册,后续所有进程通过 ServiceManager 查找 Binder 代理。
- AMS → ActivityStackSupervisor:通过显式接口调用(如
startActivity),不允许外部直接操作 SuperVisor。
信任风险: ServiceManager 本身是无权限检查的纯查找表,任何进程都可以尝试调用
getService()。因此 AMS 在 Binder 接口的 onTransact 方法中必须进行严格的 PID/UID 校验,防止恶意调用。
2.5 设计权衡
| 权衡点 | 方案 A | 方案 B(Android 实际采用) | 理由 |
|---|---|---|---|
| 服务启动顺序 | 所有服务并行启动 | 按依赖关系分阶段启动 | 避免循环依赖,降低初始化复杂度 |
| AMS 构造时机 | 在 systemReady 之后构造 | 尽早构造,但在 systemReady 前对外不可见 | 确保数据结构完整后再暴露接口 |
| ServiceManager 注册 | AMS 内部自行注册 | 由 SystemServer 统一注册 | 注册逻辑集中,便于统一管理 Binder 域名 |
2.6 风险点
- 死锁风险:AMS 初始化内部使用了多个 HandlerThread 和锁(如
mLock、mActivityTaskManager),若依赖的服务未就绪就调用 AMS 方法,可能造成线程阻塞。 - 服务级联失败:如果 PackageManager 在 AMS 构造时未初始化完毕,AMS 将无法获取应用包信息,导致 Activity 启动失败。
- 内存峰值:SystemServer 启动阶段一次性创建大量 Service 对象,堆内存可能急剧膨胀,触发 GC 阻塞。
- 进程优先级影响:SystemServer 的线程优先级设置不当会导致 UI 响应延迟。
2.7 落地步骤与验收标准
落地步骤:
- 在
SystemServer.java的run()方法中按 依赖阶段 添加新服务,确保 AMS 排在 PackageManager 等基础服务之后。 - 利用
mSystemServiceManager.startService()统一管理生命周期,避免直接new服务。 - 在 AMS 构造函数中仅初始化无依赖的内部数据结构(如 HandlerThread、TaskPersister),将涉及其他服务的逻辑放至
systemReady()中延迟执行。 - 通过
ServiceManager.addService()注册时,检查是否已被注册,防止重复。 - 编写集成测试,验证 SystemServer 启动后
getService("activity")能正确返回 AMS Binder 引用。
验收标准:
- SystemServer 进程启动后 5s 内完成 AMS 的构造与注册。
- AMS 的
systemReady()回调在桌面启动之前被调用。 - 使用
dumpsys activity能正常输出 Activity 栈信息,且不抛出 NullPointerException。 - 长时间压力测试(重启 100 次)无死锁、无服务未注册异常。