非 A/B デバイスで無線(OTA)障害を回避するには、リカバリ パーティションが自立して、他のパーティションに依存しないようにする必要があります。 デバイス メーカーは、DeviceTree または Advanced Configuration and Power Interface(ACPI)を使用して、すべての検出不可能なデバイスを記述できます。
リカバリの起動中、ブートローダーはリカバリ イメージに対応するオーバーレイ用デバイスツリー Blob(DTBO)または Advanced Configuration and Power Interface for Overlay(ACPIO)イメージ(オーバーレイ イメージ)を読み込む必要があります。OTA アップデートの間、オーバーレイ イメージがアップデートされた後(完全なアップデートが完了する前)に問題が発生すると、デバイスは OTA アップデートを完了するためにリカバリモードで起動しようとします。ただし、オーバーレイ パーティションがすでにアップデートされているため、まだアップデートされていないリカバリ イメージとの不一致が生じる可能性があります。
このような状況を回避するには、Android 9 以降ではリカバリ イメージにオーバーレイ イメージの情報も含める必要があります。非 A/B デバイスのリカバリ イメージには、アップデート中にオーバーレイ パーティションに依存する必要がないように、カーネルに追加されたデバイスのオーバーレイ blob も含める必要があります。
Android 10 以降では、DTBO の代わりに ACPI を使用するアーキテクチャがサポートされています。
ブートイメージの変更
リカバリ イメージにリカバリ DTBO または ACPIO を含めるには、Android 9 以降でブートイメージの形式を次のようにします。
ブートヘッダー(1 ページ) |
カーネル(l ページ) |
RAM ディスク(m ページ) |
第 2 段階(n ページ) |
リカバリ DTBO(o ページ) |
さらに、ブートイメージを作成する mkbootimg
ツールには、これらのオーバーレイをサポートする次の引数が含まれています。
引数 | 説明 |
---|---|
header_version
|
ブートイメージ ヘッダーのバージョンを設定します。ヘッダー バージョンが 1 以上のブートイメージは、リカバリ DTBO セクションをサポートしています。 |
recovery_dtbo
|
リカバリ DTBO イメージへのパス。 |
recovery_acpio
|
リカバリ ACPIO イメージへのパス。 |
従来のブートイメージ ヘッダーの変更の詳細については、ブートイメージ ヘッダーのバージョニングをご覧ください。
DTBO の実装
Android 9 以降を搭載したすべてのデバイスで、新しいブートイメージ ヘッダー(バージョン 1)を使用する必要がありますが、非 A/B デバイスのみ、リカバリ イメージの recovery_dtbo
セクションに挿入する必要があります。recovery_dtbo
イメージを recovery.img
に含めるには、デバイスの BoardConfig.mk
で以下の操作を実行します。
BOARD_INCLUDE_RECOVERY_DTBO
構成をtrue
に設定します。BOARD_INCLUDE_RECOVERY_DTBO := true
BOARD_MKBOOTIMG_ARGS
変数を拡張し、ブートイメージ ヘッダーのバージョンを指定します。BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
BOARD_PREBUILT_DTBOIMAGE
変数が DTBO イメージのパスに設定されていることを確認します。Android ビルドシステムは、リカバリ イメージの作成中に変数を使用してmkbootimg
ツールのrecovery_dtbo
引数を設定します。
BOARD_INCLUDE_RECOVERY_DTBO
、BOARD_MKBOOTIMG_ARGS
、BOARD_PREBUILT_DTBOIMAGE
の各変数が正しく設定されている場合、Android ビルドシステムはBOARD_PREBUILT_DTBOIMAGE
変数で指定された DTBO を使用してrecovery.img
に含めます。
ACPIO の実装
Android 10 以降を搭載したすべてのデバイスで新しいブートイメージ ヘッダー(バージョン 1)を使用する必要がありますが、非 A/B のデバイスのみ、リカバリ イメージの recovery_acpio
セクションに挿入する必要があります。recovery_acpio
イメージを recovery.img
に含めるには、デバイスの BoardConfig.mk
で以下の操作を実行します。
BOARD_INCLUDE_RECOVERY_ACPIO
構成をtrue
に設定します。BOARD_INCLUDE_RECOVERY_ACPIO := true
BOARD_MKBOOTIMG_ARGS
変数を拡張し、ブートイメージ ヘッダーのバージョンを指定します。リカバリ ACPIO をサポートするには、変数を 1 以上にする必要があります。BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
BOARD_RECOVERY_ACPIO
変数が ACPIO イメージのパスに設定されていることを確認します。Android ビルドシステムは、リカバリ イメージの作成中に変数を使用してmkbootimg
ツールのrecovery_acpio
引数を設定します。
BOARD_INCLUDE_RECOVERY_ACPIO
、BOARD_MKBOOTIMG_ARGS
、BOARD_RECOVERY_ACPIO
の各変数が正しく設定されている場合、Android ビルドシステムはBOARD_RECOVERY_ACPIO
変数で指定された ACPIO を使用してrecovery.img
に含めます。
検証
Android 9 以降を搭載したすべてのデバイスで、ベンダー テストスイート(VTS)はブートイメージとリカバリ イメージの形式を調べ、ブートイメージ ヘッダーにバージョン 1 が使用されていることを確認します。