部署 GBL

本頁說明如何部署通用開機載入程式 (GBL) 二進位檔。

啟動韌體需求

如要使用 GBL,開機韌體必須符合下列需求:

  • 符合統一可延伸韌體介面 (UEFI) 規範。韌體必須實作並使用必要的 UEFI 通訊協定。韌體也必須允許使用定義的 UEFI 通訊協定,進行廠商專屬擴充。

  • 安全性。韌體必須符合 Android 驗證開機程序 (AVB) 的所有規定,讓 GBL 驗證開機映像檔。

  • 啟動模式。二進位檔應能處理各種啟動模式,例如正常啟動、復原啟動和快速啟動。

  • 動態分區。開機韌體必須實作插槽選取邏輯,才能支援讀取正確的 A/B 開機插槽,並與超級分區中的動態分區和使用者資料相容。

  • OS 設定。韌體必須能夠修改核心指令列、裝置樹狀結構 (DTB) 和啟動設定,並加入啟動裝置所需的 OEM 自訂項目。

  • 正在載入受保護的 VM,在有受保護的 VM 時,二進位檔應在 Android 核心之前,正確載入預先驗證的受保護 VM 韌體。詳情請參閱 Microdroid 啟動順序

  • 記憶體管理。開機韌體必須支援 UEFI 記憶體配置 API。

導入規定

如要在裝置上正確導入 GBL,必須符合下列規定:

  • 裝置必須包含兩個 FAT32 分割區,大小為 4 MB (或更大),且在 SOC 可存取的區塊裝置上分別命名為 android_esp_aandroid_esp_b

    • 區塊裝置是一種儲存裝置,可讀取或寫入區塊單位的資料。例如 UFS、eMMC 和 SD 卡裝置。
    • 使用 FAT32 是因為這是普遍且簡單的檔案系統。
    • 在 Android 版本支援期間,無線 (OTA) 更新和回溯都需要這兩個分區。
    • GBL 檔案未經壓縮時約為 2 MB。4 MB 足以因應未來七年內,因新增功能而造成的任何成長。
    • 如果 GBL 有更新,您必須更新整個 android_esp_${SLOT_SUFFIX} 分區。Android OTA 不支援僅更新 GBL。
  • 部署的 GBL 版本必須是相應 GBL 發布分支的最新認證正式版。建議您使用偏好的簽署解決方案,簽署 Google 認證的 GBL 副本,並將產生的建構版本和簽章中繼資料儲存在 android_esp_${SLOT_SUFFIX} 分割區中。

    • OEM 簽章必須保持 GBL 憑證完整無缺,且二進位檔不得套用任何標頭。
    • 開發人員 GBL 建構版本僅供開發和偵錯之用。這個版本無法出貨,也不會通過 Google 認證。
  • GBL 必須儲存在 FAT32 分區的 /EFI/BOOT/BOOTAA64.EFI 路徑中。

  • 實作必要的 UEFI 和 Android UEFI 通訊協定,以支援 GBL。如果這些介面不受支援,GBL 的正式版建構作業將無法啟動。

    • EFI_BLOCK_IO_PROTOCOLEFI_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 設定資料
  • 整合 GBL 時強烈建議使用的 UEFI 通訊協定,請參閱「GBL UEFI 通訊協定」。

支援啟動韌體

經過修改後,下列 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:

  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 指令會使用 UEFI 應用程式啟動 Android,而不是直接啟動 Android。

回報錯誤並聯絡開機載入程式團隊

如要回報 GBL 的錯誤,請前往 Buganizer 中的 Android Generic Bootloader 元件

如有任何問題,請傳送電子郵件至 android-gbl@google.com,與 GBL 團隊聯絡。