В Android 12 общий boot
образ, называемый Generic Kernel Image (GKI) , содержит общий виртуальный диск и ядро GKI.
Для устройств, запускаемых с Android 13, общий виртуальный диск удаляется из boot
образа и помещается в отдельный образ init_boot
. Это изменение оставляет в boot
образе только ядро GKI.
При обновлении устройств, которые продолжают использовать Android 12 или более ранние версии ядра, общий виртуальный диск остается там, где он был, без необходимости создания нового образа init_boot
.
Чтобы создать универсальный виртуальный диск, переместите ресурсы, специфичные для поставщика, из виртуального диска так, чтобы универсальный виртуальный диск содержал только init
первого этапа и файл свойств, содержащий информацию о временных метках.
На устройствах, которые:
Не используйте выделенный раздел
recovery
, все биты восстановления перемещаются с общего виртуального диска на виртуальныйvendor_boot
.Используйте выделенный раздел
recovery
, никаких изменений в виртуальном дискеrecovery
не требуется, поскольку виртуальный дискrecovery
является автономным.
Архитектура
На следующих диаграммах показана архитектура устройств под управлением Android 12 и более поздних версий. Устройство, запускаемое с Android 13, имеет новый образ init_boot
, содержащий общий виртуальный диск. Устройства, обновляющиеся с Android 12 до Android 13, используют ту же архитектуру, что и в Android 12.
Запуск с Android 13, без специального восстановления
Рис. 1. Устройства, запускающие или обновляющиеся до Android 13 с GKI, без специального восстановления.
Запуск с Android 13, выделенным восстановлением и восстановлением A/B (выделенный виртуальный диск).
Рисунок 2. Устройства, запускающие или обновляющиеся до Android 13 с GKI, выделенным восстановлением и восстановлением A/B.
См. этот рисунок, если на устройстве есть разделы recovery_a
и recovery_b
.
Запуск с Android 13, выделенным восстановлением и восстановлением без A/B (выделенный виртуальный диск)
Рисунок 3. Устройства, запускаемые или обновляющиеся до Android 13, с GKI, выделенным восстановлением и восстановлением без A/B.
См. этот рисунок, если на устройстве есть раздел с именем recovery
без суффикса слота.
Запустите или обновите Android 12, без специального восстановления.
Рисунок 4. Устройства, запускающие или обновляющиеся до Android 12 с GKI, без специального восстановления.
Запустите или обновите Android 12, выделенное восстановление и восстановление A/B (выделенный виртуальный диск).
Рис. 5. Устройства, запускаемые или обновляющиеся до Android 12 с GKI, выделенным восстановлением и восстановлением A/B.
См. этот рисунок, если на устройстве есть разделы recovery_a
и recovery_b
.
Запустите или обновите Android 12, выделенное восстановление и восстановление без A/B (выделенный виртуальный диск).
Рисунок 6. Устройства, запускающие или обновляющиеся до Android 12 с GKI, выделенным восстановлением и восстановлением без A/B.
См. этот рисунок, если на устройстве есть раздел с именем recovery
без суффикса слота.
Обновление до Android 12, восстановление как загрузочное (восстановление как виртуальный диск)
Рисунок 7. Обновление устройств до Android 12, без GKI, восстановление при загрузке.
Обновление до Android 12, выделенное восстановление (выделенный виртуальный диск)
Рис. 8. Обновление устройств до Android 12, без GKI, выделенное восстановление.
Содержимое загрузочных образов
Загрузочные образы Android содержат следующее.
Добавлен образ
init_boot
для устройств, запускаемых с Android 13.- Версия заголовка V4
- Общий образ виртуального диска
Общий
boot
образ- Версия заголовка V3 или V4
-
boot_signature
для сертификации boot.img GKI (только v4). Сертифицированный GKIboot.img
не подписан для проверенной загрузки. OEM-производители по-прежнему должны подписывать готовыйboot.img
ключом AVB для конкретного устройства. - Общая
cmdline
(GENERIC_KERNEL_CMDLINE
) - Ядро GKI
-
- Общий образ виртуального диска
- Включено только в
boot
образы Android 12 и более ранних версий.
- Включено только в
- Версия заголовка V3 или V4
vendor_boot
(подробнее см. разделы Vendor Boot Partitions )-
vendor_boot
-
cmdline
для конкретного устройства (BOARD_KERNEL_CMDLINE
)
-
-
vendor_boot
образ виртуального диска-
lib/modules
- Ресурсы восстановления (если нет специального восстановления)
-
- изображение
dtb
-
образ
recovery
- Версия заголовка V2
-
cmdline
для конкретного устройства для восстановления, если необходимо. - Для раздела восстановления, отличного от A/B, содержимое заголовка должно быть автономным; см. Образы восстановления . Например:
-
cmdline
не объединяется сboot
vendor_boot
cmdline
. - Заголовок указывает восстановление ДТБО, если это необходимо.
- Для раздела восстановления A/B содержимое может быть объединено или выведено из
boot
vendor_boot
. Например: -
cmdline
объединяется сboot
vendor_boot
cmdline
. - DTBO можно получить из
vendor_boot
.
-
- образ виртуального диска
recovery
- Ресурсы восстановления
- Для раздела восстановления, отличного от A/B, содержимое виртуального диска должно быть автономным; см. Образы восстановления . Например:
-
lib/modules
должен содержать все модули ядра, необходимые для загрузки режима восстановления. - RAM-диск восстановления должен содержать
init
. - Для раздела восстановления A/B виртуальный диск восстановления добавляется к общему виртуальному диску и
vendor_boot
, поэтому он не обязательно должен быть автономным. Например: -
lib/modules
может содержать только дополнительные модули ядра, необходимые для режима восстановления загрузки, помимо модулей ядра вvendor_boot
. - Символическая ссылка на
/init
может существовать, но она затмевается двоичным файлом/init
первого этапа в загрузочном образе.
- Версия заголовка V2
Содержимое общего образа виртуального диска
Общий виртуальный диск содержит следующие компоненты.
-
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/
- Дублированные пустые каталоги для точек монтирования:
Интеграция загрузочного образа
Флаги сборки управляют тем, как создаются образы init_boot
, 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. Эта переменная не влияет на sysprops илиPRODUCT_PACKAGES
.Это переключатель GKI на уровне платы; все следующие переменные ограничены этой переменной.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. Эта переменная определяет, будут ли ресурсы восстановления виртуального диска встроены в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 и использующие разделrecovery
A/B, должны установить для этой переменной значениеtrue
. Устройства, запускаемые с Android 12 и использующие не A/B, должны установить для этой переменной значениеfalse
, чтобы образ восстановления был автономным.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. Эта переменная определяет, будет ли$OUT/boot*.img
копироваться вIMAGES/
в целевых файлах.aosp_arm64
должен установить для этой переменной значениеtrue
.Другие устройства должны оставить эту переменную пустой.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. Эта переменная контролирует, создается лиinit_boot.img
, и задает размер. Если этот параметр установлен, общий виртуальный диск добавляется вinit_boot.img
вместоboot.img
и требует установки переменныхBOARD_AVB_INIT_BOOT*
для связанного vbmeta .
Разрешенные комбинации
Компонент или переменная | Обновление устройства без раздела восстановления | Обновите устройство с помощью раздела восстановления | Запустить устройство без раздела восстановления | Запустите устройство с разделом восстановления A/B. | Запустите устройство с разделом восстановления, отличным от A/B. | aosp_arm64 |
---|---|---|---|---|---|---|
Содержит boot | да | да | да | да | да | да |
Содержит init_boot (Android 13) | нет | нет | да | да | да | да |
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_RESOURCES_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
и init_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
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
В качестве примера см. это изменение .
Система как root
Система с правами root не поддерживается для устройств, использующих GKI. На таких устройствах BOARD_BUILD_SYSTEM_ROOT_IMAGE
должен быть пустым. Система с правами root также не поддерживается для устройств, использующих динамические разделы.
Конфигурации продукта
Устройства, использующие общий виртуальный диск, должны установить список файлов, которые разрешено устанавливать на виртуальный диск. Для этого укажите в device.mk
следующее:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Файл generic_ramdisk.mk
также предотвращает случайную установку других файлов на виртуальный диск другими make-файлами (вместо этого переместите такие файлы в vendor_ramdisk
).
Настройка устройств
Инструкции по настройке различаются на устройствах, запускаемых с Android 13, при обновлении до Android 12 и запускаемых с Android 12. Android 13 настраиваются аналогично тому, как они были настроены для Android 12.
Устройства, обновляющиеся до Android 12:
Можно сохранить значение
BOARD_USES_RECOVERY_AS_BOOT
. Если они это делают, они используют устаревшие конфигурации, а переменные новой сборки должны быть пустыми. Если такие устройства:Можно установить
BOARD_USES_RECOVERY_AS_BOOT
пустым. Если они это делают, они используют новые конфигурации. Если такие устройства:Не используйте выделенный раздел
recovery
: архитектура показана на рис. 1 , а параметр настройки устройства — Вариант 1 .Используйте выделенный раздел
recovery
, архитектура которого показана на рисунке 2a или рисунке 2b , а параметр настройки устройства — вариант 2a или вариант 2b .
На устройствах, запускаемых с Android 12, необходимо установить пустое значение
BOARD_USES_RECOVERY_AS_BOOT
и использовать новые конфигурации. Если такие устройства:Не используйте выделенный раздел
recovery
: архитектура показана на рис. 1 , а параметр настройки устройства — Вариант 1 .Используйте выделенный раздел
recovery
, архитектура которого показана на рисунке 2a или рисунке 2b , а параметр настройки устройства — вариант 2a или вариант 2b .
Поскольку aosp_arm64
собирает только GKI (а не vendor_boot
или восстановление), он не является полной целью. Информацию о конфигурациях сборки aosp_arm64
см. в generic_arm64
.
Вариант 1. Нет выделенного раздела восстановления.
Устройства без раздела recovery
содержат общий boot
образ в boot
разделе. RAM- vendor_boot
содержит все ресурсы восстановления, включая 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
Инициализация двоичных файлов и символических ссылок
RAM- vendor_boot
может содержать символическую ссылку /init
на /system/bin/init
и init_second_stage.recovery
в /system/bin/init
. Однако, поскольку общий виртуальный диск объединяется после виртуального vendor_boot
, символическая ссылка /init
перезаписывается. Когда устройство загружается в режим восстановления, двоичный файл /system/bin/init
необходим для поддержки второго этапа инициализации. Содержимое vendor_boot
+ общих виртуальных дисков следующее:
-
/init
(из общего виртуального диска, созданного изinit_first_stage
) -
/system/bin/init
(изvendor_ramdisk
, созданный изinit_second_stage.recovery
)
Переместить файлы fstab
Переместите все файлы fstab
, которые были установлены на общий виртуальный диск, в vendor_ramdisk
. В качестве примера см. это изменение .
Установить модули
Вы можете установить модули для конкретного устройства в vendor_ramdisk
(пропустите этот шаг, если у вас нет модулей для конкретного устройства для установки).
Используйте вариант
vendor_ramdisk
, когда модуль устанавливается на/first_stage_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
, поэтому, если make-файл устройства наследуется от этого файла, вам не нужно явно устанавливать вариант recovery
.
Чтобы явно установить модули восстановления, используйте следующее.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
Это гарантирует, что linker
, sh
и toybox
будут установлены в $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, который затем будет установлен в /system/bin
под vendor_ramdisk
.
Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), используйте следующее.
PRODUCT_PACKAGES += adbd.recovery
Это гарантирует, что указанные модули будут установлены в $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, который затем будет установлен в /system/bin
под vendor_ramdisk
.
Контрольные суммы метаданных
Для поддержки контрольных сумм метаданных во время монтирования на первом этапе устройства, не поддерживающие GKI, устанавливают варианты с виртуальным диском следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Для примера обратитесь к этому списку изменений .
Виртуальное A/B-сжатие
Для поддержки виртуального A/B-сжатия необходимо установить snapuserd
в vendor_ramdisk
. Устройство должно наследовать от virtual_ab_ota snapuserd
virtual_ab_ota/compression.mk
, который устанавливает вариант vendor_ramdisk
.
Изменения в процессе загрузки
Процесс загрузки в рекавери или в Андроид не меняется, за исключением следующего:
- Ramdisk
build.prop
перемещается в/second_stage_resources
, чтобы второй этапinit
мог прочитать временную метку сборки при загрузке.
Поскольку ресурсы перемещаются с общего виртуального диска на виртуальный vendor_boot
, результат объединения общего виртуального диска с виртуальным vendor_boot
не меняется.
Сделать e2fsck доступным
Файлы сборки устройства могут наследовать от:
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.
Используйте эту опцию для устройств с разделами recovery
A/B; то есть на устройстве есть разделы recovery_a
и recovery_b partition
. К таким устройствам относятся устройства A/B и Virtual A/B, раздел восстановления которых можно обновлять, со следующей конфигурацией:
AB_OTA_PARTITIONS += recovery
vendor_boot
содержит биты поставщика модулей виртуального диска и ядра поставщика, включая следующее:
Файлы
fstab
для конкретного устройстваlib/modules
(включая модули ядра поставщика)
RAM-диск recovery
содержит все ресурсы восстановления. На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk
.
Установите значения BOARD
Установите следующие значения для устройств с разделом recovery
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 := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Инициализация двоичных файлов и символических ссылок
RAM-диск recovery
может содержать символическую ссылку /init -> /system/bin/init
и init_second_stage.recovery
в /system/bin/init
. Однако, поскольку загрузочный виртуальный диск объединяется после виртуального диска recovery
, символическая ссылка /init
перезаписывается. Когда устройство загружается в режим восстановления, двоичный файл /system/bin/init
необходим для поддержки второго этапа инициализации.
Когда устройство загружается в recovery
, содержимое recovery
+ vendor_boot
+generic ramdisk выглядит следующим образом:
-
/init
(с виртуального диска, созданного изinit_first_stage
) -
/system/bin/init
(из виртуального дискаrecovery
, созданного изinit_second_stage.recovery
и выполненного из/init
)
Когда устройство загружается в Android, содержимое vendor_boot
+ generic ramdisk выглядит следующим образом:
-
/init
(из общего виртуального диска, созданного изinit_first_stage
)
Переместить файлы fstab
Переместите все файлы fstab
, которые были установлены на общий виртуальный диск, в vendor_ramdisk
. В качестве примера см. это изменение .
Установить модули
При желании вы можете установить модули для конкретного устройства в vendor_ramdisk
(пропустите этот шаг, если у вас нет модулей для конкретного устройства для установки). Init
не переключает root. Вариант 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
, который затем будет установлен в /system/bin
под vendor_ramdisk
.
Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), включите vendor_ramdisk
этих модулей, загрузив соответствующие патчи в AOSP, затем используйте следующее:
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Это гарантирует, что указанные модули будут установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
. Если vendor_boot
загружен в режиме восстановления, модуль также доступен в recovery
. Если виртуальный vendor_boot
не загружен в режиме восстановления, устройство также может дополнительно установить adbd.recovery
.
Контрольные суммы метаданных
Для поддержки контрольных сумм метаданных во время монтирования на первом этапе устройства, которые не поддерживают GKI, устанавливают вариант ramdisk следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Для примера обратитесь к этому списку изменений .
Виртуальное A/B-сжатие
Для поддержки виртуального A/B-сжатия необходимо установить snapuserd
в vendor_ramdisk
. Устройство должно наследовать от virtual_ab_ota snapuserd
virtual_ab_ota/compression.mk
, который устанавливает вариант vendor_ramdisk
.
Изменения в процессе загрузки
При загрузке Android процесс загрузки не меняется. Общий виртуальный vendor_boot
+ аналогичен существующему процессу загрузки, за исключением того, что fstab
загружается vendor_boot
. Поскольку system/bin/recovery
не существует, first_stage_init
обрабатывает его как обычную загрузку.
При загрузке в режим восстановления процесс загрузки меняется. Recovery + vendor_boot
+generic ramdisk аналогичен существующему процессу восстановления, но ядро загружается из boot
образа, а не из образа recovery
. Процесс загрузки в режиме восстановления выглядит следующим образом.
Загрузчик запускается, затем делает следующее:
- Помещает восстановление +
vendor_boot
+generic ramdisk в/
. (Если OEM-производитель дублирует модули ядра на виртуальном диске восстановления, добавляя их вBOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
не является обязательным.) - Запускает ядро из
boot
раздела.
- Помещает восстановление +
Ядро монтирует виртуальный диск в
/
а затем выполняет/init
с общего виртуального диска.Запускается первый этап инициализации, затем выполняются следующие действия:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
, но пропускает монтирование, посколькуIsRecoveryMode() == true
. (Устройство не освобождает виртуальный диск (потому что/
все тот же), но вызываетSetInitAvbVersionInRecovery()
.) - Запускает второй этап инициализации из
/system/bin/init
с виртуального дискаrecovery
.
- Устанавливает
Сделать e2fsck доступным
Файлы сборки устройства могут наследовать от:
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.
Используйте эту опцию для устройств с разделом recovery
, отличным от A/B; то есть на устройстве есть раздел с именем recovery
без суффикса слота. К таким устройствам относятся:
- устройства не-A/B;
- Устройства A/B и Virtual A/B, раздел восстановления которых не подлежит обновлению. (Это необычно.)
vendor_boot
содержит биты поставщика модулей виртуального диска и ядра поставщика, включая следующее:
- Файлы
fstab
для конкретного устройства -
lib/modules
(включая модули ядра поставщика)
Образ recovery
должен быть автономным. Он должен содержать все необходимые ресурсы для загрузки режима восстановления, в том числе:
- Образ ядра
- Изображение ДТБО
- Модули ядра в
lib/modules
- Инициализация первого этапа как символическая ссылка
/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
Инициализация двоичных файлов и символических ссылок
RAM-диск recovery
должен содержать символическую ссылку /init -> /system/bin/init
и init_second_stage.recovery
в /system/bin/init
. Когда устройство загружается в режим восстановления, двоичный файл /system/bin/init
необходим для поддержки как первого, так и второго этапа инициализации.
Когда устройство загружается в recovery
, содержимое виртуальных дисков recovery
следующее:
-
/init -> /system/bin/init
(с виртуального дискаrecovery
) -
/system/bin/init
(из виртуального дискаrecovery
, созданного изinit_second_stage.recovery
и выполненного из/init
)
Когда устройство загружается в Android, содержимое vendor_boot
+ generic ramdisk выглядит следующим образом:
-
/init
(с виртуального диска, созданного изinit_first_stage
)
Переместить файлы fstab
Переместите все файлы fstab
, которые были установлены на общий виртуальный диск, на vendor_ramdisk
и виртуальный диск recovery
. В качестве примера см. это изменение .
Установить модули
Вы можете установить модули для конкретного устройства на vendor_ramdisk
и виртуальный диск recovery
(пропустите этот шаг, если у вас нет модулей для конкретного устройства для установки). init
не переключает корень. Вариант vendor_ramdisk
устанавливается в корень vendor_ramdisk
. Вариант recovery
модулей устанавливается в корень виртуального диска recovery
. Примеры установки модулей на vendor_ramdisk
и виртуальный диск recovery
см. в разделе Консоль первого этапа и Контрольные суммы метаданных .
Консоль первого этапа
Чтобы установить вариант vendor_ramdisk
, используйте следующее:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Это гарантирует, что linker
, sh
и toybox
будут установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, который затем будет установлен в /system/bin
под vendor_ramdisk
.
Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), включите vendor_ramdisk
этих модулей, загрузив соответствующие патчи в AOSP, затем используйте следующее:
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, устанавливают варианты с виртуальным диском следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Чтобы поддерживать контрольные суммы метаданных во время первого этапа монтирования в процессе восстановления, включите вариант восстановления этих модулей и также установите их.
Изменения в процессе загрузки
При загрузке Android процесс загрузки не меняется. Общий виртуальный vendor_boot
+ аналогичен существующему процессу загрузки, за исключением того, что fstab
загружается vendor_boot
. Поскольку system/bin/recovery
не существует, first_stage_init
обрабатывает его как обычную загрузку.
При загрузке в режиме восстановления процесс загрузки не меняется. RAM-диск восстановления загружается так же, как и существующий процесс восстановления. Ядро загружается из образа recovery
. Процесс загрузки в режиме восстановления выглядит следующим образом.
Загрузчик запускается, затем делает следующее:
- Перемещает виртуальный диск восстановления в
/
. - Запускает ядро из раздела
recovery
.
- Перемещает виртуальный диск восстановления в
Ядро монтирует виртуальный диск в
/
затем выполняет/init
, который является символической ссылкой на/system/bin/init
с виртуального дискаrecovery
.Запускается первый этап инициализации, затем выполняются следующие действия:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
, но пропускает монтирование, посколькуIsRecoveryMode() == true
. (Устройство не освобождает виртуальный диск (потому что/
все тот же), но вызываетSetInitAvbVersionInRecovery()
.) - Запускает второй этап инициализации из
/system/bin/init
с виртуального дискаrecovery
.
- Устанавливает
Временные метки загрузочного образа
Следующий код представляет собой пример файла временной метки 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
добавляется к общему виртуальному диску. Этот файл содержит информацию о временной метке сборки.Во время выполнения первый этап
init
копирует файлы с виртуального диска вtmpfs
перед освобождением виртуального диска, чтобы второй этапinit
мог прочитать этот файл для установки свойств метки времениboot
образа.
В Android 12 общий boot
образ, называемый Generic Kernel Image (GKI) , содержит общий виртуальный диск и ядро GKI.
Для устройств, запускаемых с Android 13, общий виртуальный диск удаляется из boot
образа и помещается в отдельный образ init_boot
. Это изменение оставляет в boot
образе только ядро GKI.
При обновлении устройств, которые продолжают использовать Android 12 или более ранние версии ядра, общий виртуальный диск остается там, где он был, без необходимости создания нового образа init_boot
.
Чтобы создать универсальный виртуальный диск, переместите ресурсы конкретного поставщика из виртуального диска так, чтобы общий виртуальный диск содержал только init
первого этапа и файл свойств, содержащий информацию о временных метках.
На устройствах, которые:
Не используйте выделенный раздел
recovery
, все биты восстановления перемещаются с общего виртуального диска на виртуальныйvendor_boot
.Используйте выделенный раздел
recovery
, никаких изменений в виртуальном дискеrecovery
не требуется, поскольку виртуальный дискrecovery
является автономным.
Архитектура
На следующих диаграммах показана архитектура устройств под управлением Android 12 и более поздних версий. Устройство, запускаемое с Android 13, имеет новый образ init_boot
, содержащий общий виртуальный диск. Устройства, обновляющиеся с Android 12 до Android 13, используют ту же архитектуру, что и в Android 12.
Запуск с Android 13, без специального восстановления
Рисунок 1. Устройства, запускающие или обновляющиеся до Android 13 с GKI, без специального восстановления.
Запуск с Android 13, выделенным восстановлением и восстановлением A/B (выделенный виртуальный диск).
Рисунок 2. Устройства, запускающие или обновляющиеся до Android 13 с GKI, выделенным восстановлением и восстановлением A/B.
См. этот рисунок, если на устройстве есть разделы recovery_a
и recovery_b
.
Запуск с Android 13, выделенным восстановлением и восстановлением без A/B (выделенный виртуальный диск)
Рисунок 3. Устройства, запускающие или обновляющиеся до Android 13, с GKI, выделенным восстановлением и восстановлением без A/B.
См. этот рисунок, если на устройстве есть раздел с именем recovery
без суффикса слота.
Запустите или обновите Android 12, без специального восстановления.
Рисунок 4. Устройства, запускающие или обновляющиеся до Android 12 с GKI, без специального восстановления.
Запустите или обновите Android 12, выделенное восстановление и восстановление A/B (выделенный виртуальный диск).
Рис. 5. Устройства, запускаемые или обновляющиеся до Android 12 с GKI, выделенным восстановлением и восстановлением A/B.
См. этот рисунок, если на устройстве есть разделы recovery_a
и recovery_b
.
Запустите или обновите Android 12, выделенное восстановление и восстановление без A/B (выделенный виртуальный диск).
Рисунок 6. Устройства, запускающие или обновляющиеся до Android 12 с GKI, выделенным восстановлением и восстановлением без A/B.
См. этот рисунок, если на устройстве есть раздел с именем recovery
без суффикса слота.
Обновление до Android 12, восстановление как загрузочное (восстановление как виртуальный диск)
Рисунок 7. Обновление устройств до Android 12, без GKI, восстановление при загрузке.
Обновление до Android 12, выделенное восстановление (выделенный виртуальный диск)
Рис. 8. Обновление устройств до Android 12, без GKI, выделенное восстановление.
Содержимое загрузочных образов
Загрузочные образы Android содержат следующее.
Добавлен образ
init_boot
для устройств, запускаемых с Android 13.- Версия заголовка V4
- Общий образ виртуального диска
Общий
boot
образ- Версия заголовка V3 или V4
-
boot_signature
для сертификации boot.img GKI (только v4). Сертифицированный GKIboot.img
не подписан для проверенной загрузки. OEM-производители по-прежнему должны подписывать готовыйboot.img
ключом AVB для конкретного устройства. - Общая
cmdline
(GENERIC_KERNEL_CMDLINE
) - Ядро GKI
-
- Общий образ виртуального диска
- Включено только в
boot
образы Android 12 и более ранних версий.
- Включено только в
- Версия заголовка V3 или V4
vendor_boot
(подробнее см. разделы загрузки поставщика )-
vendor_boot
-
cmdline
для конкретного устройства (BOARD_KERNEL_CMDLINE
)
-
-
vendor_boot
образ виртуального диска-
lib/modules
- Ресурсы восстановления (если нет специального восстановления)
-
- изображение
dtb
-
образ
recovery
- Версия заголовка V2
-
cmdline
для конкретного устройства для восстановления, если необходимо. - Для раздела восстановления, отличного от A/B, содержимое заголовка должно быть автономным; см. Образы восстановления . Например:
-
cmdline
не объединяется сboot
vendor_boot
cmdline
. - Заголовок указывает восстановление ДТБО, если это необходимо.
- Для раздела восстановления A/B содержимое может быть объединено или выведено из
boot
vendor_boot
. Например: -
cmdline
объединяется сboot
vendor_boot
cmdline
. - DTBO можно получить из
vendor_boot
.
-
- образ виртуального диска
recovery
- Ресурсы восстановления
- Для раздела восстановления, отличного от A/B, содержимое виртуального диска должно быть автономным; см. Образы восстановления . Например:
-
lib/modules
должен содержать все модули ядра, необходимые для загрузки режима восстановления. - RAM-диск восстановления должен содержать
init
. - Для раздела восстановления A/B виртуальный диск восстановления добавляется к общему виртуальному диску и
vendor_boot
, поэтому он не обязательно должен быть автономным. Например: -
lib/modules
может содержать только дополнительные модули ядра, необходимые для режима восстановления загрузки, помимо модулей ядра вvendor_boot
. - Символическая ссылка на
/init
может существовать, но она затмевается двоичным файлом/init
первого этапа в загрузочном образе.
- Версия заголовка V2
Содержимое общего образа виртуального диска
Общий виртуальный диск содержит следующие компоненты.
-
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/
- Дублированные пустые каталоги для точек монтирования:
Интеграция загрузочного образа
Флаги сборки управляют тем, как создаются образы init_boot
, 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. Эта переменная не влияет на 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
Partition, должны установить эту переменную наtrue
. Устройства, запущенные с Android 12 и с использованием Non-A/B, должны установить эту переменную наfalse
, чтобы сохранить их изображение.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. Эта переменная контролирует, копируется ли$OUT/boot*.img
наIMAGES/
в целевых файлах.aosp_arm64
должен установить эту переменную наtrue
.Другие устройства должны оставить эту переменную пустой.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. Эта переменная контролирует, генерируется лиinit_boot.img
и устанавливает размер. При установке общий ramdisk добавляется вinit_boot.img
вместоboot.img
и требует переменныхBOARD_AVB_INIT_BOOT*
, которые должны быть установлены для цепочки vbmeta .
Разрешены комбинации
Компонент или переменная | Обновление устройства без переживания | Обновление устройства с разделением восстановления | Запуск устройства без переживания | Запуск устройства с A/B -восстановлением | Устройство запуска с разделением восстановления не A/B | AOSP_ARM64 |
---|---|---|---|---|---|---|
Содержит boot | да | да | да | да | да | да |
Содержит init_boot (Android 13) | нет | нет | да | да | да | да |
Содержит 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_RESOURCES_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
или EMPLE. Для этих устройств, если устанавливается BOARD_RECOVERYIMAGE_PARTITION_SIZE
, создается изображение recovery
.
Включить цепные vbmeta для загрузки
Цепочка vbmeta должна быть включена для изображений boot
и init_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
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
Для примера обратитесь к этому изменению .
Система как корень
System-As-Root не поддерживается для устройств, которые используют GKI. На таких устройствах BOARD_BUILD_SYSTEM_ROOT_IMAGE
должен быть пустым. System-As-Root также не поддерживается для устройств, которые используют динамические разделы.
Конфигурации продукта
Устройства, которые используют универсальный Ramdisk, должны установить список файлов, которые разрешены для установки в Ramdisk. Для этого укажите следующее в device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Файл generic_ramdisk.mk
также предотвращает другие make -файлы случайной установки других файлов в ramdisk (вместо этого перемещайте такие файлы в vendor_ramdisk
).
Настройка устройств
Инструкции по настройке различаются между запусками устройств с Android 13, обновлением до Android 12 и запуска с Android 12. Android 13, настраиваются аналогично тому, как они были с Android 12
Устройства обновляются до Android 12:
Может сохранить значение
BOARD_USES_RECOVERY_AS_BOOT
. Если они это делают, они используют устаревшие конфигурации, и новые переменные сборки должны быть пустыми. Если такие устройства:Может установить
BOARD_USES_RECOVERY_AS_BOOT
, чтобы опустошать. Если они это делают, они используют новые конфигурации. Если такие устройства:Не используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 1 , а параметр «Настройка устройства» - опция 1 .Используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 2A или рисунке 2B , а параметр «Настройка устройства» - опция 2A или опция 2B .
Устройства, запущенные с Android 12, должны установить
BOARD_USES_RECOVERY_AS_BOOT
, чтобы опустошать и использовать новые конфигурации. Если такие устройства:Не используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 1 , а параметр «Настройка устройства» - опция 1 .Используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 2A или рисунке 2B , а параметр «Настройка устройства» - опция 2A или опция 2B .
Поскольку aosp_arm64
строит только GKI (а не vendor_boot
или восстановление), это не полная цель. Для конфигураций aosp_arm64
см. generic_arm64
.
Вариант 1: Нет выделенного разделения восстановления
Устройства без раздела recovery
содержат общее boot
изображение в boot
разделе. vendor_boot
Ramdisk содержит все ресурсы восстановления, включая lib/modules
(с модулями ядра поставщика). На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk
.
Установить значения доски
Установите следующие значения:
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
symlink и init_second_stage.recovery
at /system/bin/init
. Однако, поскольку общий рамдиск объединяется после vendor_boot
ramdisk, символа /init
перезаписана. Когда устройство загружается в восстановление, для поддержки второго этапа Bynare Travel Trabily /system/bin/init
. Содержание vendor_boot
+ общие рамдиски следующие:
-
/init
(из Generic Ramdisk, построенный изinit_first_stage
) -
/system/bin/init
(отvendor_ramdisk
, построенный изinit_second_stage.recovery
)
Переместите файлы FSTAB
Переместите любые файлы fstab
, которые были установлены в общий Ramdisk в vendor_ramdisk
. Для примера обратитесь к этому изменению .
Установить модули
Вы можете установить модули, специфичные для устройства, на vendor_ramdisk
(пропустите этот шаг, если у вас нет никаких модулей, специфичных для устройства для установки).
Используйте вариант
vendor_ramdisk
модуля, когда модуль устанавливается на/first_stage_ramdisk
. Этот модуль должен быть доступен после того, какinit
инициализируют корневые в/first_stage_ramdisk
, но перед переключаниемinit
переключают корневые в/system
. Для примеров см. Проверки метаданных и виртуальное сжатие A/B .Используйте вариант
recovery
модуля, когда модуль устанавливается на/
. Этот модуль должен быть доступен до того, какinit
переключать корневые в/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
, который затем устанавливает в /system/bin
под vendor_ramdisk
.
Чтобы добавить модули, необходимые для консоли первой стадии (например, ADBD), используйте следующее.
PRODUCT_PACKAGES += adbd.recovery
Это гарантирует, что указанные модули устанавливают на $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, который затем устанавливает в /system/bin
под vendor_ramdisk
.
Метаданные контрольные суммы
Чтобы поддерживать контрольные суммы метаданных во время первого этапа, устройства, которые не поддерживают GKI, установить вариант Ramdisk следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Для примера обратитесь к этому измененному .
Виртуальное сжатие A/B.
Чтобы поддержать виртуальное сжатие A/B, snapuserd
должен быть установлен на vendor_ramdisk
. Устройство должно наследовать от virtual_ab_ota/compression.mk
, который устанавливает вариант vendor_ramdisk
в snapuserd
.
Изменения в процессе загрузки
Процесс загрузки в восстановление или в Android не изменяется, за следующим исключением:
- Ramdisk
build.prop
перемещается в/second_stage_resources
так что второйinit
может прочитать временную метку Build Boot.
Поскольку ресурсы переходят от общего рамдиска к vendor_boot
ramdisk, результат объединения общего рамдиска с vendor_boot
ramdisk не меняется.
Сделайте E2FSCK доступным
Устройство Makefiles может наследовать от:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
Если устройство поддерживает виртуальный A/B, но не сжатие.virtual_ab_ota/compression.mk
Если устройство поддерживает Virtual A/B Compression.
Продукт Makefiles устанавливает $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
содержит все ресурсы восстановления. На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk
.
Установить значения доски
Установите следующие значения для устройств с разделами 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
symlink и init_second_stage.recovery
at /system/bin/init
. Однако, поскольку Ramdisk объединяется после recovery
, символизированная символа /init
перезаписывается. Когда устройство загружается в режим восстановления, для поддержки второго этапа бинарного инициации необходимо двойник /system/bin/init
.
Когда устройство загружается в recovery
, содержимое recovery
+ vendor_boot
+ общие рамдиски следующие:
-
/init
(из ramdisk, построенный изinit_first_stage
) -
/system/bin/init
(изrecovery
Ramdisk, построенный изinit_second_stage.recovery
и выполнено из/init
)
Когда устройство загружается в Android, содержимое vendor_boot
+ Generic Ramdisks заключается в следующем:
-
/init
(из Generic Ramdisk, построенный изinit_first_stage
)
Переместите файлы FSTAB
Переместите любые файлы fstab
, которые были установлены в общий Ramdisk в 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
, который затем устанавливает в /system/bin
под vendor_ramdisk
.
Чтобы добавить модули, необходимые для консоли первой стадии (например, ADBD), включите вариант vendor_ramdisk
этих модулей путем загрузки соответствующих патчей в AOSP, затем используйте следующее,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Это гарантирует, что указанные модули устанавливают на $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
. Если ramdisk vendor_boot
загружен в режиме восстановления, модуль также доступен в recovery
. Если ramdisk vendor_boot
не загружен в режиме восстановления, устройство также может также установить adbd.recovery
.
Метаданные контрольные суммы
Чтобы поддерживать контрольные суммы метаданных во время первого этапа, устройства, которые не поддерживают GKI, установить вариант Ramdisk следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Для примера обратитесь к этому измененному .
Виртуальное сжатие A/B.
Чтобы поддержать виртуальное сжатие A/B, snapuserd
должен быть установлен на vendor_ramdisk
. Устройство должно наследовать от virtual_ab_ota/compression.mk
, который устанавливает вариант vendor_ramdisk
в snapuserd
.
Изменения в процессе загрузки
При загрузке в Android процесс загрузки не меняется. vendor_boot
+ generic ramdisk аналогичен существующему процессу загрузки, за исключением того, что fstab
загружается от vendor_boot
. Поскольку system/bin/recovery
не существует, first_stage_init
обрабатывает ее как обычную загрузку.
При загрузке в режим восстановления процесс загрузки меняется. Recovery + vendor_boot
+ generic ramdisk аналогичен существующему процессу восстановления, но ядро загружается из boot
изображения вместо изображения recovery
. Процесс загрузки для режима восстановления выглядит следующим образом.
Загрузчик запускается, затем выполняет следующее:
- Толкает восстановление +
vendor_boot
+ generic ramdisk to/
. (Если OEM Duplicate модули ядра при восстановлении Ramdisk, добавив их вBOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
не является обязательным.) - Запускает ядро из
boot
раздела.
- Толкает восстановление +
Ядра Mounts Ramdisk to
/
затем выполняет/init
из общего рамдиска.Первый этап начинается, затем делает следующее:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
, но пропускает монтаж, потому чтоIsRecoveryMode() == true
. (Устройство не бесплатно Ramdisk (потому что/
остается таким же), но вызываетSetInitAvbVersionInRecovery()
.) - Запускает второй этап init из
/system/bin/init
отrecovery
ramdisk.
- Устанавливает
Сделайте E2FSCK доступным
Устройство Makefiles может наследовать от:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
Если устройство поддерживает виртуальный A/B, но не сжатие.virtual_ab_ota/compression.mk
Если устройство поддерживает Virtual A/B Compression.
Продукт Makefiles устанавливает $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
. Во время выполнения первое этап init
выполняет /system/bin/e2fsck
.
Вариант 2B: выделенный и не-A/B-раздел восстановления
Используйте эту опцию для устройств с разделом recovery
не A/B; То есть устройство имеет раздел с именем recovery
без суффикса слота. Такие устройства включают в себя:
- устройства не-A/B;
- A/B и виртуальные устройства A/B, из которых раздел восстановления не обновляется. (Это необычно.)
vendor_boot
Ramdisk содержит биты поставщиков модулей ядра Ramdisk и поставщика, включая следующее:
- Файлы
fstab
, специфичные для устройства -
lib/modules
(включает в себя модули ядра поставщика)
Образ recovery
должен быть автономным. Он должен содержать все необходимые ресурсы для загрузки режима восстановления, включая:
- Изображение ядра
- Изображение DTBO
- Модули ядра в
lib/modules
- Первая стадия Init как Symlink
/init -> /system/bin/init
- Второй стадий инициатор Binary
/system/bin/init
- Файлы
fstab
, специфичные для устройства - Все остальные ресурсы восстановления, в том числе бинарник
recovery
На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk
.
Установить значения доски
Установите следующие значения для устройств Non-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
должен содержать /init -> /system/bin/init
symlink и init_second_stage.recovery
at /system/bin/init
. Когда устройство загружается в режим восстановления, для поддержки как первой ступени, так и второй этапа /system/bin/init
Init.
Когда устройство загружается в recovery
, содержимое recovery
Ramdisks заключается в следующем:
-
/init -> /system/bin/init
(отrecovery
ramdisk) -
/system/bin/init
(изrecovery
Ramdisk, построенный изinit_second_stage.recovery
и выполнено из/init
)
Когда устройство загружается в Android, содержимое vendor_boot
+ Generic Ramdisks заключается в следующем:
-
/init
(из ramdisk, построенный изinit_first_stage
)
Переместите файлы FSTAB
Переместите любые файлы fstab
, которые были установлены в общий рамдиск в vendor_ramdisk
и recovery
ramdisk. Для примера обратитесь к этому изменению .
Установить модули
Вы можете установить модули, специфичные для устройства, на vendor_ramdisk
и recovery
ramdisk (пропустите этот шаг, если у вас нет никаких модулей для установки, специфичных для устройства). init
не переключает корень. Вариант vendor_ramdisk
модулей устанавливается на корень vendor_ramdisk
. Вариант recovery
модулей устанавливается на корень из recovery
Ramdisk. Для примеров по установке модулей для vendor_ramdisk
и recovery
ramdisk, консоли первой стадии SE и метаданных .
Консоль первой стадии
Чтобы установить вариант vendor_ramdisk
модулей, используйте следующее:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Это гарантирует, что linker
, sh
и toybox
устанавливают на $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, который затем устанавливает в /system/bin
под vendor_ramdisk
.
Чтобы добавить модули, необходимые для консоли первой стадии (например, ADBD), включите вариант vendor_ramdisk
этих модулей путем загрузки соответствующих патчей в AOSP, затем используйте следующее,
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 \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Чтобы поддерживать контрольные суммы метаданных во время первой сцены в восстановлении, включите вариант восстановления этих модулей и установите их.
Изменения в процессе загрузки
При загрузке в Android процесс загрузки не меняется. vendor_boot
+ generic ramdisk аналогичен существующему процессу загрузки, за исключением того, что fstab
загружается от vendor_boot
. Поскольку system/bin/recovery
не существует, first_stage_init
обрабатывает ее как обычную загрузку.
При загрузке в режим восстановления процесс загрузки не меняется. Рэмдиск восстановления загружается так же, как и существующий процесс восстановления. Ядро загружается из изображения recovery
. Процесс загрузки для режима восстановления выглядит следующим образом.
Загрузчик запускается, затем выполняет следующее:
- Подталкивает восстановление Ramdisk до
/
. - Запускает ядро от раздела
recovery
.
- Подталкивает восстановление Ramdisk до
Ядра Mounts Ramdisk to
/
затем выполняет/init
, которая является символом/system/bin/init
изrecovery
Ramdisk.Первый этап начинается, затем делает следующее:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
, но пропускает монтаж, потому чтоIsRecoveryMode() == true
. (Устройство не бесплатно Ramdisk (потому что/
остается таким же), но вызываетSetInitAvbVersionInRecovery()
.) - Запускает второй этап init из
/system/bin/init
отrecovery
ramdisk.
- Устанавливает
Загрузочные временные метки
Следующий код является примером файла boot
Image примером:
####################################
# 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
добавляется в общий рамдиск. Этот файл содержит информацию о временной метке сборки.В Runtime, первая стадия
init
копирует файлы из Ramdisk вtmpfs
, прежде чем освободить Ramdisk , чтобы второй стадииinit
этот файл, чтобы установить свойства временных лапоточных метровboot
.
В Android 12 общее изображение boot
, называемое общим изображением ядра (GKI) , содержит общий рамдиск и ядро GKI.
Для запуска устройств с Android 13 универсальный рамдиск удаляется из boot
изображения и помещается в отдельное изображение init_boot
. Это изменение покидает изображение boot
только с ядром GKI.
Для модернизации устройств, которые продолжают использовать версии Android 12 или более старые ядра, общий рамдиск остается там, где он не требовался для нового изображения init_boot
.
Чтобы построить общий рамдиск, вы перемещаете ресурсы, специфичные для поставщиков, так, чтобы общий рамдиск содержит только init
первого этапа и файл свойств, который содержит информацию о временной метке.
На устройствах, которые:
Не используйте выделенный раздел
recovery
, все биты восстановления перемещаются от общего рамдиска кvendor_boot
ramdisk.Используйте выделенный раздел
recovery
, не требуется изменений вrecovery
, потому что Ramdiskrecovery
Ramdisk является автономным.
Архитектура
Следующие диаграммы иллюстрируют архитектуру для устройств под управлением Android 12 и выше. Запуск устройства с Android 13 имеет новое изображение init_boot
, содержащее общий рамдиск. Устройства обновляются с Android 12 до Android 13, используют ту же архитектуру, что и с Android 12.
Запуск с Android 13, без специального восстановления
Рисунок 1. Устройства, запуска или обновление до Android 13, с GKI, без специального восстановления.
Запуск с Android 13, Jexicated и A/B Recovery (выделенный Ramdisk)
Рисунок 2. Устройства, запуска или обновление до Android 13, с GKI, выделенным и A/B -восстановлением.
Обратитесь к этому рисунку, если у устройства есть разделы recovery_a
и recovery_b
.
Запуск с Android 13, выделенным и не-A/B Recovery (выделенный Ramdisk)
Рисунок 3. Устройства, запуска или обновление до Android 13, с GKI, выделенным и не A/B-восстановлением.
Обратитесь к этому рисунку, если у устройства есть раздел с именем recovery
без суффикса слота.
Запустить или обновить до Android 12, без специального восстановления
Рисунок 4. Устройства, запуска или обновление до Android 12, с GKI, без специального восстановления.
Запустить или обновить до Android 12, выделенный и A/B -восстановление (выделенный Ramdisk)
Рисунок 5. Устройства, запуска или обновление до Android 12, с GKI, выделенным и A/B -восстановлением.
Обратитесь к этому рисунку, если у устройства есть разделы recovery_a
и recovery_b
.
Запуск или обновление до Android 12, выделенного и не-A/B Recovery (выделенный Ramdisk)
Рисунок 6. Устройства, запуска или обновление до Android 12, с GKI, выделенным и не-A/B-восстановлением.
Обратитесь к этому рисунку, если у устройства есть раздел с именем recovery
без суффикса слота.
Обновление до Android 12, Recovery-AS-Boot (восстановление как рамдиск)
Рисунок 7. Устройства обновляются до Android 12, без GKI, восстановление как Boot.
Обновление до Android 12, выделенное восстановление (выделенный Ramdisk)
Рисунок 8. Устройства обновляются до Android 12, без GKI, выделенное восстановление.
Загрузки изображений содержимое
Изображения загрузки Android содержат следующее.
Изображение
init_boot
добавлено для запуска устройств с Android 13- Версия заголовка V4
- Общее изображение Рамдиска
Общее изображение
boot
- Версия заголовка V3 или V4
-
boot_signature
для сертификации gki boot.img (только v4). Сертифицированный GKIboot.img
не подписан для проверенной загрузки. OEM-производители все еще должны подписать предварительно построенныйboot.img
с помощью AVB -ключа, специфичного для устройства. - Generic
cmdline
(GENERIC_KERNEL_CMDLINE
) - GKI ядро
-
- Общее изображение Рамдиска
- Включены только в
boot
изображения от Android 12 и раньше
- Включены только в
- Версия заголовка V3 или V4
Изображение
vendor_boot
(для получения подробной информации см. Разделы загрузки поставщика )- Заголовок
vendor_boot
-
cmdline
, специфичный для устройства (BOARD_KERNEL_CMDLINE
)
-
-
vendor_boot
Ramdisk Image-
lib/modules
- Ресурсы восстановления (если нет выделенного восстановления)
-
-
dtb
изображение
- Заголовок
recovery
изображения- Версия заголовка V2
- CMDLine
cmdline
для восстановления, при необходимости - Для раздела по восстановлению не A/B содержимое заголовка должно быть автономным; Смотрите изображения восстановления . Например:
-
cmdline
не объединяется сboot
иvendor_boot
cmdline
. - Заголовок Указывает восстановление DTBO, при необходимости.
- Для раздела восстановления A/B содержимое может быть объединено или выведено из
boot
иvendor_boot
. Например: -
cmdline
объединяется сboot
иvendor_boot
cmdline
. - DTBO может быть выведен из заголовка
vendor_boot
.
- CMDLine
-
recovery
Ramdisk Image- Восстановление ресурсов
- Для раздела по восстановлению не A/B содержимое рамдиска должно быть автономным; Смотрите изображения восстановления . Например:
-
lib/modules
должны содержать все модули ядра, необходимые для режима восстановления загрузки - Рэмдиск восстановления должен содержать
init
. - Для раздела восстановления A/B, Recovery Ramdisk готовит к Generic и
vendor_boot
Ramdisk, следовательно, он не должен быть автономным. Например: -
lib/modules
могут содержать только дополнительные модули ядра, необходимые для режима восстановления, помимо модулей ядра вvendor_boot
Ramdisk. - Symlink AT
/init
может существовать, но она омрачена бинарной первой стадии/init
в загрузке.
- Версия заголовка V2
Общее содержимое изображения рамдиска
Общий рамдиск содержит следующие компоненты.
-
init
-
system/etc/ramdisk/build.prop
-
ro. PRODUCT .bootimg.* build
реквизит - Пустые каталоги для монтирующих точек:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
-
first_stage_ramdisk/
- Дублированные пустые каталоги для Mount Points:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- Дублированные пустые каталоги для Mount Points:
Интеграция изображения загрузки
Постройте флаги управления Как создаются изображения init_boot
, 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. Эта переменная не влияет на 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
Partition, должны установить эту переменную наtrue
. Устройства, запущенные с Android 12 и с использованием Non-A/B, должны установить эту переменную наfalse
, чтобы сохранить их изображение восстановления.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. Эта переменная контролирует, копируется ли$OUT/boot*.img
наIMAGES/
в целевых файлах.aosp_arm64
должен установить эту переменную наtrue
.Другие устройства должны оставить эту переменную пустой.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. Эта переменная контролирует, генерируется лиinit_boot.img
и устанавливает размер. При установке общий ramdisk добавляется вinit_boot.img
вместоboot.img
и требует переменныхBOARD_AVB_INIT_BOOT*
, которые должны быть установлены для цепочки vbmeta .
Разрешены комбинации
Компонент или переменная | Обновление устройства без переживания | Обновление устройства с разделением восстановления | Запуск устройства без переживания | Запуск устройства с A/B -восстановлением | Устройство запуска с разделением восстановления не A/B | AOSP_ARM64 |
---|---|---|---|---|---|---|
Содержит boot | да | да | да | да | да | да |
Содержит init_boot (Android 13) | нет | нет | да | да | да | да |
Содержит 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_RESOURCES_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
или EMPLE. Для этих устройств, если устанавливается BOARD_RECOVERYIMAGE_PARTITION_SIZE
, создается изображение recovery
.
Включить цепные vbmeta для загрузки
Цепочка vbmeta должна быть включена для изображений boot
и init_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
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
Для примера обратитесь к этому изменению .
Система как корень
System-As-Root не поддерживается для устройств, которые используют GKI. На таких устройствах BOARD_BUILD_SYSTEM_ROOT_IMAGE
должен быть пустым. System-As-Root также не поддерживается для устройств, которые используют динамические разделы.
Конфигурации продукта
Устройства, которые используют универсальный Ramdisk, должны установить список файлов, которые разрешены для установки в Ramdisk. Для этого укажите следующее в device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Файл generic_ramdisk.mk
также предотвращает другие make -файлы случайной установки других файлов в ramdisk (вместо этого перемещайте такие файлы в vendor_ramdisk
).
Настройка устройств
Инструкции по настройке различаются между запусками устройств с Android 13, обновлением до Android 12 и запуска с Android 12. Android 13, настраиваются аналогично тому, как они были с Android 12
Устройства обновляются до Android 12:
Может сохранить значение
BOARD_USES_RECOVERY_AS_BOOT
. Если они это делают, они используют устаревшие конфигурации, и новые переменные сборки должны быть пустыми. Если такие устройства:Может установить
BOARD_USES_RECOVERY_AS_BOOT
, чтобы опустошать. Если они это делают, они используют новые конфигурации. Если такие устройства:Не используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 1 , а параметр «Настройка устройства» - опция 1 .Используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 2A или рисунке 2B , а параметр «Настройка устройства» - опция 2A или опция 2B .
Устройства, запущенные с Android 12, должны установить
BOARD_USES_RECOVERY_AS_BOOT
, чтобы опустошать и использовать новые конфигурации. Если такие устройства:Не используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 1 , а параметр «Настройка устройства» - опция 1 .Используйте выделенный раздел
recovery
, архитектура, как показано на рисунке 2A или рисунке 2B , а параметр «Настройка устройства» - опция 2A или опция 2B .
Поскольку aosp_arm64
строит только GKI (а не vendor_boot
или восстановление), это не полная цель. Для конфигураций aosp_arm64
см. generic_arm64
.
Вариант 1: Нет выделенного разделения восстановления
Устройства без раздела recovery
содержат общее boot
изображение в boot
разделе. vendor_boot
Ramdisk содержит все ресурсы восстановления, включая lib/modules
(с модулями ядра поставщика). На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk
.
Установить значения доски
Установите следующие значения:
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
Инициация двоичных файлов и символов
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_ramdisk
variant of the module when the module installs to the/first_stage_ramdisk
. This module should be available afterinit
switches root into/first_stage_ramdisk
but beforeinit
switches root into/system
. For examples, see Metadata checksums and Virtual A/B compression .Use the
recovery
variant of the module when the module installs to/
. This module should be available beforeinit
switches 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.prop
moves into/second_stage_resources
so that second stageinit
can 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.mk
if the device supports virtual A/B but not compression.virtual_ab_ota/compression.mk
if 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
fstab
fileslib/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
(fromrecovery
ramdisk, 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_boot
is optional.) - Runs the kernel from the
boot
partition.
- Pushes recovery +
Kernel mounts ramdisk to
/
then executes/init
from the generic ramdisk.First stage init starts, then does the following:
- Sets
IsRecoveryMode() == true
andForceNormalBoot() == 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/init
fromrecovery
ramdisk.
- Sets
Make e2fsck available
The device makefiles can inherit from:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
if the device supports virtual A/B but not compression.virtual_ab_ota/compression.mk
if 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
fstab
files -
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
fstab
files - All other recovery resources, including the
recovery
binary
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
(fromrecovery
ramdisk) -
/system/bin/init
(fromrecovery
ramdisk, 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
recovery
partition.
- Pushes recovery ramdisk to
Kernel mounts ramdisk to
/
then executes/init
, which is a symlink to/system/bin/init
from therecovery
ramdisk.First stage init starts, then does the following:
- Sets
IsRecoveryMode() == true
andForceNormalBoot() == 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/init
fromrecovery
ramdisk.
- 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.prop
file is added to the generic ramdisk. This file contains timestamp information of the build.At runtime, first stage
init
copies files from the ramdisk totmpfs
before freeing the ramdisk so that second stageinit
can read this file to setboot
image timestamp properties.