在 Android 12 中,通用boot
映像包含通用boot
ramdisk 和通用内核映像 (GKI) 。要构建通用 ramdisk,请将特定于供应商的资源移出 ramdisk,以便通用 ramdisk 仅包含第一阶段init
和包含时间戳信息的属性文件。
在以下设备上:
不要使用专用的
recovery
分区,所有恢复位都从引导 ramdisk 移动到vendor_boot
ramdisk。一定要使用专用的
recovery
分区,因为recovery
ramdisk 是独立的,所以不需要更改recovery
ramdisk。
建筑学
下图说明了运行 Android 12 的设备的架构。
启动或升级到 Android 12,没有专门的恢复
图 1.使用 GKI 启动或升级到 Android 12 的设备,没有专门的恢复
启动或升级到 Android 12,专用和 A/B 恢复(专用 ramdisk)
图 2a。使用 GKI、专用和 A/B 恢复启动或升级到 Android 12 的设备
如果recovery
为 A/B,请参考此图;即设备有recovery_a
和recovery_b
分区。
启动或升级到 Android 12,专用和非 A/B 恢复(专用 ramdisk)
图 2b。使用 GKI、专用和非 A/B 恢复启动或升级到 Android 12 的设备
如果recovery
不是 A/B,请参考此图;也就是说,设备有一个名为recovery
的分区,没有插槽后缀。
升级到 Android 12,recovery-as-boot (recovery-as-ramdisk)
图 3.升级到 Android 12、无 GKI、恢复即启动的设备
升级到Android 12,专用恢复(专用ramdisk)
图 4.升级到 Android 12、无 GKI、专用恢复的设备
引导映像内容
在 Android 12 中,启动映像包含以下内容。
- 通用
boot
映像 vendor_boot
映像(有关详细信息,请参阅Vendor Boot Partitions )-
vendor_boot
标头- 特定于设备的
cmdline
(BOARD_KERNEL_CMDLINE
)
- 特定于设备的
-
vendor_boot
ramdisk 映像lib/modules
- 恢复资源(如果没有专用恢复)
-
dtb
图像
-
recovery
图像- 标头版本 V2
- 用于恢复的特定于设备的
cmdline
(如有必要) - 对于非 A/B 恢复分区,header 的内容必须是独立的;请参阅恢复映像。例如:
-
cmdline
未连接到boot
和vendor_boot
cmdline
。 - 如有必要,标头指定恢复 DTBO。
- 对于 A/B 恢复分区,可以从
boot
和vendor_boot
连接或推断内容。例如: -
cmdline
连接到boot
和vendor_boot
cmdline
。 - DTBO 可以从
vendor_boot
标头中推断出来。
- 用于恢复的特定于设备的
-
recovery
ramdisk 映像- 恢复资源
- 对于非 A/B 恢复分区,ramdisk 的内容必须是独立的;请参阅恢复映像。例如:
-
lib/modules
必须包含启动恢复模式所需的所有内核模块 - 恢复 ramdisk 必须包含
init
。 - 对于 A/B 恢复分区,恢复 ramdisk 被添加到
boot
和vendor_boot
ramdisk,因此它不需要是独立的。例如: - 除了
vendor_boot
ramdisk 中的内核模块之外,lib/modules
可能只包含启动恢复模式所需的其他内核模块。 -
/init
处的符号链接可能存在,但它被引导映像中的第一阶段/init
二进制文件所掩盖。
- 标头版本 V2
通用引导 ramdisk 映像内容
在 Android 12 中,通用boot
ramdisk 包含以下组件。
-
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
。此变量控制是否为vendor_boot
构建 ramdisk 恢复资源。当设置为
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
必须为boot
映像启用链式 vbmeta。指定以下内容:
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
例如,请参阅此更改。
系统为根
使用 GKI 和通用引导映像的设备不支持 System-as-root,无论设备是否支持可更新的 GKI 模块。在此类设备上, BOARD_BUILD_SYSTEM_ROOT_IMAGE
必须为空。使用动态分区的设备也不支持 System-as-root,这是使用可更新 GKI 模块的要求。
产品配置
使用通用 ramdisk 的设备必须安装允许安装到 ramdisk 的文件列表。为此,请在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 可以包含指向/system/bin/init
符号链接的/init
和 /system/bin /system/bin/init
init 中的init_second_stage.recovery
。但是,因为boot
ramdisk 在vendor_boot
ramdisk 之后连接,所以/init
符号链接被覆盖。当设备启动恢复时,需要/system/bin/init
二进制文件来支持第二阶段 init。 vendor_boot
+ boot
ramdisk的内容如下:
-
/init
(来自 ramdisk,由init_first_stage
) -
/system/bin/init
(来自vendor_ramdisk
,由init_second_stage.recovery
)
移动 fstab 文件
将安装到boot
ramdisk 的任何fstab
文件移动到vendor_ramdisk
。例如,请参阅此更改。
安装模块
如果需要,您可以将特定于设备的模块安装到vendor_ramdisk
(如果您没有要安装的任何特定于设备的模块,请跳过此步骤)。
当模块安装到
/first_stage_ramdisk
时,使用模块的vendor_ramdisk
变体。该模块应该在init
将 root 切换到/first_stage_ramdisk
但在init
将 root 切换到/system
之前可用。例如,请参阅元数据校验和和虚拟 A/B 压缩。当模块安装到
/
时,使用模块的recovery
变体。在init
将 root 切换到/first_stage_ramdisk
之前,该模块应该可用。有关将模块安装到/
的详细信息,请参阅第一阶段控制台。
一级控制台
由于第一阶段控制台在init
将 root 切换到/first_stage_ramdisk
之前启动,因此您需要安装模块的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
。
要添加第一阶段控制台所需的模块(例如 adbd),请使用以下命令。
PRODUCT_PACKAGES += adbd.recovery
这确保指定的模块安装到$ANDROID_PRODUCT_OUT/recovery/root/system/bin
,然后安装到vendor_ramdisk
下的/system/bin
。
元数据校验和
为了在第一阶段挂载期间支持元数据校验和,不支持 GKI 的设备会安装以下模块的 ramdisk 变体。要添加对 GKI 的支持,请将模块移动到$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
例如,请参阅此更改列表。
虚拟 A/B 压缩
要支持虚拟 A/B 压缩,必须将snapuserd
安装到vendor_ramdisk
。该设备应该从virtual_ab_ota/compression.mk
继承,它安装了snapuserd
的vendor_ramdisk
变体。
引导过程的变化
启动进入恢复或进入 Android 的过程不会改变,但以下情况除外:
- Ramdisk
build.prop
移动到/second_stage_resources
以便第二阶段init
可以读取启动的构建时间戳。
因为资源从boot
ramdisk 移动到vendor_boot
ramdisk,连接boot
到vendor_boot
ramdisk 的结果不会改变。
使 e2fsck 可用
设备 makefile 可以继承自:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
如果设备支持虚拟 A/B 但不支持压缩。virtual_ab_ota/compression.mk
如果设备支持虚拟 A/B 压缩。
产品 makefile 安装$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
。在运行时,第一阶段init
将 root 切换到/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
ramdisk 包含所有恢复资源。在此类设备上,产品配置继承自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
ramdisk 可以包含/init -> /system/bin/init
符号链接,以及/system/bin/init
中的init_second_stage.recovery
。但是,由于引导 ramdisk 在recovery
ramdisk 之后连接,因此/init
符号链接被覆盖。当设备启动到恢复模式时,需要/system/bin/init
二进制文件来支持第二阶段 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
ramdisk的内容如下:
-
/init
(来自 ramdisk,由init_first_stage
)
移动 fstab 文件
将安装到boot
ramdisk 的所有fstab
文件移动到vendor_ramdisk
。例如,请参阅此更改。
安装模块
如果需要,您可以将特定于设备的模块安装到vendor_ramdisk
(如果您没有要安装的任何特定于设备的模块,请跳过此步骤)。 Init
不切换根目录。模块的vendor_ramdisk
变体安装到vendor_ramdisk
的根目录。有关将模块安装到vendor_ramdisk
的示例,请参阅第一阶段控制台、元数据校验和和虚拟 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
。
要添加第一阶段控制台所需的模块(例如 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
。
元数据校验和
为了在第一阶段挂载期间支持元数据校验和,不支持 GKI 的设备会安装以下模块的 ramdisk 变体。要添加对 GKI 的支持,请将模块移动到$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
例如,请参阅此更改列表。
虚拟 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
将其作为正常启动处理。
启动进入恢复模式时,启动过程会发生变化。 recovery + vendor_boot
+ boot
ramdisk 类似于现有的恢复过程,但内核是从boot
映像而不是从recovery
映像加载的。恢复模式的启动过程如下。
引导加载程序启动,然后执行以下操作:
- 将 recovery +
vendor_boot
+boot
ramdisk 推送到/
。 (如果 OEM 通过将它们添加到BOARD_RECOVERY_KERNEL_MODULES
来复制恢复 ramdisk 中的内核模块),vendor_boot
是可选的。) - 从
boot
分区运行内核。
- 将 recovery +
内核将 ramdisk 挂载到
/
然后从boot
ramdisk 执行/init
。第一阶段 init 开始,然后执行以下操作:
- 设置
IsRecoveryMode() == true
和ForceNormalBoot() == false
。 - 从
/lib/modules
加载供应商内核模块。 - 调用
DoFirstStageMount()
但跳过安装,因为IsRecoveryMode() == true
。 (设备不会释放 ramdisk(因为/
仍然相同),但会调用SetInitAvbVersionInRecovery()
。) - 从
recovery
ramdisk 的/system/bin/init
启动第二阶段 init。
- 设置
使 e2fsck 可用
设备 makefile 可以继承自:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
如果设备支持虚拟 A/B 但不支持压缩。virtual_ab_ota/compression.mk
如果设备支持虚拟 A/B 压缩。
产品 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
中的内核模块- 第一阶段 init 作为符号链接
/init -> /system/bin/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
。当设备启动进入恢复模式时,需要/system/bin/init
二进制文件来支持第一阶段和第二阶段 init。
当设备启动进入recovery
时, recovery
ramdisk 的内容如下:
-
/init -> /system/bin/init
(来自recovery
ramdisk) -
/system/bin/init
(来自recovery
ramdisk,由init_second_stage.recovery
,并从/init
执行)
设备启动进入Android时, vendor_boot
+ boot
ramdisk的内容如下:
-
/init
(来自 ramdisk,由init_first_stage
)
移动 fstab 文件
将安装到boot
ramdisk 的所有fstab
文件移动到vendor_ramdisk
和recovery
ramdisk。例如,请参阅此更改。
安装模块
如果需要,您可以将特定于设备的模块安装到vendor_ramdisk
和recovery
ramdisk(如果您没有要安装的任何特定于设备的模块,请跳过此步骤)。 init
不切换根目录。模块的vendor_ramdisk
变体安装到vendor_ramdisk
的根目录。模块的recovery
变体安装到recovery
ramdisk 的根目录。有关将模块安装到vendor_ramdisk
和recovery
ramdisk 的示例,请参阅第一阶段控制台和元数据校验和。
一级控制台
要安装模块的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
。
要添加第一阶段控制台所需的模块(例如 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 \
元数据校验和
为了在第一阶段挂载期间支持元数据校验和,不支持 GKI 的设备会安装以下模块的 ramdisk 变体。要添加对 GKI 的支持,请将模块移动到$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
要在恢复的第一阶段挂载期间支持元数据校验和,请启用这些模块的恢复变体并安装它们。
引导过程的变化
启动到 Android 时,启动过程不会改变。 vendor_boot
+ boot
ramdisk 类似于现有的引导过程,除了fstab
从vendor_boot
加载。因为system/bin/recovery
不存在, first_stage_init
将其作为正常启动处理。
启动进入恢复模式时,启动过程不会改变。恢复 ramdisk 的加载方式与现有恢复过程相同。内核是从recovery
映像加载的。恢复模式的启动过程如下。
引导加载程序启动,然后执行以下操作:
- 将恢复 ramdisk 推送到
/
。 - 从
recovery
分区运行内核。
- 将恢复 ramdisk 推送到
内核将 ramdisk 挂载到
/
然后执行/init
,这是从recovery
ramdisk 到/system/bin/init
的符号链接。第一阶段 init 开始,然后执行以下操作:
- 设置
IsRecoveryMode() == true
和ForceNormalBoot() == false
。 - 从
/lib/modules
加载供应商内核模块。 - 调用
DoFirstStageMount()
但跳过安装,因为IsRecoveryMode() == true
。 (设备不会释放 ramdisk(因为/
仍然相同),但会调用SetInitAvbVersionInRecovery()
。) - 从
recovery
ramdisk 的/system/bin/init
启动第二阶段 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