Bootloader 如何验证并加载 Android 内核
Bootloader 如何验证并加载 Android 内核
问题场景
设备停在第一屏 Logo、提示系统损坏,或者只在某个 A/B 槽位无法启动时,Framework 日志通常还不存在。此时应关注的是 Bootloader 是否选择了正确目标、是否通过 Android Verified Boot,以及是否把正确的内核、ramdisk、设备树和参数交出去。
这里以 AOSP Android 14 可验证的镜像与 AVB 契约为边界。厂商 Boot ROM、Bootloader UI、 存储控制器和加载地址不属于统一 AOSP 实现,相关结论必须回到具体设备源码或串口日志验证。
核心结论
- Bootloader 的终点不是“启动 Android 应用”,而是建立可信的内核启动上下文并跳转内核入口。
- 锁定设备通常通过 AVB 验证 vbmeta 描述的分区与回滚信息;验证策略由设备 Bootloader 调用 libavb 实现。
- 新设备的通用 ramdisk、vendor ramdisk、DTB 和启动参数可能分布在
boot、vendor_boot、init_boot等镜像,具体组合取决于设备和 header 版本。 - A/B 槽位、锁定状态和启动原因可通过
ro.boot.*暴露给 Android,但字段可用性依设备而异。
观察主路径时,把“AVB 库”与“设备 Bootloader”分开:前者提供验证能力,后者负责平台初始化和策略。
主流程
阶段一:选择启动目标
- 执行者:设备 Bootloader;输入:按键、重启原因、A/B metadata。
- 动作:选择正常启动、Recovery、Fastboot 或其他模式,并确定槽位。
- 下一跳:读取该目标的 vbmeta 和镜像;边界:设备策略。
阶段二:执行 Verified Boot
- 执行者:Bootloader 与 libavb;输入:信任根、锁定状态、vbmeta、分区数据。
- 动作:校验签名、哈希/哈希树与回滚索引,生成验证结果和内核参数。
- 下一跳:允许启动、显示警告或拒绝启动;边界:安全状态和设备策略。
阶段三:组装内核启动上下文
- 执行者:设备 Bootloader;输入:boot family 镜像与设备树。
- 动作:解析 header,装载内核和 ramdisk,合并 cmdline/bootconfig,准备 DTB。
- 下一跳:体系结构相关内核入口;边界:从 Bootloader 进入内核。
关键源码
源码节点:boot image header
- 路径:
system/tools/mkbootimg/include/bootimg/bootimg.h(构建工具定义)和system/tools/mkbootimg/。 - 作用:定义 AOSP 工具如何构建或解析 boot/vendor_boot header;它不是某台设备的 Bootloader 主函数。
Android 14 源码同时包含 v3/v4 的 boot_img_hdr 与 vendor_boot_img_hdr 支持,说明启动载荷可能跨多个镜像组织。阅读设备产品配置时,应先确认实际 header 版本和分区布局,不能套用旧版“boot.img 包含所有 ramdisk”的模型。
源码节点:AVB 槽位验证接口
- 方法:
avb_slot_verify();路径:external/avb/libavb/avb_slot_verify.h。
AvbSlotVerifyResult avb_slot_verify(
AvbOps* ops,
const char* const* requested_partitions,
const char* ab_suffix,
AvbSlotVerifyFlags flags,
AvbHashtreeErrorMode hashtree_error_mode,
AvbSlotVerifyData** out_data);结论:libavb 接收设备提供的 I/O 操作、槽位后缀和策略标志,返回验证结果与数据;谁调用它、失败后如何显示或降级属于 Bootloader 集成。
验证与排障
环境:主机安装 adb/fastboot;fastboot getvar 需要设备已进入 Bootloader/Fastboot,部分变量可能被隐藏。
# 正常 Android 中观察 Bootloader 传入的属性
adb shell getprop ro.boot.slot_suffix
adb shell getprop ro.boot.verifiedbootstate
adb shell getprop ro.boot.vbmeta.device_state
adb shell getprop ro.boot.bootreason
# Fastboot 模式,变量名和支持情况依设备而异
fastboot getvar current-slot
fastboot getvar unlocked绿色 verified boot state 通常表示锁定设备通过验证,但应结合设备文档解释。某槽位失败而另一槽位可启动,优先比较槽位 metadata、vbmeta 和镜像版本;两个槽位都在内核日志前失败,优先查看 Bootloader 串口/厂商诊断信息。不要为验证教程随意解锁设备:解锁通常会清除用户数据并改变安全状态。
常见误区
- AVB 不是 Bootloader:它是供 Bootloader 集成的验证框架。
boot.img不一定独自包含全部启动载荷:Android 14 设备可能还使用vendor_boot和init_boot。- Fastboot 能看到的变量不是跨设备统一全集。
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
| 见本章“关键源码”各节点 | 类名 / 方法名 | 证明主流程的关键动作 |
| Android 14 r75 对应源码文件 | 使用 rg -n 核对 | 发布前记录真实行号,避免跨 tag 漂移 |