В 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
. Эта переменная определяет, будут ли ресурсы восстановления виртуального диска встроены в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
также предотвращает случайную установку других файлов makefile на виртуальный диск (вместо этого переместите такие файлы в 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
или восстановление), он не является полной целью. Информацию о конфигурациях сборки 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, устанавливают варианты с виртуальным диском следующих модулей. Чтобы добавить поддержку 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
образа.