В Android 12 универсальный boot
образ содержит универсальный boot
виртуальный диск и универсальный образ ядра (GKI) . Чтобы построить общий виртуальный диск, переместите ресурсы конкретного поставщика из виртуального диска, чтобы универсальный виртуальный диск содержал только первый этап init
и файл свойств, содержащий информацию о временной метке.
На устройствах, которые:
Не используйте выделенный раздел
recovery
, все биты восстановления перемещаются с загрузочного виртуального диска на виртуальный RAM-дискvendor_boot
.Используйте выделенный раздел
recovery
, никаких изменений в виртуальном дискеrecovery
не требуется, поскольку виртуальный дискrecovery
является автономным.
Архитектура
На следующих диаграммах показана архитектура устройств под управлением Android 12.
Запустите или обновите до Android 12, без специального восстановления
Рис. 1. Устройства, запускаемые или обновляющиеся до Android 12, с GKI, без специального восстановления
Запуск или обновление до Android 12, выделенное восстановление и восстановление A/B (выделенный виртуальный диск)
Рисунок 2а. Устройства, запускаемые или обновляющиеся до Android 12, с GKI, выделенным и восстановлением A/B
Обратитесь к этому рисунку, если recovery
A/B; то есть на устройстве есть разделы recovery_a
и recovery_b
.
Запуск или обновление до Android 12, выделенное и не-A/B восстановление (выделенный виртуальный диск)
Рисунок 2б. Устройства, запускаемые или обновляющиеся до Android 12, с GKI, выделенным восстановлением и восстановлением без A/B
Обратитесь к этому рисунку, если recovery
не A/B; то есть на устройстве есть раздел с именем recovery
без суффикса слота.
Обновление до Android 12, восстановление при загрузке (восстановление при загрузке)
Рис. 3. Обновление устройств до Android 12, без GKI, восстановление при загрузке
Обновление до Android 12, выделенное восстановление (выделенный виртуальный диск)
Рис. 4. Обновление устройств до Android 12, без GKI, выделенное восстановление
Содержимое загрузочных образов
В Android 12 загрузочные образы содержат следующее.
- Общий
boot
образ- Версия заголовка V3 или V4
-
boot_signature
для сертификации GKI boot.img (только v4). Сертифицированный GKIboot.img
не подписан для проверенной загрузки. OEM-производители по-прежнему должны подписывать предварительно созданный файлboot.img
с помощью ключа AVB для конкретного устройства. - Общая
cmdline
(GENERIC_KERNEL_CMDLINE
) - Общий образ ядра
-
- Общий образ
boot
виртуального диска
- Версия заголовка V3 или V4
- Образ
vendor_boot
(подробности см. в разделе Загрузочные разделы поставщика )- заголовок
vendor_boot
-
BOARD_KERNEL_CMDLINE
cmdline
-
- Образ RAM
vendor_boot
-
lib/modules
- Ресурсы восстановления (если нет выделенного восстановления)
-
- изображение
dtb
- заголовок
- образ
recovery
- Версия заголовка V2
- Командная
cmdline
для конкретного устройства для восстановления, если это необходимо - Для раздела восстановления, отличного от A/B, содержимое заголовка должно быть автономным; см. Образы для восстановления . Например:
-
cmdline
не объединяется с команднойcmdline
boot
иvendor_boot
. - Заголовок указывает восстановление DTBO, если это необходимо.
- Для раздела восстановления A/B содержимое может быть объединено или выведено из
boot
иvendor_boot
. Например: -
cmdline
объединяется с команднойcmdline
boot
иvendor_boot
. - DTBO можно вывести из заголовка
vendor_boot
.
- Командная
- образ виртуального диска
recovery
- Ресурсы восстановления
- Для раздела восстановления, отличного от A/B, содержимое виртуального диска должно быть автономным; см. Образы для восстановления . Например:
-
lib/modules
должен содержать все модули ядра, необходимые для загрузки режима восстановления - Виртуальный диск восстановления должен содержать
init
. - Для раздела восстановления A/B виртуальный диск восстановления добавляется к виртуальным дискам
boot
иvendor_boot
, поэтому он не должен быть автономным. Например: -
lib/modules
может содержать только дополнительные модули ядра, необходимые для загрузки режима восстановления, помимо модулей ядра в ramdiskvendor_boot
. - Символическая ссылка в
/init
может существовать, но она затмевается двоичным/init
первого этапа в загрузочном образе.
- Версия заголовка V2
Содержимое образа универсального загрузочного виртуального диска
В Android 12 универсальный boot
виртуальный диск содержит следующие компоненты.
-
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/
- Дублируются пустые каталоги для точек монтирования:
Интеграция загрузочного образа
Флаги сборки управляют сборкой образов 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 и универсальныйboot
образ. Эта переменная не влияет на 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
. Эта переменная определяет, встроены ли ключи AVB GSI в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
.Другие устройства должны оставить эту переменную пустой.
Допустимые комбинации
Компонент или переменная | Обновление устройства без раздела recovery | Обновление устройства с разделом recovery | Запустить устройство без раздела recovery | Запустите устройство с разделом recovery A/B | Запустите устройство с разделом recovery , отличным от A/B | aosp_arm64 |
---|---|---|---|---|---|---|
Содержит boot | да | да | да | да | да | да |
Содержит vendor_boot | по желанию | по желанию | да | да | да | нет |
Содержит recovery | нет | да | нет | да | да | нет |
BOARD_USES_RECOVERY_AS_BOOT | true | пустой | пустой | пустой | пустой | пустой |
BOARD_USES_GENERIC_KERNEL_IMAGE | пустой | пустой | true | true | true | true |
PRODUCT_BUILD_RECOVERY_IMAGE | пустой | true или пусто | пустой | true или пусто | true или пусто | пустой |
BOARD_RECOVERYIMAGE_PARTITION_SIZE | пустой | > 0 | пустой | > 0 | > 0 | пустой |
BOARD_MOVE_RECOVERY_RESOURCE_TO_VENDOR_BOOT | пустой | пустой | true | пустой | пустой | пустой |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT | пустой | пустой | true | true | true | пустой |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE | пустой | пустой | пустой | true | пустой | пустой |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES | пустой | пустой | пустой | пустой | пустой | true |
Устройства с выделенным разделом recovery
могут установить для PRODUCT_BUILD_RECOVERY_IMAGE
значение true
или пустое значение. Для этих устройств, если установлено BOARD_RECOVERYIMAGE_PARTITION_SIZE
, создается образ recovery
.
Включить цепочку vbmeta для загрузки
Цепочка vbmeta должна быть включена для 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
Для примера обратитесь к этому изменению .
Система от имени root
Система от имени пользователя root не поддерживается для устройств, использующих GKI и универсальный загрузочный образ, независимо от того, поддерживает ли устройство обновляемый модуль GKI. На таких устройствах BOARD_BUILD_SYSTEM_ROOT_IMAGE
должен быть пустым. Система от имени root также не поддерживается для устройств, использующих динамические разделы, что является требованием для использования обновляемого модуля GKI.
Конфигурации продукта
Устройства, использующие универсальный виртуальный диск, должны установить список файлов, которые разрешено устанавливать на виртуальный диск. Для этого укажите в device.mk
следующее:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Файл generic_ramdisk.mk
также предотвращает случайную установку другими make-файлами других файлов на виртуальный диск (вместо этого переместите такие файлы в vendor_ramdisk
).
Настройка устройств
Инструкции по настройке различаются для устройств, обновляющихся до Android 12 и запускаемых с 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 и общий boot
образ (а не 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
Инициализация двоичных файлов и символических ссылок
Виртуальный диск vendor_boot
может содержать символическую ссылку /init
на /system/bin/init
и init_second_stage.recovery
в /system/bin/init
. Однако, поскольку boot
виртуальный диск объединяется после vendor_boot
, символическая ссылка /init
перезаписывается. Когда устройство загружается в режиме восстановления, двоичный файл /system/bin/init
необходим для поддержки второго этапа инициализации. Содержимое RAM- vendor_boot
+ boot
следующее:
-
/init
(из виртуального диска, созданного изinit_first_stage
) -
/system/bin/init
(изvendor_ramdisk
, построено изinit_second_stage.recovery
)
Перемещение файлов fstab
Переместите все файлы fstab
, которые были установлены на boot
виртуальный диск, в 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, устанавливают вариант RAM-диска следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Для примера обратитесь к этому списку изменений .
Виртуальное сжатие A/B
Чтобы поддерживать виртуальное сжатие A/B, snapuserd
должен быть установлен на vendor_ramdisk
. Устройство должно наследоваться от virtual_ab_ota/compression.mk
, который устанавливает вариант vendor_ramdisk
snapuserd
.
Изменения в процессе загрузки
Процесс загрузки в рекавери или в Android не меняется, за следующим исключением:
- Ramdisk
build.prop
перемещается в/second_stage_resources
, чтобы второй этапinit
мог считывать метку времени сборки при загрузке.
Поскольку ресурсы перемещаются с boot
виртуального диска на виртуальный диск vendor_boot
, результат объединения boot
с vendor_boot
не меняется.
Делаем e2fsck доступным
Makefiles устройств могут наследоваться от:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
, если устройство поддерживает виртуальный A/B, но не сжатие.virtual_ab_ota/compression.mk
, если устройство поддерживает виртуальное сжатие A/B.
Файлы сборки продукта устанавливают $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
. Во время выполнения первый этап init
переключает root на /first_stage_ramdisk
а затем выполняет /system/bin/e2fsck
.
Вариант 2а: выделенный раздел и раздел восстановления A/B
Используйте этот параметр для устройств с разделами recovery
A/B; то есть на устройстве есть recovery_b partition
recovery_a
и recovery_b. К таким устройствам относятся устройства A/B и виртуальные устройства A/B, раздел восстановления которых можно обновить, со следующей конфигурацией:
AB_OTA_PARTITIONS += recovery
Виртуальный диск vendor_boot
содержит биты поставщика модулей виртуального диска и ядра поставщика, включая следующие:
Файлы
fstab
для конкретных устройствlib/modules
(включает модули ядра поставщика)
Виртуальный диск 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
Инициализация двоичных файлов и символических ссылок
Виртуальный диск recovery
может содержать символическую ссылку /init -> /system/bin/init
и init_second_stage.recovery
в /system/bin/init
. Однако, поскольку загрузочный виртуальный диск объединяется после виртуального диска recovery
, символическая ссылка /init
перезаписывается. Когда устройство загружается в режиме восстановления, двоичный файл /system/bin/init
необходим для поддержки второго этапа инициализации.
Когда устройство загружается в recovery
, содержимое recovery
+ vendor_boot
+ boot
ramdisks выглядит следующим образом:
-
/init
(из виртуального диска, созданного изinit_first_stage
) -
/system/bin/init
(из RAM-дискаrecovery
, созданного изinit_second_stage.recovery
и выполненного из/init
)
Когда устройство загружается в Android, содержимое vendor_boot
+ boot
выглядит следующим образом:
-
/init
(из виртуального диска, созданного изinit_first_stage
)
Перемещение файлов fstab
Переместите все файлы fstab
, которые были установлены на boot
виртуальный диск, в 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, устанавливают вариант RAM-диска следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Для примера обратитесь к этому списку изменений .
Виртуальное сжатие A/B
Для поддержки виртуального сжатия A/B snapuserd
должен быть установлен на vendor_ramdisk
. Устройство должно наследоваться от virtual_ab_ota/compression.mk
, который устанавливает вариант vendor_ramdisk
snapuserd
.
Изменения в процессе загрузки
При загрузке в Android процесс загрузки не меняется. Виртуальный диск vendor_boot
+ boot
похож на существующий процесс загрузки, за исключением того, что fstab
загружается из vendor_boot
. Поскольку system/bin/recovery
не существует, first_stage_init
обрабатывает его как обычную загрузку.
При загрузке в режиме восстановления процесс загрузки меняется. Recovery + vendor_boot
+ boot
ramdisk аналогичен существующему процессу восстановления, но ядро загружается из boot
образа, а не из образа recovery
. Процесс загрузки для режима восстановления выглядит следующим образом.
Загрузчик запускается, затем делает следующее:
- Помещает recovery +
vendor_boot
+boot
ramdisk в/
. (Если OEM-производитель дублирует модули ядра на виртуальном диске восстановления, добавляя их вBOARD_RECOVERY_KERNEL_MODULES
,vendor_boot
является необязательным.) - Запускает ядро из
boot
раздела.
- Помещает recovery +
Ядро монтирует виртуальный диск в
/
, затем выполняет/init
сboot
виртуального диска.Запускается первый этап инициализации, затем выполняется следующее:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
но пропускает монтирование, посколькуIsRecoveryMode() == true
. (Устройство не освобождает виртуальный диск (потому что/
остается прежним), но вызываетSetInitAvbVersionInRecovery()
.) - Запускает второй этап инициализации из
/system/bin/init
с RAM-дискаrecovery
.
- Устанавливает
Делаем e2fsck доступным
Makefiles устройств могут наследоваться от:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
, если устройство поддерживает виртуальный A/B, но не сжатие.virtual_ab_ota/compression.mk
, если устройство поддерживает виртуальное сжатие A/B.
Файлы сборки продукта устанавливают $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
должен быть автономным. Он должен содержать все необходимые ресурсы для загрузки режима восстановления, в том числе:
- Образ ядра
- Изображение 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
Инициализация двоичных файлов и символических ссылок
Виртуальный диск 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
+ boot
выглядит следующим образом:
-
/init
(из виртуального диска, созданного изinit_first_stage
)
Перемещение файлов fstab
Переместите все файлы fstab
, которые были установлены на boot
виртуальный диск, на виртуальный диск vendor_ramdisk
и виртуальный диск recovery
. Для примера обратитесь к этому изменению .
Установка модулей
При желании вы можете установить модули для конкретного устройства на vendor_ramdisk
и виртуальный диск recovery
(пропустите этот шаг, если у вас нет модулей для конкретного устройства для установки). init
не переключает root. Вариант модулей 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, устанавливают вариант RAM-диска следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Для поддержки контрольных сумм метаданных на первом этапе монтирования в процессе восстановления включите вариант восстановления этих модулей и также установите их.
Изменения в процессе загрузки
При загрузке в Android процесс загрузки не меняется. Виртуальный диск vendor_boot
+ boot
похож на существующий процесс загрузки, за исключением того, что fstab
загружается из vendor_boot
. Поскольку system/bin/recovery
не существует, first_stage_init
обрабатывает его как обычную загрузку.
При загрузке в режиме восстановления процесс загрузки не меняется. Виртуальный диск восстановления загружается так же, как и существующий процесс восстановления. Ядро загружается из образа recovery
. Процесс загрузки для режима восстановления выглядит следующим образом.
Загрузчик запускается, затем делает следующее:
- Помещает виртуальный диск восстановления в
/
. - Запускает ядро из раздела
recovery
.
- Помещает виртуальный диск восстановления в
Ядро монтирует виртуальный диск в
/
, затем выполняет/init
, который является символической ссылкой на/system/bin/init
с виртуального дискаrecovery
.Запускается первый этап инициализации, затем выполняется следующее:
- Устанавливает
IsRecoveryMode() == true
иForceNormalBoot() == false
. - Загружает модули ядра поставщика из
/lib/modules
. - Вызывает
DoFirstStageMount()
но пропускает монтирование, посколькуIsRecoveryMode() == true
. (Устройство не освобождает виртуальный диск (потому что/
остается прежним), но вызывает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
добавляется к общемуboot
виртуальному диску. Этот файл содержит информацию о временной метке сборки.Во время выполнения первый этап
init
копирует файлы с виртуального диска наtmpfs
перед освобождением виртуального диска, чтобы второй этапinit
мог прочитать этот файл, чтобы установить свойства метки времениboot
образа.