非 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 つのパーティション セット(
boot
とdtbo
を含む)を使用し、更新中に切り替えられるため、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_DTBO
、BOARD_MKBOOTIMG_ARGS
、BOARD_PREBUILT_DTBOIMAGE
の各変数が正しく設定されている場合、Android ビルドシステムは recovery.img
の BOARD_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_ACPIO
、BOARD_MKBOOTIMG_ARGS
、BOARD_RECOVERY_ACPIO
の各変数が正しく設定されている場合、Android ビルドシステムは recovery.img
に BOARD_RECOVERY_ACPIO
変数で指定された ACPIO を含めます。