第1章:AOSP整体启动流程概览

从按下电源键到Launcher显示的全链路鸟瞰图

各位同学,今天我们来聊聊整个AOSP启动流程。说实话,这个主题我讲了不下二十遍,但每次都有新感悟。你想想看,一个手机从你按下电源键到屏幕上出现桌面,中间经历了多少层代码?我粗略算过,至少跨越了四个软件层级,涉及上百个关键函数。

我个人习惯把整个启动流程比作一场接力赛。每个模块跑完自己的赛段,把控制权交给下一个。谁掉棒了,手机就开不了机。我在项目中遇到过好几次启动卡死在某个阶段的情况,排查起来真是头皮发麻。

1.1 启动流程的四个阶段

整个启动链路,我把它拆成四个大阶段:

  • Boot ROM阶段:芯片上电后最先执行的固化代码
  • Bootloader阶段:从预加载器到ABL的完整链条
  • Linux内核阶段:内核初始化、驱动加载、根文件系统挂载
  • Android系统阶段:init进程、Zygote、SystemServer、Launcher

嗯,这里要注意,不同厂商的芯片在Bootloader细节上差异很大。比如高通的PBL和苹果的iBoot,虽然原理相似,但实现完全不同。我们课程主要基于AOSP通用架构来讲,但我会穿插一些实际项目中的案例。

1.2 按下电源键的那一刻

当你按下电源键,硬件层面发生了什么?

  1. PMIC(电源管理芯片)检测到按键信号
  2. PMIC输出稳定的电源轨给SoC
  3. SoC内部的复位逻辑释放,CPU从复位向量地址开始执行

这个复位向量地址,通常是芯片厂商固化在ROM里的。以高通为例,就是PBL(Primary Boot Loader)的入口。我刚开始做嵌入式时,一直以为Bootloader是存在Flash里的,后来才明白——最早的启动代码是写在芯片内部的ROM里,你改不了。

关键点:Boot ROM是芯片出厂时固化的,不可修改。它负责初始化最基本的硬件(比如时钟、SRAM),然后从外部存储加载下一级Bootloader。

1.3 Bootloader的接力赛

Bootloader本身也不是一个单一的程序。它通常分好几级:

阶段名称存储位置主要任务
PBLPrimary Boot Loader芯片内部ROM初始化时钟、DDR,从Flash加载SBL
SBLSecondary Boot LoaderFlash(如eMMC)初始化更多硬件,验证并加载ABL
ABLApplication Boot LoaderBoot分区加载内核、设备树、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,看看芯片上电后执行的第一条指令到底是什么。