Android设备启动过程

Android设备启动过程始于SoC（单片系统）通电，在见到主界面或进入恢复及快速启动等特殊模式时结束。Android设备的启动过程受到SoC制造商所设计的固件影响。

 背景 
截至2018年，Android设备上90%的SoC由高通、三星或联发科供应。其他供应商包括瑞芯微電子、美滿電子科技、 英伟达及之前的德州仪器。

 历史 
Android KitKat（Android 4.4）引入了启动验证，启动验证是加载引导程序时的安全措施。

 启动阶段 
主引导程序
引导过程的第一阶是启动主引导程序（PBL），其存储在引导ROM（Boot ROM）中，由芯片组制造商编写代码。

使用主引导程序来验证下一阶段引导程序的可靠性。

在三星智能手机上，引导ROM使用三星安全启动密钥（SSBK）来验证下一阶段。

在高通的SoC上，可以从主引导程序进入高通紧急下载模式。

如果加载并验证次级引导程序时失败，则会进入EDL。

 次级引导程序 
由于引导ROM中的储存空间有限，因此使用嵌入式多媒体卡（eMMC）或eUFS来加载次级引导程序。 次级引导程序初始化TrustZone（信任区）。

例如高通MSM8960，次级引导程序1加载次级引导程序2。 次级引导程序2会加载TrustZone和次级引导程序3。

次级引导程序现在被高通称为XBL（可扩展引导程序），并使用統一可延伸韌體介面（UEFI）来进行交叉兼容，以便在第二阶段启动除Android以外的操作系统。

高通使用LK（Little Kernel）或XBL（eXtenable Bootloader），联发科使用Das U-Boot。 Little Kernel是一个用于嵌入式设备的微内核，经过高通的修改后可以用作次级引导程序。

 Android引导程序 
Android Bootloader（Aboot），它实现了fastboot接口（三星设备中没有fastboot）。Aboot用于验证引导程序和恢复分区的可靠性。 通过在手机上按下特定的组合键，设备还可以在恢复模式下启动。接着Aboot将控制权转移到Linux内核。

 Android内核和initramfs（初始RAM文件系统 ） 
initramfs是一个经过Gzip压缩的Cpio档案，其中包含一个小型根文件系统。它包含了被执行的init程序。Android内核是由Linux内核修改后的版本。Init程序挂载了分区。dm-verity用于验证fstab文件中指定分区的完整性。dm-verity是由Google从Android 4.4开始引入的 Linux内核模块。现今实现了基于块的验证，三星已增加对该文件的支持。 

 Zygote进程 
Zygote进程由init进程衍生，负责启动Android应用程序和服务。它将那些经常使用的类加载并初始化到堆中。例如库的dex数据结构。Zygote进程启动后，它会监听套接字上的命令。当要启动新应用程序时，会向Zygote进程发送命令，Zygote进程会执行fork系统调用。[需要引用]

 分区布局 
Android系统被划分在不同的分区中。 

高通平台利用了GUID分区表。此规范是UEFI规范的一部分，但不依赖于UEFI固件。

 参见 
 coreboot
 Linux启动进程


 注释 

 参考文献 

 外部链接 

 Android.com - Boot Flow 
 Managing Boot Time 
 Qualcomm Bootloaders 
 Qualcomm's Chain of Trust 
 Secure Boot and Image Authentication 
 Secure boot on Snapdragon 410 
 Analysis of Qualcomm Secure Boot Chains 
 msm8916-mainline/qhypstub 
 Android system init process startup and init.rc full analysis 
Android Init Language 

Category:Android
Category:引导程序
Category:啟動過程