通用引导分区

在 Android 12 中,通用boot映像包含通用boot ramdisk 和通用内核映像 (GKI) 。要构建通用 ramdisk,请将特定于供应商的资源移出 ramdisk,以便通用 ramdisk 仅包含第一阶段init和包含时间戳信息的属性文件。

在以下设备上:

  • 不要使用专用的recovery分区,所有恢复位都从引导 ramdisk 移动到vendor_boot ramdisk。

  • 一定要使用专用的recovery分区,因为recovery ramdisk 是独立的,所以不需要更改recovery ramdisk。

建筑学

下图说明了运行 Android 12 的设备的架构。

启动或升级到 Android 12,没有专门的恢复

启动/升级设备,GKI,无专用恢复

图 1.使用 GKI 启动或升级到 Android 12 的设备,没有专门的恢复

启动或升级到 Android 12,专用和 A/B 恢复(专用 ramdisk)

启动/升级设备、GKI、专用和 A/B 恢复

图 2a。使用 GKI、专用和 A/B 恢复启动或升级到 Android 12 的设备

如果recovery为 A/B,请参考此图;即设备有recovery_arecovery_b分区。

启动或升级到 Android 12,专用和非 A/B 恢复(专用 ramdisk)

启动/升级设备、GKI、专用和非 A/B 恢复

图 2b。使用 GKI、专用和非 A/B 恢复启动或升级到 Android 12 的设备

如果recovery不是 A/B,请参考此图;也就是说,设备有一个名为recovery的分区,没有插槽后缀。

升级到 Android 12,recovery-as-boot (recovery-as-ramdisk)

启动/升级设备,无 GKI,恢复即启动

图 3.升级到 Android 12、无 GKI、恢复即启动的设备

升级到Android 12,专用恢复(专用ramdisk)

启动/升级设备,无 GKI,专用恢复

图 4.升级到 Android 12、无 GKI、专用恢复的设备

引导映像内容

在 Android 12 中,启动映像包含以下内容。

  • 通用boot映像
    • 标头版本V3V4
      • 用于 GKI boot.img 认证的boot_signature (仅限 v4)。认证的 GKI boot.img未签名用于验证启动。 OEM 仍必须使用特定于设备的AVB密钥对预构建的boot.img进行签名。
      • 通用GENERIC_KERNEL_CMDLINE cmdline
      • 通用内核映像
    • 通用boot ramdisk 映像
  • vendor_boot映像(有关详细信息,请参阅Vendor Boot Partitions
    • vendor_boot标头
      • 特定于设备的cmdline ( BOARD_KERNEL_CMDLINE )
    • vendor_boot ramdisk 映像
      • lib/modules
      • 恢复资源(如果没有专用恢复)
    • dtb图像
  • recovery图像
    • 标头版本 V2
      • 用于恢复的特定于设备的cmdline (如有必要)
      • 对于非 A/B 恢复分区,header 的内容必须是独立的;请参阅恢复映像。例如:
      • cmdline未连接到bootvendor_boot cmdline
      • 如有必要,标头指定恢复 DTBO。
      • 对于 A/B 恢复分区,可以从bootvendor_boot连接或推断内容。例如:
      • cmdline连接到bootvendor_boot cmdline
      • DTBO 可以从vendor_boot标头中推断出来。
    • recovery ramdisk 映像
      • 恢复资源
      • 对于非 A/B 恢复分区,ramdisk 的内容必须是独立的;请参阅恢复映像。例如:
      • lib/modules必须包含启动恢复模式所需的所有内核模块
      • 恢复 ramdisk 必须包含init
      • 对于 A/B 恢复分区,恢复 ramdisk 被添加到bootvendor_boot ramdisk,因此它不需要是独立的。例如:
      • 除了vendor_boot ramdisk 中的内核模块之外, lib/modules可能只包含启动恢复模式所需的其他内核模块。
      • /init处的符号链接可能存在,但它被引导映像中的第一阶段/init二进制文件所掩盖。

通用引导 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/

引导映像集成

构建标志控制如何构建bootrecoveryvendor_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/B recovery分区的设备必须将此变量设置为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_BOOTtrue ,架构如图3所示。

      • 设置BOARD_USES_RECOVERY_AS_BOOT为空,架构如图4所示。

    • 可以将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 \

这可确保linkershtoybox安装到$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继承,它安装了snapuserdvendor_ramdisk变体。

引导过程的变化

启动进入恢复或进入 Android 的过程不会改变,但以下情况除外:

  • Ramdisk build.prop移动到/second_stage_resources以便第二阶段init可以读取启动的构建时间戳。

因为资源从boot ramdisk 移动到vendor_boot ramdisk,连接bootvendor_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_arecovery_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 \

这可确保linkershtoybox安装到$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继承,它安装了snapuserdvendor_ramdisk变体。

引导过程的变化

启动到 Android 时,启动过程不会改变。 vendor_boot + boot ramdisk 类似于现有的引导过程,除了fstabvendor_boot加载。因为system/bin/recovery不存在, first_stage_init将其作为正常启动处理。

启动进入恢复模式时,启动过程会发生变化。 recovery + vendor_boot + boot ramdisk 类似于现有的恢复过程,但内核是从boot映像而不是从recovery映像加载的。恢复模式的启动过程如下。

  1. 引导加载程序启动,然后执行以下操作:

    1. 将 recovery + vendor_boot + boot ramdisk 推送到/ 。 (如果 OEM 通过将它们添加到BOARD_RECOVERY_KERNEL_MODULES来复制恢复 ramdisk 中的内核模块), vendor_boot是可选的。)
    2. boot分区运行内核。
  2. 内核将 ramdisk 挂载到/然后从boot ramdisk 执行/init

  3. 第一阶段 init 开始,然后执行以下操作:

    1. 设置IsRecoveryMode() == trueForceNormalBoot() == false
    2. /lib/modules加载供应商内核模块。
    3. 调用DoFirstStageMount()但跳过安装,因为IsRecoveryMode() == true 。 (设备不会释放 ramdisk(因为/仍然相同),但会调用SetInitAvbVersionInRecovery() 。)
    4. 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_ramdiskrecovery ramdisk。例如,请参阅此更改

