В Android 12 общий boot
образ, называемый общим образом ядра (Generic Kernel Image, GKI) , содержит общий ramdisk и ядро GKI.
Для устройств, запускаемых с Android 13, общий ramdisk удаляется из образа boot
и помещается в отдельный образ init_boot
. Это изменение оставляет образ boot
только с ядром GKI.
Для обновленных устройств, которые продолжают использовать Android 12 или более ранние версии ядра, общий ramdisk остается там же, где и был, без необходимости в новом образе init_boot
.
Чтобы создать универсальный электронный диск, переместите специфичные для поставщика ресурсы из электронного диска таким образом, чтобы универсальный электронный диск содержал только первую стадию init
и файл свойств, содержащий информацию о временных метках.
На устройствах, которые:
Не используйте выделенный раздел
recovery
, все данные восстановления переносятся с универсального RAM-диска на RAM-дискvendor_boot
.Используйте выделенный раздел
recovery
, никаких изменений в RAM-дискеrecovery
не требуется, поскольку RAM-дискrecovery
является автономным.
Архитектура
На следующих диаграммах показана архитектура для устройств с Android 12 и выше. Устройства, запускаемые с Android 13, имеют новый образ init_boot
, содержащий универсальный ramdisk. Устройства, обновляемые с Android 12 до Android 13, используют ту же архитектуру, что и с Android 12.
Запуск с Android 13, без специального восстановления
Рисунок 1. Устройства, запускаемые или обновляемые до Android 13 с GKI, без специального восстановления.
Запуск с Android 13, выделенным и A/B восстановлением (выделенный ramdisk)
Рисунок 2. Устройства, запускаемые или обновляемые до Android 13, с GKI, выделенным и A/B-восстановлением.
Обратитесь к этому рисунку, если на устройстве имеются разделы recovery_a
и recovery_b
.
Запуск с Android 13, выделенное и не-A/B восстановление (выделенный 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 восстановление (выделенный ramdisk)
Рисунок 6. Устройства, запускаемые или обновляемые до Android 12, с GKI, выделенным восстановлением и восстановлением без A/B.
Обратитесь к этому рисунку, если на устройстве имеется раздел с именем recovery
без суффикса слота.
Обновление до Android 12, recovery-as-boot (recovery-as-ramdisk)
Рисунок 7. Устройства, обновляющиеся до Android 12, без GKI, восстановление при загрузке.
Обновление до Android 12, выделенный рекавери (выделенный ramdisk)
Рисунок 8. Устройства, обновляющиеся до Android 12, без GKI, выделенное восстановление.
Содержимое загрузочных образов
Загрузочные образы Android содержат следующее.
Добавлен образ
init_boot
для устройств, запускаемых с Android 13- Версия заголовка V4
- Универсальный образ ramdisk
Универсальный
boot
образ- Версия заголовка V3 или V4
-
boot_signature
для сертификации GKI boot.img (только v4). Сертифицированный GKIboot.img
не подписан для проверенной загрузки. OEM-производители должны по-прежнему подписывать предварительно собранныйboot.img
с помощью ключа AVB для конкретного устройства. - Общая
cmdline
(GENERIC_KERNEL_CMDLINE
) - Ядро GKI
-
- Универсальный образ ramdisk
- Включено только в
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
. - Заголовок указывает восстановление DTBO, если необходимо.
- Для раздела восстановления A/B содержимое может быть объединено или выведено из
boot
иvendor_boot
. Например: -
cmdline
объединяется сboot
иvendor_boot
cmdline
. - DTBO можно вывести из заголовка
vendor_boot
.
- Специфическая для устройства
- образ ramdisk
recovery
- Ресурсы восстановления
- Для раздела восстановления не-A/B содержимое ramdisk должно быть автономным; см. Образы восстановления . Например:
-
lib/modules
должен содержать все модули ядра, необходимые для загрузки режима восстановления - RAM-диск восстановления должен содержать
init
. - Для раздела восстановления A/B ramdisk восстановления добавляется к generic и
vendor_boot
ramdisk, поэтому он не должен быть автономным. Например: -
lib/modules
может содержать только дополнительные модули ядра, необходимые для загрузки в режиме восстановления, помимо модулей ядра в ramdiskvendor_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
. Значение переменной boolean board должно быть строкой 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 и использующие раздел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
и задает размер. При установке универсальный 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
или пустое. Для этих устройств, если установлен BOARD_RECOVERYIMAGE_PARTITION_SIZE
, создается образ recovery
.
Включить цепочку vbmeta для загрузки
Chained 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
также предотвращает случайную установку других файлов на ramdisk другими 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
вtrue
, архитектура будет такой, как показано на рисунке 3 .Установите
BOARD_USES_RECOVERY_AS_BOOT
пустым, архитектура будет такой, как показано на рисунке 4 .
Можно установить
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
или recovery), это не полная цель. Для конфигураций сборки aosp_arm64
обратитесь к generic_arm64
.
Вариант 1: Нет выделенного раздела восстановления
Устройства без раздела recovery
содержат образ generic boot
в разделе boot
. RAM-диск vendor_boot
содержит все ресурсы восстановления, включая lib/modules
(с модулями ядра vendor). На таких устройствах конфигурация продукта наследуется от 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
. Однако, поскольку общий RAM-диск объединяется после RAM-диска vendor_boot
, символическая ссылка /init
перезаписывается. Когда устройство загружается в режим восстановления, для поддержки второго этапа init необходим двоичный файл /system/bin/init
. Содержимое RAM-дисков vendor_boot
+ generic следующее:
-
/init
(из универсального ramdisk, собранного изinit_first_stage
) -
/system/bin/init
(изvendor_ramdisk
, собранного изinit_second_stage.recovery
)
Переместить файлы fstab
Переместите все файлы fstab
, которые были установлены на generic ramdisk, в 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
, поэтому, если 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
второго этапа могла считывать временную метку сборки при загрузке.
Поскольку ресурсы перемещаются из универсального ramdisk в ramdisk vendor_boot
, результат объединения универсального ramdisk с ramdisk vendor_boot
не меняется.
Сделать e2fsck доступным
Файлы make-файлов устройств могут наследоваться от:
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
RAM-диск vendor_boot
содержит биты поставщика RAM-диска и модули ядра поставщика, включая следующее:
Файлы
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
. Однако, поскольку загрузочный RAM-диск объединяется после RAM-диска recovery
, символическая ссылка /init
перезаписывается. Когда устройство загружается в режиме восстановления, двоичный файл /system/bin/init
необходим для поддержки второго этапа init.
Когда устройство загружается в recovery
, содержимое дисков recovery
+ vendor_boot
+ generic выглядит следующим образом:
-
/init
(из ramdisk, собранного изinit_first_stage
) -
/system/bin/init
(из RAM-дискаrecovery
, собранного изinit_second_stage.recovery
и запущенного из/init
)
При загрузке Android на устройстве содержимое vendor_boot
+ generic ramdisks выглядит следующим образом:
-
/init
(из универсального ramdisk, собранного изinit_first_stage
)
Переместить файлы fstab
Переместите все файлы fstab
, которые были установлены на generic 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
Для поддержки сжатия Virtual 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
. Процесс загрузки для режима восстановления выглядит следующим образом.
Загрузчик запускается, а затем выполняет следующее:
- Отправляет recovery +
vendor_boot
+ generic ramdisk в/
. (Если OEM дублирует модули ядра в recovery ramdisk, добавляя их вBOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
необязателен.) - Запускает ядро из
boot
раздела.
- Отправляет recovery +
Ядро монтирует ramdisk в
/
а затем выполняет/init
с общего ramdisk.Запускается первый этап init, затем выполняется следующее:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
, но пропускает монтирование, посколькуIsRecoveryMode() == true
. (Устройство не освобождает ramdisk (потому что/
все тот же), но вызываетSetInitAvbVersionInRecovery()
.) - Запускает второй этап инициализации из
/system/bin/init
с RAM-дискаrecovery
.
- Устанавливает
Сделать e2fsck доступным
Файлы make-файлов устройств могут наследоваться от:
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, раздел восстановления которых не подлежит обновлению. (Это необычно.)
RAM-диск vendor_boot
содержит биты поставщика RAM-диска и модули ядра поставщика, включая следующее:
- Файлы
fstab
для конкретных устройств -
lib/modules
(включает модули ядра поставщика)
Образ recovery
должен быть самодостаточным. Он должен содержать все необходимые ресурсы для загрузки режима восстановления, включая:
- Образ ядра
- Изображение DTBO
- Модули ядра в
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
необходим для поддержки как первой, так и второй стадии init.
Когда устройство загружается в recovery
, содержимое виртуальных дисков recovery
выглядит следующим образом:
-
/init -> /system/bin/init
(из RAM-дискаrecovery
) -
/system/bin/init
(из RAM-дискаrecovery
, собранного изinit_second_stage.recovery
и запущенного из/init
)
При загрузке Android на устройстве содержимое vendor_boot
+ generic ramdisks выглядит следующим образом:
-
/init
(из ramdisk, собранного изinit_first_stage
)
Переместить файлы fstab
Переместите все файлы fstab
, которые были установлены на generic ramdisk, в vendor_ramdisk
и recovery
ramdisk. Для примера обратитесь к этому изменению .
Установить модули
Вы можете установить модули, специфичные для устройств, в vendor_ramdisk
и recovery
ramdisk (пропустите этот шаг, если у вас нет модулей, специфичных для устройств, для установки). init
не переключает корень. Вариант модулей vendor_ramdisk
устанавливается в корень vendor_ramdisk
. Вариант модулей recovery
устанавливается в корень recovery
ramdisk. Примеры установки модулей в vendor_ramdisk
и recovery
ramdisk см. в разделах Консоль первого этапа и Контрольные суммы метаданных .
Консоль первой ступени
Для установки модуля версии vendor_ramdisk
используйте следующее:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Это гарантирует, что linker
, sh
и toybox
будут установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, который затем будет установлен в /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
обрабатывает его как обычную загрузку.
При загрузке в режиме восстановления процесс загрузки не меняется. RAM-диск восстановления загружается так же, как и существующий процесс восстановления. Ядро загружается из образа recovery
. Процесс загрузки для режима восстановления выглядит следующим образом.
Загрузчик запускается, а затем выполняет следующее:
- Перемещает RAM-диск восстановления в
/
. - Запускает ядро из раздела
recovery
.
- Перемещает RAM-диск восстановления в
Ядро монтирует ramdisk в
/
а затем выполняет/init
, который является символической ссылкой на/system/bin/init
из ramdiskrecovery
.Запускается первый этап init, затем выполняется следующее:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
, но пропускает монтирование, посколькуIsRecoveryMode() == true
. (Устройство не освобождает ramdisk (потому что/
все тот же), но вызываетSetInitAvbVersionInRecovery()
.) - Запускает второй этап инициализации из
/system/bin/init
с RAM-диска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
добавляется в общий ramdisk. Этот файл содержит информацию о временных метках сборки.Во время выполнения первый этап
init
копирует файлы с ramdisk вtmpfs
перед освобождением ramdisk, чтобы второй этапinit
мог прочитать этот файл и задать свойства временной меткиboot
образа.