リカバリ イメージ

非 A/B デバイスの場合、リカバリ イメージにはデバイスツリー blob(DTB)または Advanced Configuration and Power Interface(ACPI)オーバーレイ イメージの情報が含まれている必要があります。非 A/B デバイスでリカバリを起動すると、ブートローダーはリカバリ イメージに対応するオーバーレイ イメージを読み込めるようになります。A/B(シームレス)アップデートをサポートするデバイスは、個別のリカバリ パーティションの代わりにリカバリをブートとして使用する必要があります。詳しくは、A/B アップデートの実装をご覧ください。

リカバリ DTBO/ACPIO をブートイメージまたはリカバリ イメージの一部として含めるオプションは、Android リリースによって異なります。

リリース アップデートのスキーム GKI の遵守 ブートヘッダー バージョン(デバイスの起動) ブートヘッダー バージョン(デバイスのアップグレード) 専用のリカバリ イメージが必要
11 A/B、
仮想 A/B
3* 該当なし ×
A/B、
仮想 A/B
× 2、3 0、1、2、3 ×
非 A/B 3 該当なし
非 A/B × 2、3 0、1、2、3
10(Q) A/B 該当なし 2 0、1、2 ×
非 A/B 該当なし 2 0、1、2
9(P) A/B 該当なし 1 0、1 ×
非 A/B 該当なし 1 0、1
8(O) A/B 該当なし 該当なし(0 と見なされます) 該当なし(0 と見なされます) ×
非 A/B 該当なし 該当なし(0 と見なされます) 該当なし(0 と見なされます)

* Android 11 以降を搭載し、Generic Kernel Image(GKI)を使用している A/B デバイスは、メインのブートヘッダー バージョン 3 を使用して、ベンダー ブート パーティションと互換性があるようにする必要があります。

主なポイントは以下の通りです。

  • A/B アップデートでは 2 つのパーティション セット(bootdtbo を含む)を使用し、更新中に切り替えられるため、A/B デバイスはリカバリ イメージを指定する必要はありません。必要に応じて、A/B デバイスでは、専用のリカバリ イメージを使用することもできます。

  • Android 11 以降を搭載し、ブートヘッダー バージョン 3 を使用している非 A/B デバイスでは、個別にリカバリ イメージのブートヘッダー バージョン 2 を明示的に指定する必要があります。例:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • デバイスツリーをサポートしていないアーキテクチャの場合、DTBO イメージの代わりに ACPIO イメージをリカバリ イメージに含めることができます。

OTA の障害とリカバリ イメージについて

非 A/B デバイスで無線(OTA)障害を回避するには、リカバリ イメージが自立して、他のイメージから独立している必要があります。OTA アップデートで、オーバーレイ イメージがアップデートされてから完全なアップデートが完了するまでの間に問題が発生すると、デバイスは OTA アップデートを完了するためにリカバリモードで起動しようとします。ただし、オーバーレイ パーティションがすでにアップデートされているため、まだアップデートされていないリカバリ イメージとの不一致が生じる可能性があります。

リカバリがアップデート中に DTBO/ACPIO パーティションに依存することを回避するために、Android 9 以降を搭載する非 A/B デバイスでは、ブートイメージ形式内の別個のセクションとしてオーバーレイ イメージの情報を含むリカバリ DTBO/ACPIO イメージを指定できます(ブートヘッダー バージョンは 1 または 2 を使用する必要があります)。

ブートイメージの変更

Android 9 以降が搭載されている非 A/B デバイスで、リカバリ イメージにリカバリ DTBO または ACPIO を含めるようにするには、ブートイメージ構造を次のように更新します。

ブートイメージ セクション ページ数
ブートヘッダー(1 ページ) 1
カーネル(l ページ) l = (kernel_size + page_size - 1) / page_size
Ramdisk(m ページ) m = (ramdisk_size + page_size - 1) / page_size
第 2 段階のブートローダー(n ページ) n = (second_size + page_size - 1) / page_size
リカバリ DTBO または ACPIO(o ページ) o = (recovery_[dtbo|acpio]_size + page_size - 1) / page_size

ブートイメージ ヘッダーのバージョンとオーバーレイ イメージのパスを指定する mkbootimg ツールの引数について詳しくは、ブートイメージ ヘッダーのバージョニングをご覧ください。

DTBO の実装

9 以降を搭載する非 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 ビルドシステムは recovery.imgBOARD_PREBUILT_DTBOIMAGE 変数で指定された DTBO を含めます。

ACPIO の実装

Android 9 以降を搭載した非 A/B デバイスでは、DTBO イメージの代わりに ACPIO オーバーレイ イメージを使用し、recovery_dtbo セクションの代わりにリカバリ イメージの 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 ビルドシステムは recovery.imgBOARD_RECOVERY_ACPIO 変数で指定された ACPIO を含めます。