このページでは、汎用ブートローダー(GBL)バイナリをデプロイする方法について説明します。
ブート ファームウェアの要件
GBL を使用するには、ブート ファームウェアが次の要件を満たしている必要があります。
Unified Extensible Firmware Interface(UEFI)に準拠していること。ファームウェアは、必要な UEFI プロトコルを実装して使用する必要があります。また、定義された UEFI プロトコルを使用して、ベンダー固有の拡張機能をサポートする必要があります。
セキュリティ。ファームウェアは、Android の確認付きブート(AVB)のすべての要件を実装し、GBL がブートイメージを認証できるようにする必要があります。
起動モード。バイナリは、通常の起動、リカバリ起動、fastboot など、さまざまな起動モードを処理できる必要があります。
動的パーティショニング。ブート ファームウェアは、正しい A/B ブートスロットの読み取りをサポートし、スーパー内の動的パーティションと userdata と互換性があるように、スロット選択ロジックを実装する必要があります。
OS 構成。ファームウェアは、デバイスの起動に必要な OEM カスタマイズを使用して、カーネル コマンドライン、デバイスツリー(DTB)、bootconfig を変更できる必要があります。
保護された VM の読み込み。保護された VM が存在する場合、バイナリは Android カーネルの前に、事前に検証された保護された VM ファームウェアを正しく読み込む必要があります。詳細については、Microdroid 起動シーケンスをご覧ください。
メモリ管理。ブート ファームウェアは、UEFI メモリ割り当て API をサポートする必要があります。
実装の要件
デバイスに GBL を正しく実装するには、次の要件を満たす必要があります。
デバイスには、SOC からアクセス可能なブロック デバイスに、
android_esp_aとandroid_esp_bという名前の 8 MB 以上の 2 つの FAT パーティションが含まれている必要があります。- ブロック デバイスは、ブロック単位で読み書きできるストレージ デバイスです。UFS、eMMC、SD カード デバイスなどが該当します。
- FAT は、ユビキタスでシンプルなファイル システムであるため使用されます。
- FAT12、FAT16、FAT32 から、ニーズに合った FAT ファイル システムを選択することをおすすめします。
- この Android バージョンのサポート期間中は、無線(OTA)アップデートとロールバックの両方のパーティションが必要です。
- GBL は圧縮されていない状態で約 2 MB です。今後 7 年間の追加機能による増加を考慮すると、8 MB で十分です。
- GBL のアップデートを行う場合は、
android_esp_${SLOT_SUFFIX}パーティション全体を更新する必要があります。GBL のみのアップデートは Android OTA でサポートされていません。 - 両方の FAT パーティションで使用されるパーティション タイプ GUID は、EFI システム パーティション GUID
C12A7328-F81F-11D2-BA4B-00A0C93EC93Bに対応している必要があります。
デプロイする GBL のバージョンは、対応する GBL リリース ブランチの最新の認定プロダクション ビルドである必要があります。推奨される署名ソリューションを使用して Google 認定の GBL のコピーに署名し、生成されたビルドと署名メタデータを
android_esp_${SLOT_SUFFIX}パーティションに保存することをおすすめします。- GBL 証明書は OEM 署名によってそのまま残す必要があり、バイナリにヘッダーを適用することはできません。
- デベロッパー GBL ビルドは、開発とデバッグのみを目的として使用されます。 ビルドをリリースすることはできず、Google の認定を受けることもできません。
GBL は、FAT パーティション内のパス
/EFI/BOOT/BOOTAA64.EFIに保存する必要があります。GBL をサポートするために、必要な UEFI プロトコルと Android UEFI プロトコルを実装します。これらのインターフェースがサポートされていない場合、GBL のプロダクション ビルドは起動できません。
EFI_BLOCK_IO_PROTOCOLまたはEFI_BLOCK_IO2_PROTOCOLは、ディスクからブートイメージと pvmfw イメージを取得します。- スタック カナリア、KASLR シード、RNG シード用の
EFI_RNG_PROTOCOL - AVB と DICE の計算を行うためのスクラッチ メモリの割り当て用のメモリ割り当てサービス
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLには no-op 実装のオプションがありますが、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 をビルドするには:
repo ツールと Bazel ブートストラップがインストールされていることを確認します。
sudo apt install repo bazel-bootstrapuefi-gbl-mainlineマニフェスト ファイルを使用して、ソース管理用に現在のディレクトリを初期化します。repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline repo sync -j16UEFI アプリをビルドします。
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 を起動します。
バグを報告してブートローダー チームに連絡する
GBL のバグを報告するには、Buganizer の Android Generic Bootloader コンポーネントに移動します。
ご不明な点がございましたら、GBL チーム(android-gbl@google.com)までメールでお問い合わせください。