1. 课程导入
当你按下手机电源键,到看见锁屏界面,通常只需要几秒钟。但在这几秒背后,Android 系统经历了一条从硬件上电到应用可用的完整启动链路:BootROM 加载引导程序,内核初始化硬件与驱动,init 进程解析配置并拉起关键服务,Zygote 孵化应用进程,SystemServer 启动上百个系统服务,最终由 Launcher 呈现桌面。理解这条链路,是理解 Android Framework 初始化机制的起点。
本课程聚焦“系统启动”与“Framework 初始化”两条主线。前者回答“系统如何从零被拉起来”,后者回答“Java 层的框架能力如何被逐层装配好”。二者在 Zygote 与 SystemServer 处交汇,构成 Android 运行时能力的骨架。
一、整体流程概览
Android 启动可以划分为五个阶段,每个阶段都有明确的执行主体与产物。下图展示了从硬件上电到桌面可交互的主干路径,以及各阶段之间的衔接关系。
可以看到,前三个阶段属于“系统底层启动”,后两个阶段才是“Framework 初始化”的主战场。Zygote 负责搭建 Java 运行时环境,SystemServer 负责把系统能力逐个注册进 Binder 体系,二者共同决定了应用进程能否被正确创建和调度。
二、核心概念与关键角色
在正式进入源码之前,需要先建立几个核心概念,它们贯穿整条启动链路:
- init 进程:用户空间第一个进程,PID 为 1,负责解析 init.rc、挂载文件系统、启动 native 服务与 Zygote。
- Zygote:Android 的“孵化器”,预加载常用类与资源,通过 fork 快速创建应用进程,避免重复初始化。
- SystemServer:系统服务的大本营,由 Zygote fork 而来,负责启动 AMS、PMS、WMS 等上百个服务。
- Binder:Android 跨进程通信的核心机制,系统服务通过 Binder 向应用暴露能力。
- AMS / PMS / WMS:分别管理进程与任务、包与权限、窗口与显示,是 Framework 的三大支柱。
关键理解:Zygote 解决“进程如何快速创建”,SystemServer 解决“系统能力如何被注册和发现”,Binder 解决“能力如何被跨进程调用”。三者构成 Framework 初始化的铁三角。
三、启动阶段与产物对照
为了更清晰地把握各阶段的输入输出,下表列出了每个阶段的执行主体、关键动作与最终产物。这张表可以作为后续章节的“地图”,随时回看定位。
| 阶段 | 执行主体 | 关键动作 | 产物 / 标志 |
|---|---|---|---|
| ① 引导 | BootROM / Bootloader | 上电自检、加载内核镜像 | 内核被载入内存并跳转 |
| ② 内核 | Linux Kernel | 初始化驱动、内存、调度,挂载 rootfs | 启动第一个用户进程 init |
| ③ init | init 进程(PID 1) | 解析 init.rc,启动 native 服务与 Zygote | ServiceManager、Zygote 就绪 |
| ④ Zygote | Zygote 进程 | 预加载类与资源,进入 socket 监听循环 | 可 fork 应用进程的模板 |
| ⑤ SystemServer | SystemServer 进程 | 启动并注册 AMS、PMS、WMS 等服务 | 系统服务可用,Launcher 启动 |
四、典型场景:一次应用启动的回溯
假设用户在桌面上点击了某个应用图标,我们可以沿着启动链路反向回溯,看看 Framework 初始化留下的“基础设施”是如何被使用的:
- Launcher 通过 Binder 调用 AMS,请求启动目标 Activity。
- AMS 检查目标进程是否存在,若不存在则通知 Zygote fork 新进程。
- Zygote 复制自身,新进程加载应用 APK 并执行 ActivityThread.main()。
- 应用进程通过 Binder 向 AMS 注册,AMS 回调并触发 Activity 生命周期。
- WMS 负责窗口的创建与显示,PMS 提供包信息与权限校验。
这条路径中的每一步,都依赖启动阶段已经就绪的服务与机制。如果 Zygote 预加载失败,应用进程无法创建;如果 SystemServer 中 AMS 未注册,Launcher 的启动请求就无处投递。
学习建议:阅读后续章节时,建议始终带着“这个模块在启动链路的哪个位置、由谁创建、向谁注册”三个问题,避免陷入源码细节而失去全局视角。
五、常见误区与复盘
初学者在接触 Android 启动时,容易产生以下几类误解:
- 误区一:把 init 和 Zygote 混为一谈。init 是 native 进程,负责系统级初始化;Zygote 是 Java 进程的孵化器,二者职责完全不同。
- 误区二:认为 SystemServer 是独立启动的。SystemServer 实际上由 Zygote fork 出来,是 Zygote 的第一个“子进程”。
- 误区三:忽略 Binder 的初始化时机。Binder 驱动在内核阶段就已就绪,但 ServiceManager 在 init 阶段启动,服务注册则发生在 SystemServer 阶段。
- 误区四:只关注启动速度,不关注启动顺序。服务之间存在依赖关系,顺序错误会导致空指针或服务不可用。
复盘要点:启动链路是“串行依赖”的,前一阶段未完成,后一阶段无法正确执行。排查启动问题时,应优先确认各阶段的关键日志与产物是否出现,而不是直接跳进 Framework 源码。
六、课程框架与学习目标
本课程共 30 章,围绕“启动链路”与“Framework 初始化”两条主线展开。前段聚焦 BootROM、Kernel、init 与 Zygote,中段深入 SystemServer 与核心服务,后段覆盖 Binder、AMS、PMS、WMS 等关键模块的初始化细节。
完成本课程后,你应当能够:
- 完整描述 Android 从硬件上电到桌面可交互的启动流程;
- 说明 Zygote 预加载机制及其对应用启动性能的影响;
- 理解 SystemServer 启动系统服务的顺序与依赖关系;
- 掌握 Binder 在 Framework 初始化中的注册与使用方式;
- 具备基于日志与源码排查启动问题的基本能力。
# 查看启动阶段关键日志的常用命令
adb shell dmesg | grep -i "init\|zygote"
adb logcat -b events | grep -i "boot_progress"
adb shell getprop | grep -i "init.svc"