本页面介绍如何部署通用引导加载程序 (GBL) 二进制文件。
启动固件要求
如需使用 GBL,启动固件必须满足以下要求:
符合统一可扩展固件接口 (UEFI) 标准。固件必须实现并使用必需的 UEFI 协议。固件还必须允许使用定义的 UEFI 协议进行供应商专用扩展。
安全性。固件必须实现 Android 启动时验证 (AVB) 的所有要求,以便 GBL 对启动映像进行身份验证。
启动模式。二进制文件应能够处理各种启动模式,例如正常启动、恢复启动和 fastboot。
动态分区。启动固件必须实现槽位选择逻辑,以便支持读取正确的 A/B 启动槽位,并与 super 中的动态分区和用户数据兼容。
操作系统配置。固件必须能够使用启动设备所需的 OEM 自定义项修改内核命令行、设备树 (DTB) 和 bootconfig。
受保护的虚拟机加载。在存在受保护的虚拟机的情况下,二进制文件应在 Android 内核之前正确加载预验证的受保护的虚拟机固件。如需了解详情,请参阅 Microdroid 启动序列。
内存管理。启动固件必须支持 UEFI 内存分配 API。
实现要求
如需在设备上正确实现 GBL,您必须满足以下要求:
您的设备必须包含两个 FAT 分区,这两个分区的大小为 8 MB(或更大),名称分别为
android_esp_a和android_esp_b,位于 SOC 可访问的块存储设备上。- 块存储设备是一种存储设备,可以按块为单位进行读取或写入。例如,UFS、eMMC 和 SD 卡设备。
- 之所以使用 FAT,是因为它是一种普遍且简单的文件系统。
- 我们建议您从 FAT12、FAT16 和 FAT32 中选择适合您需求的 FAT 文件系统。
- 在 Android 版本的支持窗口期间,无线下载 (OTA) 更新和回滚都需要这两个分区。
- GBL 的未压缩大小约为 2 MB。8 MB 足以应对未来七年内因添加其他功能而导致的任何增长。
- 如果 GBL 更新,您必须更新整个
android_esp_${SLOT_SUFFIX}分区。Android OTA 不支持仅更新 GBL。 - 用于这两个 FAT 分区的分区类型 GUID 必须与 EFI 系统分区 GUID
C12A7328-F81F-11D2-BA4B-00A0C93EC93B对应。
部署的 GBL 版本必须是相应 GBL 发布分支的最新认证生产版本。我们建议您使用首选签名解决方案对 Google 认证的 GBL 副本进行签名,并将生成的 build 和签名元数据存储在
android_esp_${SLOT_SUFFIX}分区中。- GBL 证书必须由 OEM 签名保持完整,并且不得向二进制文件应用任何标头。
- 开发者 GBL build 严格用于开发和调试目的。 该 build 无法发布,也不会获得 Google 认证。
GBL 必须存储在 FAT 分区内的路径
/EFI/BOOT/BOOTAA64.EFI中。实现必需的 UEFI 和 Android UEFI 协议以支持 GBL。如果不支持这些接口,GBL 的生产 build 将无法启动。
EFI_BLOCK_IO_PROTOCOL或EFI_BLOCK_IO2_PROTOCOL从磁盘提取启动映像和 pvmfw 映像EFI_RNG_PROTOCOL,用于堆栈 Canary、KASLR 种子和 RNG 种子- 内存分配服务,用于分配临时内存以执行 AVB 和 DICE 计算
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL提供了一个无操作实现选项,但 GBL 默认通过此协议记录日志GBL_EFI_AVB_PROTOCOL访问公钥和回滚索引以验证启动映像GBL_EFI_BOOT_CONTROL_PROTOCOL从固件获取槽位元数据和启动原因GBL_EFI_AVF_PROTOCOL从 DICE 链生成 AVF 配置数据
启动固件支持
经过必要的修改以支持上一部分中的要求后,以下 UEFI 固件实现可与 GBL 搭配使用:
- EDK2 (Tianocore)。EDK2 是一种常用的开源 UEFI 实现。基于 EDK2 的引导加载程序需要 GBL 支持,并且已提供 UEFI 支持。
- U-Boot。一个灵活且广泛使用的开源引导加载程序项目,正在为 GBL 使用获取 UEFI 兼容性。
- LittleKernel (LK)。一些供应商使用的开源引导加载程序。
运行 GBL
您可以获取预构建的 GBL 二进制文件来运行,也可以自行构建并运行。
获取并运行 GBL 二进制文件
GBL 以单个 UEFI 应用二进制文件的形式分发。您可以使用 Android 的标准更新机制,独立于设备的基础固件更新此二进制文件。
从 Android 16 开始,如果您发布基于 ARM-64 芯片组的设备,我们强烈建议您部署最新的 Google 认证版 GBL,并将其集成到启动链中。
构建 GBL
如需构建 GBL,请执行以下操作:
验证您是否已安装 repo 工具和 Bazel bootstrap:
sudo apt install repo bazel-bootstrap使用
uefi-gbl-mainline清单文件初始化当前目录以进行源代码控制:repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline repo sync -j16构建 UEFI 应用:
tools/bazel run //bootable/libbootloader:gbl_efi_dist
在 Android 虚拟设备上测试 GBL
在 Cuttlefish 中运行 GBL:
cvd start --android_efi_loader=path_to_the_UEFI_app ...此
cvd start命令不直接启动 Android,而是使用 UEFI 应用启动 Android。
提交 bug 并与引导加载程序团队联系
如需报告 GBL 的 bug,请前往 Buganizer 中的 Android 通用引导加载程序组件。
如有疑问,请与 GBL 团队联系,发送电子邮件至 android-gbl@google.com。