非 A/B デバイスのリカバリ イメージ

非 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_DTBOBOARD_MKBOOTIMG_ARGSBOARD_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_ACPIOBOARD_MKBOOTIMG_ARGSBOARD_RECOVERY_ACPIO の各変数が正しく設定されている場合、Android ビルドシステムは BOARD_RECOVERY_ACPIO 変数で指定された ACPIO を使用して recovery.img に含めます。

検証

Android 9 以降を搭載したすべてのデバイスで、ベンダー テストスイート(VTS)はブートイメージとリカバリ イメージの形式を調べ、ブートイメージ ヘッダーにバージョン 1 が使用されていることを確認します。