非 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 := trueBOARD_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 := trueBOARD_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 を含めます。