安装模块

如果需要,您可以将特定于设备的模块安装到vendor_ramdiskrecovery ramdisk(如果您没有要安装的任何特定于设备的模块,请跳过此步骤)。 init不切换根目录。模块的vendor_ramdisk变体安装到vendor_ramdisk的根目录。模块的recovery变体安装到recovery ramdisk 的根目录。有关将模块安装到vendor_ramdiskrecovery ramdisk 的示例,请参阅第一阶段控制台元数据校验和

一级控制台

要安装模块的vendor_ramdisk变体,请使用以下命令:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

这可确保linkershtoybox安装到$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 类似于现有的引导过程,除了fstabvendor_boot加载。因为system/bin/recovery不存在, first_stage_init将其作为正常启动处理。

启动进入恢复模式时,启动过程不会改变。恢复 ramdisk 的加载方式与现有恢复过程相同。内核是从recovery映像加载的。恢复模式的启动过程如下。

  1. 引导加载程序启动,然后执行以下操作:

    1. 将恢复 ramdisk 推送到/
    2. recovery分区运行内核。
  2. 内核将 ramdisk 挂载到/然后执行/init ,这是从recovery ramdisk 到/system/bin/init的符号链接。

  3. 第一阶段 init 开始,然后执行以下操作:

    1. 设置IsRecoveryMode() == trueForceNormalBoot() == false
    2. /lib/modules加载供应商内核模块。
    3. 调用DoFirstStageMount()但跳过安装,因为IsRecoveryMode() == true 。 (设备不会释放 ramdisk(因为/仍然相同),但会调用SetInitAvbVersionInRecovery() 。)
    4. 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
  • 在构建时, system/etc/ramdisk/build.prop文件被添加到通用boot映像 ramdisk。该文件包含构建的时间戳信息。

  • 在运行时,第一阶段init在释放 ramdisk 之前将文件从 ramdisk复制tmpfs ,以便第二阶段init可以读取此文件以设置boot映像时间戳属性。