部署 GBL

本页介绍了如何部署通用引导加载程序 (GBL) 二进制文件。

启动固件要求

如要使用 GBL,启动固件必须满足以下要求:

  • 统一可扩展固件接口 (UEFI) 合规性。固件必须实现并使用所需的 UEFI 协议。固件还必须允许使用已定义的 UEFI 协议进行特定于供应商的扩展。

  • 安全性。固件必须实现 Android 启动时验证 (AVB) 的所有要求,使 GBL 能够对启动映像进行身份验证。

  • 启动模式。该二进制文件应能够处理各种启动模式,例如正常启动、恢复启动和 fastboot。

  • 动态分区。启动固件必须实现插槽选择逻辑,以便支持读取正确的 A/B 启动插槽,并与超级分区中的动态分区和 userdata 兼容。

  • 操作系统配置。固件必须能够修改内核命令行、设备树 (DTB) 和 bootconfig,以实现启动设备所需的 OEM 自定义。

  • 受保护的虚拟机正在加载。在存在受保护的虚拟机的情况下,二进制文件应在 Android 内核之前正确加载预验证的受保护虚拟机固件。如需了解详情,请参阅 Microdroid 启动序列

  • 内存管理。启动固件必须支持 UEFI 内存分配 API。

实施要求

为了在设备上正确实现 GBL,您必须满足以下要求:

  • 您的设备必须在 SOC 可访问的块设备上包含两个 4 MB(或更大)的 FAT32 分区,分别命名为 android_esp_aandroid_esp_b

    • 块设备是一种可以按块为单位进行读取或写入的存储设备。例如 UFS、eMMC 和 SD 卡设备。
    • 之所以使用 FAT32,是因为它是一种普遍且简单明了的文件系统。
    • 在相应 Android 版本的支持期限内,无线下载 (OTA) 更新和回滚都需要这两个分区。
    • GBL 未压缩时的大小约为 2 MB。4 MB 足以应对未来 7 年内因添加其他功能而导致的任何增长。
    • 如果 GBL 发生更新,您必须更新整个 android_esp_${SLOT_SUFFIX} 分区。Android OTA 不支持仅限 GBL 的更新。
  • 部署的 GBL 版本必须是相应 GBL 发布分支的最新认证正式版 build。建议您使用首选的签名解决方案对 GBL 的 Google 认证副本进行签名,并将生成的 build 和签名元数据存储在 android_esp_${SLOT_SUFFIX} 分区中。

    • GBL 证书必须通过 OEM 签名保持完整,并且不得将任何标头应用于二进制文件。
    • 开发者 GBL build 仅用于开发和调试目的。 相应 build 无法发布,也不会通过 Google 认证。
  • GBL 必须存储在 FAT32 分区中的 /EFI/BOOT/BOOTAA64.EFI 路径下。

  • 实现必需的 UEFI 和 Android UEFI 协议以支持 GBL。如果不支持这些接口,GBL 的正式版 build 将无法启动。

    • EFI_BLOCK_IO_PROTOCOLEFI_BLOCK_IO2_PROTOCOL 从磁盘中提取启动映像和 pvmfw 映像
    • EFI_RNG_PROTOCOL(用于堆栈金丝雀、KASLR 种子和 RNG 种子)
    • 用于分配临时内存以执行 AVB 和 DICE 计算的内存分配服务
    • EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL 提供了一个无操作实现选项,但 GBL 默认通过此协议记录日志
    • GBL_EFI_AVB_PROTOCOL 访问公钥和回滚索引以验证启动映像
    • GBL_EFI_BOOT_CONTROL_PROTOCOL 从固件获取 slot 元数据和启动原因
    • GBL_EFI_AVF_PROTOCOL 从 DICE 链生成 AVF 配置数据
  • GBL UEFI 协议中记录了集成 GBL 时强烈建议使用的 UEFI 协议。

启动固件支持

在进行必要的修改以支持上一部分中的要求后,以下 UEFI 固件实现可与 GBL 搭配使用:

  • EDK2 (Tianocore)。EDK2 是一种热门的开源 UEFI 实现。基于 EDK2 的引导加载程序需要 GBL 支持,并且已提供 UEFI 支持。
  • U-Boot。一个灵活且广泛使用的开源引导加载程序项目,正在获得 UEFI 兼容性,以便用于 GBL。
  • LittleKernel (LK)。某些供应商使用的开源启动加载程序。

运行 GBL

您可以获取预构建的 GBL 二进制文件来运行,也可以自行构建并运行。

获取并运行 GBL 二进制文件

GBL 以单个 UEFI 应用二进制文件的形式分发。您可以使用 Android 的标准更新机制,独立于设备的基本固件更新此二进制文件。

从 Android 16 开始,如果您发布基于 ARM-64 芯片组的设备,我们强烈建议您部署最新的 Google 认证版 GBL,并将其集成到启动链中。

构建 GBL

如需构建 GBL,请执行以下操作:

  1. 验证您是否已安装 repo 工具和 Bazel 引导加载程序:

    sudo apt install repo bazel-bootstrap
    
  2. 使用 uefi-gbl-mainline 清单文件初始化当前目录以便控制源代码:

    repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline
    repo sync -j16
    
  3. 构建 UEFI 应用:

    tools/bazel run //bootable/libbootloader:gbl_efi_dist
    

在 Android 虚拟设备上测试 GBL

  1. 在 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