第1章:AOSP整体启动流程概览
从按下电源键到Launcher显示的全链路鸟瞰图
各位同学,今天我们来聊聊整个AOSP启动流程。说实话,这个主题我讲了不下二十遍,但每次都有新感悟。你想想看,一个手机从你按下电源键到屏幕上出现桌面,中间经历了多少层代码?我粗略算过,至少跨越了四个软件层级,涉及上百个关键函数。
我个人习惯把整个启动流程比作一场接力赛。每个模块跑完自己的赛段,把控制权交给下一个。谁掉棒了,手机就开不了机。我在项目中遇到过好几次启动卡死在某个阶段的情况,排查起来真是头皮发麻。
1.1 启动流程的四个阶段
整个启动链路,我把它拆成四个大阶段:
- Boot ROM阶段:芯片上电后最先执行的固化代码
- Bootloader阶段:从预加载器到ABL的完整链条
- Linux内核阶段:内核初始化、驱动加载、根文件系统挂载
- Android系统阶段:init进程、Zygote、SystemServer、Launcher
嗯,这里要注意,不同厂商的芯片在Bootloader细节上差异很大。比如高通的PBL和苹果的iBoot,虽然原理相似,但实现完全不同。我们课程主要基于AOSP通用架构来讲,但我会穿插一些实际项目中的案例。
1.2 按下电源键的那一刻
当你按下电源键,硬件层面发生了什么?
- PMIC(电源管理芯片)检测到按键信号
- PMIC输出稳定的电源轨给SoC
- SoC内部的复位逻辑释放,CPU从复位向量地址开始执行
这个复位向量地址,通常是芯片厂商固化在ROM里的。以高通为例,就是PBL(Primary Boot Loader)的入口。我刚开始做嵌入式时,一直以为Bootloader是存在Flash里的,后来才明白——最早的启动代码是写在芯片内部的ROM里,你改不了。
关键点:Boot ROM是芯片出厂时固化的,不可修改。它负责初始化最基本的硬件(比如时钟、SRAM),然后从外部存储加载下一级Bootloader。
1.3 Bootloader的接力赛
Bootloader本身也不是一个单一的程序。它通常分好几级:
| 阶段 | 名称 | 存储位置 | 主要任务 |
|---|---|---|---|
| PBL | Primary Boot Loader | 芯片内部ROM | 初始化时钟、DDR,从Flash加载SBL |
| SBL | Secondary Boot Loader | Flash(如eMMC) | 初始化更多硬件,验证并加载ABL |
| ABL | Application Boot Loader | Boot分区 | 加载内核、设备树、ramdisk |
说白了,每一级Bootloader都在做同一件事:初始化硬件,加载下一级程序。但每一级的复杂度在递增。PBL可能只有几KB代码,而ABL已经是完整的UEFI应用了。
我曾经在一个项目里遇到SBL加载ABL时校验失败的问题。查了两天才发现,是eMMC的Boot分区配置写错了,导致读取的数据全是0xFF。嗯,这种坑踩过一次就记住了。
1.4 内核启动与Android系统初始化
Bootloader把控制权交给内核后,内核开始干活:
- 解压自身(如果是压缩内核)
- 初始化内存管理、调度器、中断系统
- 枚举设备并加载驱动
- 挂载根文件系统(通常是ramdisk)
- 启动第一个用户空间进程——init
init进程是Android世界的起点。它读取init.rc脚本,启动各种关键服务:
- servicemanager(Binder服务管家)
- zygote(应用孵化器)
- surfaceflinger(界面合成)
- 等等
Zygote启动后,会预加载Java框架层常用的类和资源。然后它监听socket,等待创建新应用的请求。SystemServer就是Zygote孵化的第一个Java进程,它负责启动所有系统服务——ActivityManager、WindowManager、PackageManager……
个人经验:调试启动问题时,我经常在init.rc里加一些log输出。比如在关键服务启动前后打印时间戳,这样能精确知道哪一步耗时最长。你想想看,如果用户抱怨开机慢,你总得知道瓶颈在哪吧?
1.5 最后一步:Launcher显示
所有系统服务就绪后,ActivityManagerService会启动Launcher应用。Launcher就是那个你天天看到的桌面程序。它加载应用列表、显示壁纸、启动状态栏……
到这一步,用户才真正看到了可操作的界面。从按下电源键到Launcher显示,正常手机大概需要15-30秒。我见过优化得好的设备能做到10秒以内,也见过某些定制ROM开机要一分多钟的。
为什么会差这么多?
- Bootloader阶段的校验和初始化耗时
- 内核驱动的加载顺序和效率
- Android服务的启动并行度
- 预加载的应用数量
说白了,启动优化就是跟时间赛跑。每一毫秒都值得抠。
1.6 本章小结
这一章我们走马观花看了一遍全链路。你可能觉得信息量有点大,没关系,后面每一章都会深入讲解一个环节。记住这张鸟瞰图,后面学细节时你会不断回来看它。
下一章,我们深入Boot ROM,看看芯片上电后执行的第一条指令到底是什么。