Android 12 では、汎用boot
イメージに汎用boot
RAM ディスクと汎用カーネル イメージ (GKI)が含まれています。汎用 ramdisk を構築するには、ベンダー固有のリソースを ramdisk から移動して、汎用 ramdisk に最初の段階のinit
とタイムスタンプ情報を含むプロパティ ファイルのみが含まれるようにします。
次のデバイスで:
専用の
recovery
パーティションを使用しないでください。すべてのリカバリ ビットは、ブート RAM ディスクからvendor_boot
RAM ディスクに移動します。専用の
recovery
パーティションを使用してください。recovery
recovery
ディスクを変更する必要はありません。
建築
次の図は、Android 12 を実行するデバイスのアーキテクチャを示しています。
Android 12 の起動またはアップグレード、専用のリカバリなし
図 1. Android 12 を起動またはアップグレードするデバイス、GKI を使用、専用のリカバリなし
Android 12 の起動またはアップグレード、専用および A/B リカバリ (専用 RAM ディスク)
図 2a。 GKI、専用および A/B リカバリを使用して、Android 12 を起動またはアップグレードするデバイス
recovery
が A/B の場合は、この図を参照してください。つまり、デバイスにはrecovery_a
およびrecovery_b
パーティションがあります。
Android 12 の起動またはアップグレード、専用および非 A/B リカバリ (専用 RAM ディスク)
図 2b。 GKI、専用および非 A/B リカバリを使用して、Android 12 を起動またはアップグレードするデバイス
recovery
が A/B でない場合は、この図を参照してください。つまり、デバイスには、スロット サフィックスのないrecovery
という名前のパーティションがあります。
Android 12 へのアップグレード、recovery-as-boot (recovery-as-ramdisk)
図 3. Android 12 にアップグレードするデバイス、GKI なし、recovery-as-boot
Android 12 へのアップグレード、専用リカバリ (専用 RAM ディスク)
図 4. Android 12 にアップグレードするデバイス、GKI なし、専用リカバリ
ブート イメージの内容
Android 12 では、ブート イメージには次のものが含まれます。
- 汎用
boot
イメージ vendor_boot
イメージ (詳細については、「ベンダー ブート パーティション」を参照してください)-
vendor_boot
ヘッダー- デバイス固有の
BOARD_KERNEL_CMDLINE
cmdline
- デバイス固有の
-
vendor_boot
ramdisk イメージlib/modules
- 回復リソース (専用の回復がない場合)
-
dtb
画像
-
recovery
イメージ- ヘッダー バージョン V2
- 必要に応じて、リカバリ用のデバイス固有の
cmdline
- 非 A/B リカバリ パーティションの場合、ヘッダーの内容はスタンドアロンである必要があります。リカバリ イメージを参照してください。例えば:
-
cmdline
はboot
およびvendor_boot
cmdline
に連結されません。 - ヘッダーは、必要に応じて回復 DTBO を指定します。
- A/B リカバリ パーティションの場合、内容は
boot
およびvendor_boot
から連結または推測される場合があります。例えば: -
cmdline
はboot
およびvendor_boot
cmdline
に連結されます。 - DTBO は
vendor_boot
ヘッダーから推測される場合があります。
- 必要に応じて、リカバリ用のデバイス固有の
-
recovery
RAM ディスク イメージ- 回復資源
- 非 A/B リカバリ パーティションの場合、RAM ディスクの内容はスタンドアロンである必要があります。リカバリ イメージを参照してください。例えば:
-
lib/modules
には、回復モードで起動するために必要なすべてのカーネル モジュールが含まれている必要があります - リカバリ RAM ディスクには
init
が含まれている必要があります。 - A/B リカバリ パーティションの場合、リカバリ ramdisk は
boot
およびvendor_boot
ramdisk の先頭に追加されるため、スタンドアロンである必要はありません。例えば: -
lib/modules
には、vendor_boot
ramdisk 内のカーネル モジュール以外に、回復モードを起動するために必要な追加のカーネル モジュールのみが含まれる場合があります。 -
/init
のシンボリック リンクは存在する可能性がありますが、ブート イメージの第 1 段階の/init
バイナリによって影が薄くなります。
- ヘッダー バージョン V2
汎用ブート RAM ディスク イメージの内容
Android 12 では、汎用boot
RAM ディスクに次のコンポーネントが含まれています。
-
init
-
system/etc/ramdisk/build.prop
追加 ro. PRODUCT .bootimg.* build
小道具- マウント ポイント用の空のディレクトリ:
debug_ramdisk/
、mnt/
、dev/
、sys/
、proc/
、metadata/
-
first_stage_ramdisk/
- マウント ポイント用に複製された空のディレクトリ:
debug_ramdisk/
、mnt/
、dev/
、sys/
、proc/
、metadata/
- マウント ポイント用に複製された空のディレクトリ:
ブート イメージの統合
ビルド フラグは、 boot
、 recovery
、およびvendor_boot
イメージのビルド方法を制御します。ブール ボード変数の値は、文字列true
または空 (デフォルト) である必要があります。
TARGET_NO_KERNEL
。この変数は、ビルドがビルド済みのブート イメージを使用するかどうかを示します。この変数がtrue
に設定されている場合は、BOARD_PREBUILT_BOOTIMAGE
をビルド済みのブート イメージの場所に設定します (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img
)。BOARD_USES_RECOVERY_AS_BOOT
.この変数は、デバイスがrecovery
イメージをboot
イメージとして使用するかどうかを示します。 GKI を使用する場合、この変数は空であり、回復リソースはvendor_boot
に移動する必要があります。BOARD_USES_GENERIC_KERNEL_IMAGE
.この変数は、ボードが GKI と汎用boot
イメージを使用することを示します。この変数は、sysprops またはPRODUCT_PACKAGES
には影響しません。これはボード レベルの GKI スイッチです。以下にリストされているすべての変数は、この変数によって制限されます。
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
.この変数は、ramdisk 回復リソースがvendor_boot
に構築されるかどうかを制御します。true
に設定すると、リカバリ リソースはvendor-ramdisk/
のみに構築され、recovery/root/
には構築されません。空の場合、リカバリ リソースは
recovery/root/
のみに構築され、vendor-ramdisk/
には構築されません。
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
.この変数は、GSI AVB キーがvendor_boot
に構築されるかどうかを制御します。true
に設定すると、BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
の場合:設定すると、GSI AVB キーが
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
されます。設定されていない場合、GSI AVB キーは
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
されます。
空の場合、
BOARD_RECOVERY_AS_ROOT
の場合:設定すると、GSI AVB キーが
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
にビルドされます。設定されていない場合、GSI AVB キーは
$ANDROID_PRODUCT_OUT/ramdisk/avb
にビルドされます。
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
.この変数は、recovery
イメージにカーネルが含まれているかどうかを制御します。 Android 12 で起動し、A/Brecovery
パーティションを使用するデバイスは、この変数をtrue
に設定する必要があります。 Android 12 で起動し、非 A/B を使用するデバイスは、この変数をfalse
に設定して、リカバリ イメージを自己完結型に保つ必要があります。BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
.この変数は、$OUT/boot*.img
がターゲット ファイルの下のIMAGES/
にコピーされるかどうかを制御します。aosp_arm64
は、この変数をtrue
に設定する必要があります。他のデバイスは、この変数を空のままにしておく必要があります。
許可された組み合わせ
コンポーネントまたは変数 | recovery パーティションなしでデバイスを更新する | recovery パーティションでデバイスを更新しています | recovery パーティションなしでデバイスを起動する | A/B recovery パーティションを使用してデバイスを起動する | 非 A/B recovery パーティションでデバイスを起動する | aosp_arm64 |
---|---|---|---|---|---|---|
boot を含む | はい | はい | はい | はい | はい | はい |
vendor_boot 含む | オプション | オプション | はい | はい | はい | 番号 |
recovery 含む | 番号 | はい | 番号 | はい | はい | 番号 |
BOARD_USES_RECOVERY_AS_BOOT | true | 空の | 空の | 空の | 空の | 空の |
BOARD_USES_GENERIC_KERNEL_IMAGE | 空の | 空の | true | true | true | true |
PRODUCT_BUILD_RECOVERY_IMAGE | 空の | true または空 | 空の | true または空 | true または空 | 空の |
BOARD_RECOVERYIMAGE_PARTITION_SIZE | 空の | > 0 | 空の | > 0 | > 0 | 空の |
BOARD_MOVE_RECOVERY_RESOURCE_TO_VENDOR_BOOT | 空の | 空の | true | 空の | 空の | 空の |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT | 空の | 空の | true | true | true | 空の |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE | 空の | 空の | 空の | true | 空の | 空の |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES | 空の | 空の | 空の | 空の | 空の | true |
専用のrecovery
パーティションを持つデバイスは、 PRODUCT_BUILD_RECOVERY_IMAGE
をtrue
または空に設定できます。これらのデバイスでは、 BOARD_RECOVERYIMAGE_PARTITION_SIZE
が設定されている場合、 recovery
イメージが構築されます。
ブート用にチェーンされた vbmeta を有効にする
チェーンされた vbmeta は、 boot
イメージに対して有効にする必要があります。以下を指定します。
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
例については、この変更を参照してください。
ルートとしてのシステム
System-as-root は、デバイスが更新可能な GKI モジュールをサポートしているかどうかに関係なく、GKI と汎用ブート イメージを使用するデバイスではサポートされていません。このようなデバイスでは、 BOARD_BUILD_SYSTEM_ROOT_IMAGE
を空にする必要があります。 System-as-root は、動的パーティションを使用するデバイスでもサポートされていません。これは、更新可能な GKI モジュールを使用するための要件です。
製品構成
汎用 RAM ディスクを使用するデバイスは、RAM ディスクへのインストールが許可されているファイルのリストをインストールする必要があります。これを行うには、 device.mk
で次のように指定します。
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
また、 generic_ramdisk.mk
ファイルは、他の makefile が誤って他のファイルを ramdisk にインストールするのを防ぎます (そのようなファイルをvendor_ramdisk
に移動してください)。
デバイスのセットアップ
Android 12 にアップデートするデバイスと Android 12 で起動するデバイスでは、セットアップ手順が異なります。
Android 12 にアップデートするデバイス:
BOARD_USES_RECOVERY_AS_BOOT
の値を保持できます。その場合、レガシー構成を使用しているため、新しいビルド変数は空にする必要があります。そのようなデバイスの場合:BOARD_USES_RECOVERY_AS_BOOT
を空に設定できます。そうする場合、彼らは新しい構成を使用しています。そのようなデバイスの場合:
Android 12 で起動するデバイスは、
BOARD_USES_RECOVERY_AS_BOOT
を空に設定し、新しい構成を使用する必要があります。そのようなデバイスの場合:
aosp_arm64
は GKI と汎用boot
イメージのみをビルドするため ( vendor_boot
やリカバリはビルドしない)、完全なターゲットではありません。 aosp_arm64
ビルド構成については、 generic_arm64
を参照してください。
オプション 1: 専用の回復パーティションなし
recovery
パーティションのないデバイスには、 boot
パーティションに汎用boot
イメージが含まれています。 vendor_boot
ramdisk には、 lib/modules
(ベンダー カーネル モジュールを含む) を含むすべての回復リソースが含まれています。このようなデバイスでは、製品構成はgeneric_ramdisk.mk
から継承されます。
BOARD 値の設定
次の値を設定します。
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
バイナリとシンボリックリンクの初期化
vendor_boot
ramdisk には、 /init
から/system/bin/init
へのシンボリック リンク、および/system/bin/init
のinit_second_stage.recovery
を含めることができます。ただし、 boot
ramdisk はvendor_boot
ramdisk の後に連結されるため、 /init
シンボリック リンクは上書きされます。デバイスが回復モードで起動するとき、第 2 段階の初期化をサポートするために/system/bin/init
バイナリが必要です。 vendor_boot
+ boot
ramdisks の内容は次のとおりです。
-
/init
(ramdisk から、init_first_stage
からビルド) -
/system/bin/init
( vendor_ramdisk から、vendor_ramdisk
からinit_second_stage.recovery
)
fstab ファイルの移動
boot
RAM ディスクにインストールされたfstab
ファイルをvendor_ramdisk
に移動します。例については、この変更を参照してください。
モジュールのインストール
必要に応じて、デバイス固有のモジュールをvendor_ramdisk
にインストールできます (インストールするデバイス固有のモジュールがない場合は、この手順をスキップしてください)。
モジュールを
/first_stage_ramdisk
にインストールするときに、モジュールのvendor_ramdisk
バリアントを使用します。このモジュールは、init
が root を/first_stage_ramdisk
に切り替えた後、init
が root を //system
に切り替える前に使用できるはずです。例については、メタデータ チェックサムと仮想 A/B 圧縮を参照してください。モジュールを
/
にインストールする場合は、モジュールのrecovery
バリアントを使用します。このモジュールは、init
がルートを/first_stage_ramdisk
に切り替える前に使用可能にする必要があります。モジュールを/
にインストールする方法の詳細については、 First stage consoleを参照してください。
初段コンソール
init
が root を/first_stage_ramdisk
に切り替える前に第 1 ステージのコンソールが起動するため、モジュールのrecovery
バリアントをインストールする必要があります。デフォルトでは、両方のモジュール バリアントがbuild/make/target/product/base_vendor.mk
にインストールされるため、デバイスの makefile がそのファイルから継承する場合、 recovery
バリアントを明示的にインストールする必要はありません。
リカバリ モジュールを明示的にインストールするには、次を使用します。
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
これにより、 linker
、 sh
、 toybox
が確実に$ANDROID_PRODUCT_OUT/recovery/root/system/bin
にインストールされ、それがvendor_ramdisk
の下の/system/bin
にインストールされます。
第 1 段階のコンソール (adbd など) に必要なモジュールを追加するには、次を使用します。
PRODUCT_PACKAGES += adbd.recovery
これにより、指定されたモジュールが確実に$ANDROID_PRODUCT_OUT/recovery/root/system/bin
にインストールされ、それがvendor_ramdisk
の下の/system/bin
にインストールされます。
メタデータ チェックサム
第 1 段階のマウント中にメタデータ チェックサムをサポートするために、GKI をサポートしていないデバイスは、次のモジュールの ramdisk バリアントをインストールします。 GKI のサポートを追加するには、モジュールを$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
に移動します。
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
例については、この changelistを参照してください。
仮想 A/B 圧縮
仮想 A/B 圧縮をサポートするには、 snapuserd
をvendor_ramdisk
にインストールする必要があります。デバイスは、 virtual_ab_ota/compression.mk
から継承する必要があります。これにより、 snapuserd
のvendor_ramdisk
バリアントがインストールされます。
起動プロセスの変更
次の例外を除いて、リカバリまたは Android を起動するプロセスは変わりません。
- Ramdisk
build.prop
は/second_stage_resources
に移動して、第 2 段階のinit
がブートのビルド タイムスタンプを読み取れるようにします。
リソースはboot
ramdisk からvendor_boot
ramdisk に移動するため、 boot
をvendor_boot
ramdisk に連結した結果は変わりません。
e2fsck を利用可能にする
デバイスのメイクファイルは、次のものから継承できます。
virtual_ab_ota/launch_with_vendor_ramdisk.mk
デバイスが仮想 A/B をサポートするが圧縮をサポートしない場合。デバイスが仮想 A/B 圧縮をサポートしている場合は、
virtual_ab_ota/compression.mk
compression.mk。
製品の makefile $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
インストールします。実行時に、最初のステージのinit
はルートを/first_stage_ramdisk
に切り替え、次に/system/bin/e2fsck
を実行します。
オプション 2a: 専用の A/B リカバリ パーティション
このオプションは、A/B recovery
パーティションを持つデバイスに使用します。つまり、デバイスにはrecovery_a
およびrecovery_b partition
があります。このようなデバイスには、リカバリ パーティションが更新可能な A/B デバイスと仮想 A/B デバイスが含まれます。次の構成があります。
AB_OTA_PARTITIONS += recovery
vendor_boot
ramdisk には、次のような ramdisk およびベンダー カーネル モジュールのベンダー ビットが含まれています。
デバイス固有の
fstab
ファイルlib/modules
(ベンダーのカーネル モジュールを含む)
recovery
RAM ディスクには、すべてのリカバリ リソースが含まれています。このようなデバイスでは、製品構成はgeneric_ramdisk.mk
から継承されます。
BOARD 値の設定
A/B recovery
パーティションがあるデバイスには、次の値を設定します。
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
バイナリとシンボリックリンクの初期化
recovery
RAM ディスクには、 /init -> /system/bin/init
シンボリック リンク、および/system/bin/init
のinit_second_stage.recovery
を含めることができます。ただし、 recovery
RAM ディスクの後にブート RAM ディスクが連結されるため、 /init
シンボリック リンクが上書きされます。デバイスがリカバリ モードで起動すると、第 2 段階の init をサポートするために/system/bin/init
バイナリが必要になります。
デバイスがrecovery
で起動すると、 recovery
+ vendor_boot
+ boot
ramdisks の内容は次のようになります。
-
/init
(ramdisk から、init_first_stage
からビルド) -
/system/bin/init
(recovery
ramdisk から、init_second_stage.recovery
からビルドし、/init
から実行)
デバイスが Android で起動すると、 vendor_boot
+ boot
RAM ディスクの内容は次のようになります。
-
/init
(ramdisk から、init_first_stage
からビルド)
fstab ファイルの移動
boot
RAM ディスクにインストールされたfstab
ファイルをvendor_ramdisk
に移動します。例については、この変更を参照してください。
モジュールのインストール
必要に応じて、デバイス固有のモジュールをvendor_ramdisk
にインストールできます (インストールするデバイス固有のモジュールがない場合は、この手順をスキップしてください)。 Init
はルートを切り替えません。モジュールのvendor_ramdisk
バリアントは、 vendor_ramdisk
のルートにインストールされます。 vendor_ramdisk
にモジュールをインストールする例については、「第 1 段階のコンソール」、「メタデータ チェックサム」、および「仮想 A/B 圧縮」を参照してください。
初段コンソール
モジュールのvendor_ramdisk
バリアントをインストールするには、次を使用します。
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
これにより、 linker
、 sh
、およびtoybox
が確実に$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
にインストールされ、それがvendor_ramdisk
の下の/system/bin
にインストールされます。
第 1 ステージのコンソール (adbd など) に必要なモジュールを追加するには、関連するパッチを AOSP にアップロードして、これらのモジュールのvendor_ramdisk
バリアントを有効にしてから、次を使用します。
PRODUCT_PACKAGES += adbd.vendor_ramdisk
これにより、指定したモジュールが確実に$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
にインストールされます。 vendor_boot
ramdisk が回復モードでロードされている場合、モジュールはrecovery
モードでも使用できます。 vendor_boot
ramdisk が回復モードで読み込まれていない場合、デバイスは必要に応じてadbd.recovery
もインストールできます。
メタデータ チェックサム
第 1 段階のマウント中にメタデータ チェックサムをサポートするために、GKI をサポートしていないデバイスは、次のモジュールの ramdisk バリアントをインストールします。 GKI のサポートを追加するには、モジュールを$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
に移動します。
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
例については、この changelistを参照してください。
仮想 A/B 圧縮
仮想 A/B 圧縮をサポートするには、 snapuserd
をvendor_ramdisk
にインストールする必要があります。デバイスは、 virtual_ab_ota/compression.mk
から継承する必要があります。これにより、 snapuserd
のvendor_ramdisk
バリアントがインストールされます。
起動プロセスの変更
Android を起動する場合、起動プロセスは変わりません。 vendor_boot
+ boot
ramdisk は、 fstab
がvendor_boot
から読み込まれることを除いて、既存のブート プロセスと似ています。 system/bin/recovery
が存在しないため、 first_stage_init
は通常のブートとして処理します。
リカバリ モードで起動すると、起動プロセスが変わります。リカバリ + vendor_boot
+ boot
RAM ディスクは、既存のリカバリ プロセスと似ていますが、カーネルはrecovery
イメージからではなく、 boot
イメージからロードされます。リカバリ モードの起動プロセスは次のとおりです。
ブートローダーが起動し、次のことを行います。
- recovery +
vendor_boot
+boot
ramdisk を/
にプッシュします。 (OEM がカーネル モジュールをBOARD_RECOVERY_KERNEL_MODULES
に追加してリカバリ ramdisk に複製する場合)、vendor_boot
はオプションです。) -
boot
パーティションからカーネルを実行します。
- recovery +
カーネルは RAM ディスクを
/
にマウントし、boot
RAM ディスクから/init
を実行します。第 1 段階の init が開始され、次に次の処理が行われます。
-
IsRecoveryMode() == true
およびForceNormalBoot() == false
を設定します。 -
/lib/modules
modules からベンダー カーネル モジュールをロードします。 -
DoFirstStageMount()
を呼び出しますが、IsRecoveryMode() == true
であるため、マウントをスキップします。 (デバイスは ramdisk を解放しません (/
は同じままであるため) が、SetInitAvbVersionInRecovery()
を呼び出します。) -
recovery
RAM ディスクの/system/bin/init
から第 2 段階の init を開始します。
-
e2fsck を利用可能にする
デバイスのメイクファイルは、次のものから継承できます。
virtual_ab_ota/launch_with_vendor_ramdisk.mk
デバイスが仮想 A/B をサポートするが圧縮をサポートしない場合。デバイスが仮想 A/B 圧縮をサポートしている場合は、
virtual_ab_ota/compression.mk
compression.mk。
製品の makefile $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
インストールします。実行時に、最初の段階のinit
が/system/bin/e2fsck
を実行します。
オプション 2b: 専用の非 A/B リカバリ パーティション
このオプションは、非 A/B recovery
パーティションを持つデバイスに使用します。つまり、デバイスには、スロット サフィックスのないrecovery
という名前のパーティションがあります。このようなデバイスには次のものがあります。
- 非 A/B デバイス。
- A/B および仮想 A/B デバイス。回復パーティションは更新できません。 (これは異常です。)
vendor_boot
ramdisk には、次のような ramdisk およびベンダー カーネル モジュールのベンダー ビットが含まれています。
- デバイス固有の
fstab
ファイル lib/modules
(ベンダーのカーネル モジュールを含む)
recovery
イメージは自己完結型である必要があります。回復モードを起動するために必要なすべてのリソースが含まれている必要があります。
- カーネル イメージ
- DTBO イメージ
lib/modules
内のカーネル モジュール- シンボリックリンクとしての第 1 段階の init
/init -> /system/bin/init
- 第 2 段階の init バイナリ
/system/bin/init
- デバイス固有の
fstab
ファイル recovery
バイナリなどを含む、その他すべてのリカバリ リソース。- 等
このようなデバイスでは、製品構成はgeneric_ramdisk.mk
から継承されます。
BOARD 値の設定
非 A/B デバイスには次の値を設定します。
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
バイナリとシンボリックリンクの初期化
recovery
ramdisk には、 /init -> /system/bin/init
シンボリック リンク、および/system/bin/init
のinit_second_stage.recovery
が含まれている必要があります。デバイスがリカバリ モードで起動するとき、第 1 段階と第 2 段階の両方の init をサポートするために、 /system/bin/init
バイナリが必要です。
デバイスがrecovery
で起動すると、 recovery
RAM ディスクの内容は次のようになります。
-
/init -> /system/bin/init
(recovery
RAM ディスクから) -
/system/bin/init
(recovery
ramdisk から、init_second_stage.recovery
からビルドし、/init
から実行)
デバイスが Android で起動すると、 vendor_boot
+ boot
RAM ディスクの内容は次のようになります。
-
/init
(ramdisk から、init_first_stage
からビルド)
fstab ファイルの移動
boot
ramdisk にインストールされたfstab
ファイルをvendor_ramdisk
およびrecovery
ramdisk に移動します。例については、この変更を参照してください。
モジュールのインストール
必要に応じて、デバイス固有のモジュールをvendor_ramdisk
およびrecovery
ramdisk にインストールできます (インストールするデバイス固有のモジュールがない場合は、この手順をスキップしてください)。 init
はルートを切り替えません。モジュールのvendor_ramdisk
バリアントは、 vendor_ramdisk
のルートにインストールされます。モジュールのrecovery
バリアントは、 recovery
RAM ディスクのルートにインストールされます。 vendor_ramdisk
およびrecovery
ramdisk へのモジュールのインストールの例については、 First stage console and Metadata checksumsを参照してください。
初段コンソール
モジュールのvendor_ramdisk
バリアントをインストールするには、次を使用します。
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
これにより、 linker
、 sh
、およびtoybox
が確実に$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
にインストールされ、それがvendor_ramdisk
の下の/system/bin
にインストールされます。
第 1 ステージのコンソール (adbd など) に必要なモジュールを追加するには、関連するパッチを AOSP にアップロードして、これらのモジュールのvendor_ramdisk
バリアントを有効にしてから、次を使用します。
PRODUCT_PACKAGES += adbd.vendor_ramdisk
これにより、指定したモジュールが確実に$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
にインストールされます。
モジュールのrecovery
バリアントをインストールするには、 vendor_ramdisk
をrecovery
に置き換えます。
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
メタデータ チェックサム
第 1 段階のマウント中にメタデータ チェックサムをサポートするために、GKI をサポートしていないデバイスは、次のモジュールの ramdisk バリアントをインストールします。 GKI のサポートを追加するには、モジュールを$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
に移動します。
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
リカバリの第 1 段階のマウント中にメタデータ チェックサムをサポートするには、これらのモジュールのリカバリ バリアントを有効にして、それらもインストールします。
起動プロセスの変更
Android を起動する場合、起動プロセスは変わりません。 vendor_boot
+ boot
ramdisk は、 fstab
がvendor_boot
から読み込まれることを除いて、既存のブート プロセスと似ています。 system/bin/recovery
が存在しないため、 first_stage_init
は通常のブートとして処理します。
リカバリ モードで起動しても、起動プロセスは変わりません。リカバリ RAM ディスクは、既存のリカバリ プロセスと同じ方法でロードされます。カーネルはrecovery
イメージからロードされます。リカバリ モードの起動プロセスは次のとおりです。
ブートローダーが起動し、次のことを行います。
- リカバリ ramdisk を
/
にプッシュします。 -
recovery
パーティションからカーネルを実行します。
- リカバリ ramdisk を
カーネルは ramdisk を
/
にマウントし、recovery
ramdisk から/system/bin/init
へのシンボリック リンクである/init
を実行します。第 1 段階の init が開始され、次に次の処理が行われます。
-
IsRecoveryMode() == true
およびForceNormalBoot() == false
を設定します。 -
/lib/modules
modules からベンダー カーネル モジュールをロードします。 -
DoFirstStageMount()
を呼び出しますが、IsRecoveryMode() == true
であるため、マウントをスキップします。 (デバイスは ramdisk を解放しません (/
は同じままであるため) が、SetInitAvbVersionInRecovery()
を呼び出します。) -
recovery
RAM ディスクの/system/bin/init
から第 2 段階の init を開始します。
-
ブート イメージのタイムスタンプ
次のコードは、 boot
イメージのタイムスタンプ ファイルの例です。
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file