In Android 12, the generic boot image, referred to as
Generic Kernel Image (GKI),
contains the generic ramdisk and the GKI kernel.
For devices launching with Android 13, the generic
ramdisk is removed from the boot image and placed in a separate init_boot
image. This change leaves the boot image with only the
GKI kernel.
For upgrading devices that continue to use Android 12
or older kernel versions, the generic ramdisk remains where it was with
no requirement for a new init_boot image.
To build a generic ramdisk, move vendor-specific resources out of the ramdisk
such that the generic ramdisk contains only first stage init and a property
file that contains timestamp information.
On devices that:
Don't use a dedicated
recoverypartition, all recovery bits move from the generic ramdisk tovendor_bootramdisk.Do use a dedicated
recoverypartition, no change in therecoveryramdisk is needed because therecoveryramdisk is self-contained.
Architecture
The following diagrams illustrate the architecture for devices running Android
12 and higher.
Device launching with Android 13 have a new
init_boot image containing the generic ramdisk.
Devices upgrading from Android 12 to Android
13 use the same architecture as they did with
Android 12.
Launch with Android 13, no dedicated recovery
Figure 1. Devices launching or upgrading to Android 13, with GKI, no dedicated recovery.
Launch with Android 13, dedicated and A/B recovery (dedicated ramdisk)
Figure 2. Devices launching or upgrading to Android 13, with GKI, dedicated and A/B recovery.
Refer to this figure if the device has recovery_a and recovery_b partitions.
Launch with Android 13, dedicated and non-A/B recovery (dedicated ramdisk)
Figure 3. Devices launching or upgrading to Android 13, with GKI, dedicated and non-A/B recovery.
Refer to this figure if the device has a partition named recovery without a
slot suffix.
Launch or upgrade to Android 12, no dedicated recovery
Figure 4. Devices launching or upgrading to Android 12, with GKI, no dedicated recovery.
Launch or upgrade to Android 12, dedicated and A/B recovery (dedicated ramdisk)
Figure 5. Devices launching or upgrading to Android 12, with GKI, dedicated and A/B recovery.
Refer to this figure if the device has recovery_a and recovery_b partitions.
Launch or upgrade to Android 12, dedicated and non-A/B recovery (dedicated ramdisk)
Figure 6. Devices launching or upgrading to Android 12, with GKI, dedicated and non-A/B recovery.
Refer to this figure if the device has a partition named recovery without a
slot suffix.
Upgrade to Android 12, recovery-as-boot (recovery-as-ramdisk)
Figure 7. Devices upgrading to Android 12, no GKI, recovery-as-boot.
Upgrade to Android 12, dedicated recovery (dedicated ramdisk)
Figure 8. Devices upgrading to Android 12, no GKI, dedicated recovery.
Boot images contents
The Android boot images contain the following.
init_bootimage added for devices launching with Android 13- Header version V4
- Generic ramdisk image
Generic
bootimage- Header version V3 or
V4
- A
boot_signaturefor GKI boot.img certification (v4 only). The certified GKIboot.imgisn't signed for verified boot. OEMs must still sign the prebuiltboot.imgwith a device-specific AVB key. - Generic
cmdline(GENERIC_KERNEL_CMDLINE) - GKI kernel
- A
- Generic ramdisk image
- Only included in
bootimages from Android 12 and earlier
- Only included in
- Header version V3 or
V4
vendor_bootimage (for details, see Vendor Boot Partitions)vendor_bootheader- Device-specific
cmdline(BOARD_KERNEL_CMDLINE)
- Device-specific
vendor_bootramdisk imagelib/modules- Recovery resources (if no dedicated recovery)
dtbimage
recoveryimage- Header version V2
- Device-specific
cmdlinefor recovery, if necessary - For non-A/B recovery partition, contents of the header must be standalone; see Recovery Images. For example:
cmdlineisn't concatenated tobootandvendor_bootcmdline.- Header specifies recovery DTBO, if necessary.
- For A/B recovery partition, contents can be concatenated or inferred
from
bootandvendor_boot. For example: cmdlineis concatenated tobootandvendor_bootcmdline.- DTBO can be inferred from
vendor_bootheader.
- Device-specific
recoveryramdisk image- Recovery resources
- For non-A/B recovery partition, contents of the ramdisk must be standalone; see Recovery Images. For example:
lib/modulesmust contain all kernel modules required to boot recovery mode- The recovery ramdisk must contain
init. - For A/B recovery partition, the recovery ramdisk is prepended to the
generic and
vendor_bootramdisk, hence it doesn't need to be standalone. For example: lib/modulesmight contain only additional kernel modules required to boot recovery mode besides kernel modules invendor_bootramdisk.- The symlink at
/initmight exist, but it is overshadowed by the the first-stage/initbinary in boot image.
- Header version V2
Generic ramdisk image contents
The generic ramdisk contains the following components.
initsystem/etc/ramdisk/build.propro.PRODUCT.bootimg.* buildprops- Empty directories for mount points:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/ first_stage_ramdisk/- Duplicated empty directories for mount points:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
- Duplicated empty directories for mount points:
Boot image integration
Build flags control how init_boot, boot, recovery, and vendor_boot
images are built. The value of a boolean board variable must be the string
true or be empty (which is the default).
TARGET_NO_KERNEL. This variable indicates if the build uses a prebuilt boot image. If this variable is set totrue, then setBOARD_PREBUILT_BOOTIMAGEto the location of the prebuilt boot image (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img)BOARD_USES_RECOVERY_AS_BOOT. This variable indicates whether the device uses therecoveryimage as thebootimage. When using GKI, this variable is empty and recovery resources should be moved tovendor_boot.BOARD_USES_GENERIC_KERNEL_IMAGE. This variable indicates that the board uses GKI. This variable doesn't affect sysprops orPRODUCT_PACKAGES.This is the board-level GKI switch; all of the following variables are restricted by this variable.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. This variable controls whether ramdisk recovery resources are built tovendor_boot.When set to
true, recovery resources are built tovendor-ramdisk/only and aren't built torecovery/root/.When empty, recovery resources are built to
recovery/root/only and aren't built tovendor-ramdisk/.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. This variable controls whether GSI AVB keys are built tovendor_boot.When set to
true, ifBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:Is set, GSI AVB keys are built to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb.Is unset, GSI AVB keys are built to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb.
When empty, if
BOARD_RECOVERY_AS_ROOT:Is set, GSI AVB keys are built to
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb.Is unset, GSI AVB keys are built to
$ANDROID_PRODUCT_OUT/ramdisk/avb.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. This variable controls whether therecoveryimage contains a kernel or not. Devices launching with Android 12 and using A/Brecoverypartition must set this variable totrue. Devices launching with Android 12 and using non-A/B must set this variable tofalseto keep the recovery image self-contained.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. This variable controls whether$OUT/boot*.imgis copied toIMAGES/under target files.aosp_arm64must set this variable totrue.Other devices must leave this variable empty.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. This variable controls whetherinit_boot.imgis generated and sets the size. When set, the generic ramdisk is added to theinit_boot.imginstead ofboot.imgand requires theBOARD_AVB_INIT_BOOT*variables to be set for chained vbmeta.
Allowed combinations
| Component or variable | Upgrade device without recovery partition | Upgrade device with recovery partition | Launch device without recovery partition | Launch device with A/B recovery partition | Launch device with non-A/B recovery partition | aosp_arm64 |
|---|---|---|---|---|---|---|
Contains boot |
yes | yes | yes | yes | yes | yes |
Contains init_boot (Android 13) |
no | no | yes | yes | yes | yes |
Contains vendor_boot |
optional | optional | yes | yes | yes | no |
Contains recovery |
no | yes | no | yes | yes | no |
BOARD_USES_RECOVERY_AS_BOOT |
true |
empty | empty | empty | empty | empty |
BOARD_USES_GENERIC_KERNEL_IMAGE |
empty | empty | true |
true |
true |
true |
PRODUCT_BUILD_RECOVERY_IMAGE |
empty | true or empty |
empty | true or empty |
true or empty |
empty |
BOARD_RECOVERYIMAGE_PARTITION_SIZE |
empty | > 0 | empty | > 0 | > 0 | empty |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT |
empty | empty | true |
empty | empty | empty |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT |
empty | empty | true |
true |
true |
empty |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE |
empty | empty | empty | true |
empty | empty |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES |
empty | empty | empty | empty | empty | true |
Devices with a dedicated recovery partition can set
PRODUCT_BUILD_RECOVERY_IMAGE to true or empty. For these devices, if
BOARD_RECOVERYIMAGE_PARTITION_SIZE is set, a recovery image is built.
Enable chained vbmeta for boot
Chained vbmeta must be enabled for the boot and init_boot images. Specify
the following:
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
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
For an example, refer to this change.
System-as-root
System-as-root isn't supported for devices that use GKI. On
such devices, BOARD_BUILD_SYSTEM_ROOT_IMAGE must be empty. System-as-root
also isn't supported for devices that use dynamic partitions.
Product configurations
Devices that use the generic ramdisk must install a list of files that are
allowed to be installed to the ramdisk. To do so, specify the following in
device.mk:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
The generic_ramdisk.mk file also prevents other makefiles from accidentally
installing other files to the ramdisk (move such files to vendor_ramdisk
instead).
Set up devices
Setup instructions differ between devices launching with Android 13, upgrading to Android 12, and launching with Android 12. Android 13, are setup similar to how they were with Android 12
Devices Upgrading to Android 12:
Can preserve the value of
BOARD_USES_RECOVERY_AS_BOOT. If they do so, they're using legacy configs and new build variables must be empty. If such devices:Can set
BOARD_USES_RECOVERY_AS_BOOTto empty. If they do so, they're using new configurations. If such devices:
Devices launching with Android 12 must set
BOARD_USES_RECOVERY_AS_BOOTto empty and use new configurations. If such devices:
Because aosp_arm64 builds only GKI (and not vendor_boot or recovery), it
isn't a complete target. For aosp_arm64build configurations, refer to
generic_arm64.
Option 1: No dedicated recovery partition
Devices without a recovery partition contain the generic boot image in the
boot partition. The vendor_boot ramdisk contains all recovery resources,
including lib/modules (with vendor kernel modules). On such devices, the
product configuration inherits from
generic_ramdisk.mk.
Set BOARD values
Set the following values:
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
Init binaries and symlinks
The vendor_boot ramdisk can contain an /init to /system/bin/init symlink,
and init_second_stage.recovery at /system/bin/init. However, because the
generic ramdisk is concatenated after the vendor_boot ramdisk, the /init
symlink is overwritten. When the device boots into recovery, the
/system/bin/init binary is needed to support second stage init. The contents
of vendor_boot + generic ramdisks are as follows:
/init(from generic ramdisk, built frominit_first_stage)/system/bin/init(fromvendor_ramdisk, built frominit_second_stage.recovery)
Move fstab files
Move any fstab files that were installed to the generic ramdisk to
vendor_ramdisk. For an example, refer to this
change.
Install modules
You can install device-specific modules to vendor_ramdisk (skip
this step if you don't have any device-specific modules to install).
Use the
vendor_ramdiskvariant of the module when the module installs to the/first_stage_ramdisk. This module should be available afterinitswitches root into/first_stage_ramdiskbut beforeinitswitches root into/system. For examples, see Metadata checksums and Virtual A/B compression.Use the
recoveryvariant of the module when the module installs to/. This module should be available beforeinitswitches root into/first_stage_ramdisk. For details on installing modules to/, see First stage console.
First stage console
Because the first stage console starts before init switches root into
/first_stage_ramdisk, you need to install the recovery variant of modules.
By default, both module variants are installed to
build/make/target/product/base_vendor.mk, so if the device makefile inherits
from that file you don't need to explicitly install the recovery variant.
To explicitly install the recovery modules, use the following.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
This ensures that the linker, sh, and toybox install to
$ANDROID_PRODUCT_OUT/recovery/root/system/bin, which then installs to
/system/bin under the vendor_ramdisk.
To add modules needed for the first stage console (for example, adbd), use the following.
PRODUCT_PACKAGES += adbd.recovery
This ensures that the specified modules install to
$ANDROID_PRODUCT_OUT/recovery/root/system/bin, which then installs to
/system/bin under the vendor_ramdisk.
Metadata checksums
To support metadata
checksums
during first stage mount, devices that don't support GKI install the ramdisk
variant of the following modules. To add support for GKI, move the modules to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
For an example, refer to this changelist.
Virtual A/B compression
To support virtual A/B compression, snapuserd must be installed to
vendor_ramdisk. The device should inherit from
virtual_ab_ota/compression.mk,
which installs the vendor_ramdisk variant of snapuserd.
Changes to the boot process
The process of booting into recovery or into Android doesn't change, with the following exception:
- Ramdisk
build.propmoves into/second_stage_resourcesso that second stageinitcan read the build timestamp of boot.
Because resources move from generic ramdisk to vendor_boot ramdisk, the result
of concatenating generic ramdisk to vendor_boot ramdisk doesn't change.
Make e2fsck available
The device makefiles can inherit from:
virtual_ab_ota/launch_with_vendor_ramdisk.mkif the device supports virtual A/B but not compression.virtual_ab_ota/compression.mkif the device supports virtual A/B compression.
The product makefiles install
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck. At
runtime, the first stage init switches root into /first_stage_ramdisk then
executes /system/bin/e2fsck.
Option 2a: Dedicated and A/B recovery partition
Use this option for devices with A/B recovery partitions; that is,
the device has a recovery_a and recovery_b partition. Such devices include
A/B and Virtual A/B devices of which the recovery partition is updateable, with
the following configuration:
AB_OTA_PARTITIONS += recovery
The vendor_boot ramdisk contains the vendor bits of the ramdisk and vendor
kernel modules, including the following:
Device-specific
fstabfileslib/modules(includes vendor kernel modules)
The recovery ramdisk contains all recovery resources. On such devices, the
product configuration inherits from
generic_ramdisk.mk.
Set BOARD values
Set the following values for devices with A/B recovery partition:
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
Init binaries and symlinks
The recovery ramdisk can contain an /init -> /system/bin/init symlink, and
init_second_stage.recovery at /system/bin/init. However, because the boot
ramdisk is concatenated after the recovery ramdisk, the /init symlink is
overwritten. When the device boots into recovery mode, the /system/bin/init
binary is needed to support second stage init.
When the device boots into recovery, the contents of recovery +
vendor_boot + generic ramdisks are as follows:
/init(from ramdisk, built frominit_first_stage)/system/bin/init(fromrecoveryramdisk, built frominit_second_stage.recovery, and executed from/init)
When the device boots into Android, the contents of vendor_boot + generic
ramdisks are as follows:
/init(from generic ramdisk, built frominit_first_stage)
Move fstab files
Move any fstab files that were installed to the generic ramdisk to the
vendor_ramdisk. For an example, refer to this
change.
Install modules
Optionally, you can install device-specific modules to vendor_ramdisk (skip
this step if you don't have any device-specific modules to install). Init
doesn't switch root. The vendor_ramdisk variant of modules installs to the
root of vendor_ramdisk. For examples on installing modules to
vendor_ramdisk, see First stage console, Metadata
checksums, and Virtual A/B
compression.
First stage console
To install the vendor_ramdisk variant of the modules, use the following:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
This ensures that the linker, sh, and toybox install to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, which then installs to
/system/bin under the vendor_ramdisk.
To add modules needed for the first stage console (for example, adbd), enable
the vendor_ramdisk variant of these modules by uploading relevant patches to
AOSP, then use the following,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
This ensures that the specified modules install to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin. If the vendor_boot ramdisk
is loaded in recovery mode, the module is also available in recovery. If the
vendor_boot ramdisk isn't loaded in recovery mode, the device can optionally
install adbd.recovery as well.
Metadata checksums
To support metadata
checksums
during first stage mount, devices that don't support GKI install the ramdisk
variant of the following modules. To add support for GKI, move the modules to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
For an example, refer to this changelist.
Virtual A/B compression
To support Virtual A/B compression, snapuserd must be installed to
vendor_ramdisk. The device should inherit from
virtual_ab_ota/compression.mk,
which installs the vendor_ramdisk variant of snapuserd.
Changes to the boot process
When booting into Android, the boot process doesn't change. The vendor_boot +
generic ramdisk is similar to the existing boot process, except that fstab
loads from vendor_boot. Because system/bin/recovery doesn't exist,
first_stage_init handles it as a normal boot.
When booting into recovery mode, the boot process changes. The recovery +
vendor_boot + generic ramdisk is similar to the existing recovery process, but
the kernel is loaded from the boot image instead of from the recovery image.
The boot process for recovery mode is as follows.
Bootloader starts, then does the following:
- Pushes recovery +
vendor_boot+ generic ramdisk to/. (If the OEM duplicates kernel modules in recovery ramdisk by adding them toBOARD_RECOVERY_KERNEL_MODULES),vendor_bootis optional.) - Runs the kernel from the
bootpartition.
- Pushes recovery +
Kernel mounts ramdisk to
/then executes/initfrom the generic ramdisk.First stage init starts, then does the following:
- Sets
IsRecoveryMode() == trueandForceNormalBoot() == false. - Loads vendor kernel modules from
/lib/modules. - Calls
DoFirstStageMount()but skips mounting becauseIsRecoveryMode() == true. (The device doesn't free ramdisk (because/is still the same) but does callSetInitAvbVersionInRecovery().) - Starts second stage init from
/system/bin/initfromrecoveryramdisk.
- Sets
Make e2fsck available
The device makefiles can inherit from:
virtual_ab_ota/launch_with_vendor_ramdisk.mkif the device supports virtual A/B but not compression.virtual_ab_ota/compression.mkif the device supports virtual A/B compression.
The product makefiles install
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck. At
runtime, the first stage init executes /system/bin/e2fsck.
Option 2b: Dedicated and non-A/B recovery partition
Use this option for devices with a non-A/B recovery partition; that is,
the device has a partition named recovery without a slot suffix. Such devices
include:
- non-A/B devices;
- A/B and Virtual A/B devices, of which the recovery partition isn't updateable. (This is unusual.)
The vendor_boot ramdisk contains the vendor bits of the ramdisk and vendor
kernel modules, including the following:
- Device-specific
fstabfiles lib/modules(includes vendor kernel modules)
The recovery image must be self-contained. It must contain
all required resources to boot the recovery mode, including:
- The kernel image
- The DTBO image
- Kernel modules in
lib/modules - First-stage init as a symlink
/init -> /system/bin/init - Second-stage init binary
/system/bin/init - Device-specific
fstabfiles - All other recovery resources, including the
recoverybinary
On such devices, the product configuration inherits
from generic_ramdisk.mk.
Set BOARD values
Set the following values for non-A/B devices:
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
Init binaries and symlinks
The recovery ramdisk must contain an /init -> /system/bin/init symlink, and
init_second_stage.recovery at /system/bin/init. When the device boots into
recovery mode, the /system/bin/init binary is needed to support both first
stage and second stage init.
When the device boots into recovery, the contents of recovery ramdisks are
as follows:
/init -> /system/bin/init(fromrecoveryramdisk)/system/bin/init(fromrecoveryramdisk, built frominit_second_stage.recovery, and executed from/init)
When the device boots into Android, the contents of vendor_boot + generic
ramdisks are as follows:
/init(from ramdisk, built frominit_first_stage)
Move fstab files
Move any fstab files that were installed to the generic ramdisk to the
vendor_ramdisk and recovery ramdisk. For an example, refer to this
change.
Install modules
You can install device-specific modules to vendor_ramdisk and
recovery ramdisk (skip
this step if you don't have any device-specific modules to install). init
doesn't switch root. The vendor_ramdisk variant of modules installs to the
root of vendor_ramdisk. The recovery variant of modules installs to the
root of recovery ramdisk. For examples on installing modules to
vendor_ramdisk and recovery ramdisk, se
First stage console and Metadata
checksums.
First stage console
To install the vendor_ramdisk variant of the modules, use the following:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
This ensures that the linker, sh, and toybox install to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, which then installs to
/system/bin under the vendor_ramdisk.
To add modules needed for the first stage console (for example, adbd), enable
the vendor_ramdisk variant of these modules by uploading relevant patches to
AOSP, then use the following,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
This ensures that the specified modules install to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin.
To install the recovery variant of the modules, replace vendor_ramdisk with
recovery:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
Metadata checksums
To support metadata
checksums
during first stage mount, devices that don't support GKI install the ramdisk
variant of the following modules. To add support for GKI, move the modules to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
To support metadata checksums during first stage mount in recovery, enable the recovery variant of these modules and install them as well.
Changes to the boot process
When booting into Android, the boot process doesn't change. The vendor_boot +
generic ramdisk is similar to the existing boot process, except that fstab
loads from vendor_boot. Because system/bin/recovery doesn't exist,
first_stage_init handles it as a normal boot.
When booting into recovery mode, the boot process doesn't change. The recovery
ramdisk is loaded in the same way as the existing recovery process.
The kernel is loaded from the recovery image. The
boot process for recovery mode is as follows.
Bootloader starts, then does the following:
- Pushes recovery ramdisk to
/. - Runs the kernel from the
recoverypartition.
- Pushes recovery ramdisk to
Kernel mounts ramdisk to
/then executes/init, which is a symlink to/system/bin/initfrom therecoveryramdisk.First stage init starts, then does the following:
- Sets
IsRecoveryMode() == trueandForceNormalBoot() == false. - Loads vendor kernel modules from
/lib/modules. - Calls
DoFirstStageMount()but skips mounting becauseIsRecoveryMode() == true. (The device doesn't free ramdisk (because/is still the same) but does callSetInitAvbVersionInRecovery().) - Starts second stage init from
/system/bin/initfromrecoveryramdisk.
- Sets
Boot image timestamps
The following code is an example boot image timestamp file:
####################################
# 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
At build time, a
system/etc/ramdisk/build.propfile is added to the generic ramdisk. This file contains timestamp information of the build.At runtime, first stage
initcopies files from the ramdisk totmpfsbefore freeing the ramdisk so that second stageinitcan read this file to setbootimage timestamp properties.