В Android 12 универсальный boot
образ, называемый Generic Kernel Image (GKI) , содержит универсальный ramdisk и ядро GKI.
Для устройств с Android 13 универсальный ramdisk удаляется из boot
образа и помещается в отдельный образ init_boot
. В результате boot
образ остаётся только с ядром GKI.
Для обновленных устройств, которые продолжают использовать Android 12 или более старые версии ядра, общий ramdisk остается там же, где и был, без необходимости в новом образе init_boot
.
Чтобы создать универсальный электронный диск, переместите специфичные для поставщика ресурсы из электронного диска таким образом, чтобы универсальный электронный диск содержал только первую стадию init
и файл свойств, содержащий информацию о временных метках.
На устройствах, которые:
Не используйте специальный раздел
recovery
, все данные восстановления перемещаются из универсального ramdisk в ramdiskvendor_boot
.Используйте специальный раздел
recovery
, никаких изменений в RAM-дискеrecovery
не требуется, поскольку RAM-дискrecovery
является автономным.
Архитектура
На следующих диаграммах показана архитектура устройств под управлением Android 12 и более поздних версий. Устройства с Android 13 имеют новый образ init_boot
, содержащий универсальный RAM-диск. Устройства, обновляемые с 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
для сертификации образа boot.img GKI (только версия 4). Сертифицированныйboot.img
GKI не подписан для верифицированной загрузки. OEM-производители по-прежнему должны подписывать готовыйboot.img
с помощью ключа AVB для конкретного устройства. - Общая
cmdline
(GENERIC_KERNEL_CMDLINE
) - Ядро GKI
- Подпись
- Универсальный образ ramdisk
- Включено только в
boot
образы Android 12 и более ранних версий.
- Включено только в
- Версия заголовка V3 или V4
Образ
vendor_boot
(подробнее см. в разделе Загрузочные разделы поставщика )- заголовок
vendor_boot
- Специфическая для устройства
cmdline
(BOARD_KERNEL_CMDLINE
)
- Специфическая для устройства
- образ ramdisk
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, содержимое RAM-диска должно быть автономным; см. раздел «Образы для восстановления» . Например:
-
lib/modules
должен содержать все модули ядра, необходимые для загрузки режима восстановления. - RAM-диск восстановления должен содержать
init
. - Для раздела восстановления A/B виртуальный диск восстановления добавляется к общему виртуальному диску и виртуальному диску
vendor_boot
, поэтому ему не обязательно быть отдельным. Например: -
lib/modules
может содержать только дополнительные модули ядра, необходимые для загрузки режима восстановления, помимо модулей ядра в ramdiskvendor_boot
. - Символическая ссылка
/init
может существовать, но она затмевается двоичным файлом/init
первой стадии в загрузочном образе.
- Версия заголовка V2
Содержимое образа универсального ramdisk
Универсальный электронный диск содержит следующие компоненты.
-
init
-
system/etc/ramdisk/build.prop
-
ro. PRODUCT .bootimg.* build
props - Пустые каталоги для точек монтирования:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
-
first_stage_ramdisk/
- Дублированные пустые каталоги для точек монтирования:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- Дублированные пустые каталоги для точек монтирования:
Интеграция загрузочного образа
Флаги сборки управляют сборкой образов init_boot
, boot
, recovery
и vendor_boot
. Значение логической переменной 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. Эта переменная не влияет на системные свойства илиPRODUCT_PACKAGES
.Это переключатель GKI на уровне платы; все следующие переменные ограничиваются этой переменной.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. Эта переменная управляет тем, будут ли ресурсы восстановления RAM-диска встроены в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
и задаёт его размер. При установке универсального RAM-диска он добавляется в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 также не поддерживается для устройств, использующих динамические разделы.
Конфигурации продукта
Устройства, использующие универсальный RAM-диск, должны установить список файлов, разрешённых к установке на RAM-диск. Для этого укажите в 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
в пустое значение. Если это так, используются новые конфигурации. Если такие устройства:Не используйте выделенный раздел
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
содержат образ универсальной boot
в boot
разделе. Виртуальный диск 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
. Однако, поскольку универсальный RAM-диск добавляется после RAM-диска vendor_boot
, символическая ссылка /init
перезаписывается. При загрузке устройства в режим восстановления для поддержки инициализации второго этапа необходим двоичный файл /system/bin/init
. Содержимое RAM-дисков vendor_boot
и generic следующее:
-
/init
(из универсального 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
переключит 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, устанавливают следующие модули в формате 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
, который устанавливает вариант snapuserd
для vendor_ramdisk
.
Изменения в процессе загрузки
Процесс загрузки в режим восстановления или в Android не меняется, за следующим исключением:
- Ramdisk
build.prop
перемещается в/second_stage_resources
, чтобыinit
второго этапа могла прочитать временную метку сборки при загрузке.
Поскольку ресурсы перемещаются из универсального ramdisk в ramdisk vendor_boot
, результат объединения универсального ramdisk с ramdisk vendor_boot
не изменяется.
Сделать e2fsck доступным
Makefile-ы устройств могут наследовать от:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
, если устройство поддерживает виртуальный A/B, но не сжатие.virtual_ab_ota/compression.mk
, если устройство поддерживает виртуальное сжатие A/B.
Makefiles продукта устанавливает $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 и виртуальные устройства 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
.
При загрузке устройства в режим recovery
содержимое разделов recovery
+ vendor_boot
+ generic ramdisk выглядит следующим образом:
-
/init
(из ramdisk, собранного изinit_first_stage
) -
/system/bin/init
(из RAM-дискаrecovery
, собранного изinit_second_stage.recovery
и запущенного из/init
)
При загрузке устройства в Android содержимое vendor_boot
+ generic ramdisk выглядит следующим образом:
-
/init
(из универсального 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
. Если RAM-диск vendor_boot
загружен в режиме восстановления, модуль также доступен в recovery
. Если RAM-диск 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
, который устанавливает версию snapuserd
для vendor_ramdisk
.
Изменения в процессе загрузки
При загрузке Android процесс загрузки не меняется. vendor_boot
+ generic ramdisk аналогичен существующему процессу загрузки, за исключением того, что fstab
загружает данные из vendor_boot
. Поскольку system/bin/recovery
отсутствует, first_stage_init
обрабатывает её как обычную загрузку.
При загрузке в режиме восстановления процесс загрузки изменяется. Схема восстановления + 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 доступным
Makefile-ы устройств могут наследовать от:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
, если устройство поддерживает виртуальный A/B, но не сжатие.virtual_ab_ota/compression.mk
, если устройство поддерживает виртуальное сжатие A/B.
Makefiles продукта устанавливает $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
. Во время выполнения первый этап init
выполняет /system/bin/e2fsck
.
Вариант 2б: Выделенный и не-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
необходим для поддержки как первой, так и второй стадии инициализации.
При загрузке устройства в recovery
содержимое виртуальных дисков recovery
выглядит следующим образом:
-
/init -> /system/bin/init
(из RAM-дискаrecovery
) -
/system/bin/init
(из RAM-дискаrecovery
, собранного изinit_second_stage.recovery
и запущенного из/init
)
При загрузке устройства в Android содержимое vendor_boot
+ generic ramdisk выглядит следующим образом:
-
/init
(из ramdisk, собранного изinit_first_stage
)
Переместить файлы fstab
Перенесите все файлы fstab
, установленные на общий ramdisk, на ramdisk vendor_ramdisk
и ramdisk recovery
. Пример см. в этом изменении .
Установить модули
Вы можете установить модули, специфичные для устройств, в vendor_ramdisk
и RAMDisk recovery
(пропустите этот шаг, если у вас нет модулей, специфичных для устройств, для установки). init
не переключает корневой каталог. Модули в варианте vendor_ramdisk
устанавливаются в корень vendor_ramdisk
. Модули в варианте recovery
устанавливаются в корень RAMDisk recovery
. Примеры установки модулей в vendor_ramdisk
и 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, устанавливают следующие модули в формате 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
Во время сборки в общий ramdisk добавляется файл
system/etc/ramdisk/build.prop
. Этот файл содержит информацию о времени сборки.Во время выполнения первый этап
init
копирует файлы с ramdisk вtmpfs
перед освобождением ramdisk, чтобы второй этапinit
мог прочитать этот файл и задать свойства временной меткиboot
образа.