2. Android系统镜像基础

Android 设备启动并不是“加载一个操作系统文件”这么简单,而是由 BootROM、引导加载程序(Bootloader)、内核、ramdisk、系统分区、厂商分区、用户数据分区等多个阶段、多个镜像协同完成。理解每个分区镜像的职责与格式,是后续做镜像签名、OTA 打包与发布工程的前提。本节从整体分区布局出发,逐一说明 boot.img、system.img、vendor.img、recovery.img 等核心镜像的作用、内部结构与常见格式。

一、核心原理:Android 分区镜像的整体布局

一台典型 Android 设备的 eMMC/UFS 存储会被划分为若干逻辑分区,每个分区对应一个可独立刷写、独立签名的镜像文件。按启动顺序与职责,可以粗略分为四类:

  • 引导类分区:boot、init_boot、recovery、vbmeta,负责把内核与 ramdisk 装载起来,并承载启动校验信息。
  • 系统类分区:system、vendor、product、system_ext、odm,承载 Android 框架、系统应用、HAL 与厂商定制内容。
  • 数据类分区:userdata、metadata、cache,运行时读写,通常不参与出厂镜像签名。
  • 固件类分区:modem、bluetooth、xbl、tz 等,由芯片厂商提供,签名体系往往独立。

其中 boot、system、vendor、recovery 是与发布工程关系最紧密的四个镜像。它们分别对应“怎么启动”“系统是什么”“厂商差异在哪”“如何进入恢复模式”四个问题。

Android 典型分区镜像布局与启动数据流 eMMC / UFS 逻辑分区 boot recovery system vendor vbmeta userdata 启动数据流 BootROM 固化只读 Bootloader 校验 vbmeta boot.img kernel+ramdisk system.img 挂载 /system vendor.img 挂载 /vendor 镜像内部结构 boot.img boot header (magic/version) kernel ramdisk dtb / second / recovery_dtbo system.img ext4 / erofs 文件系统 /system/framework /system/app、/system/bin AVB hashtree / FEC vendor.img HAL 实现 (.so) firmware / etc 配置 vendor manifest VINTF 兼容矩阵

二、四大核心镜像的作用与格式

boot.img 是启动链中最关键的一环。它由 boot header、kernel、ramdisk、second stage、dtb 等段组成,header 中记录了魔数、版本、各段偏移与大小、页大小等元信息。Android 10 之后引入 GKI(通用内核镜像)与 init_boot 分区,把通用内核与厂商 ramdisk 分离,boot.img 的组成也随之变化。其格式本质是“带头的多段容器”,签名时通常对整段做 AVB 哈希。

system.img 承载 Android 框架、系统应用、运行时与系统库,挂载到 /system。早期使用 ext4,Android 10 起逐步转向只读的 EROFS,以节省空间并提升读取性能。system.img 通常以稀疏镜像(sparse image)形式发布,刷写时由 fastboot 展开为实际块设备内容。

vendor.img 存放芯片与整机厂商提供的 HAL 实现、固件、配置文件,挂载到 /vendor。它是 Treble 架构下“系统与厂商解耦”的关键:system 通过 VINTF 与 vendor 的 HAL 交互,二者可独立升级。vendor.img 同样使用 ext4 或 EROFS,并参与 AVB 校验链。

recovery.img 是恢复模式镜像,结构与 boot.img 类似,包含 recovery 内核与 ramdisk。它用于 OTA 升级、恢复出厂、清除数据等场景。Android 10 之后引入 recovery-as-boot,部分设备不再单独提供 recovery 分区,而是复用 boot 分区中的恢复 ramdisk。

三、镜像格式与签名关系对照

镜像挂载点常见格式是否参与 AVB发布关注点
boot.img—boot header + kernel + ramdisk是内核版本、GKI、dtb
system.img/systemext4 / EROFS / sparse是框架版本、系统应用
vendor.img/vendorext4 / EROFS是HAL、VINTF、固件
recovery.img—boot header + recovery ramdisk是OTA、恢复策略
vbmeta.img—AVB 元数据是(根)哈希、签名、回滚索引

四、实操场景:查看镜像信息

在发布工程中,第一步往往是确认镜像的真实格式与内部结构。可以使用以下命令快速检查:

# 查看 boot.img 头部信息
unpackbootimg -i boot.img -o boot_out/

# 查看镜像文件系统类型
file system.img
# 输出示例: system.img: Linux rev 1.0 ext4 filesystem data

# 查看稀疏镜像
simg2img system.img system_raw.img

# 查看 AVB 元数据
avbtool info_image --image vbmeta.img
在签名前务必确认镜像是否为稀疏格式。对 sparse 镜像直接做哈希与对 raw 镜像做哈希,结果完全不同,会导致 AVB 校验失败。

五、常见误区与复盘

  • 误区一:把 boot.img 当成单一内核文件。 实际上它是多段容器,ramdisk 与 dtb 同样影响启动,签名时任何一段变化都会改变整体哈希。
  • 误区二:认为 system 与 vendor 可以随意混用。 Treble 下二者通过 VINTF 约束,版本不匹配会导致 HAL 无法加载,设备卡在开机动画。
  • 误区三:忽略 recovery 与 boot 的复用关系。 在 recovery-as-boot 设备上单独刷 recovery.img 可能无效,必须更新 boot 分区中的恢复 ramdisk。
  • 误区四:只签名 system.img 而漏签 vbmeta。 AVB 校验链以 vbmeta 为根,漏签会导致整机校验失败,设备无法正常启动。
小结:boot.img 决定“怎么启动”,system.img 决定“系统是什么”,vendor.img 决定“厂商差异在哪”,recovery.img 决定“如何恢复与升级”。四者格式不同、职责不同,但都通过 vbmeta 纳入同一条 AVB 校验链。理解它们的组成与格式,是后续镜像签名、OTA 打包与发布工程的基础。