В Android 12 универсальный образ boot , называемый универсальным образом ядра (GKI) , содержит универсальный образ оперативной памяти и ядро GKI.
Для устройств, запускаемых с Android 13, универсальный образ ramdisk удаляется из boot образа и помещается в отдельный образ init_boot . В результате в boot образе остается только ядро GKI.
При обновлении устройств, которые продолжают использовать ядро Android 12 или более старых версий, универсальный образ ramdisk остается на своем прежнем месте, и нет необходимости в создании нового образа init_boot .
Для создания универсального образа оперативной памяти необходимо переместить ресурсы, специфичные для конкретного поставщика, из образа оперативной памяти таким образом, чтобы универсальный образ содержал только init первого этапа и файл свойств, содержащий информацию о временных метках.
На устройствах, которые:
Не используйте отдельный раздел
recovery, все компоненты восстановления перемещаются со стандартного образа оперативной памяти в образ оперативной памятиvendor_boot.Используйте выделенный раздел
recovery; никаких изменений в образе оперативной памятиrecoveryне требуется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-ramdisk)

Рисунок 7. Устройства, обновляющиеся до Android 12, без GKI, с загрузкой через режим восстановления.
Обновление до Android 12, выделенное восстановление (выделенный образ в оперативной памяти).

Рисунок 8. Устройства, обновляющиеся до Android 12, без GKI, с выделенным режимом восстановления.
Содержимое загрузочных образов
Образы загрузки Android содержат следующее.
Добавлен образ
init_bootдля устройств, запускающихся с Android 13.- Версия заголовка V4
- Универсальный образ оперативной памяти
Универсальный образ
boot- Версия заголовка V3 или V4
-
boot_signatureдля сертификации GKI boot.img (только v4). Сертифицированный GKIboot.imgне подписывается для верифицированной загрузки. Производители оборудования по-прежнему должны подписывать предварительно собранный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не объединяется сcmdlinebootиvendor_boot. - В заголовке указывается значение DTBO для восстановления, если это необходимо.
- Для раздела восстановления A/B содержимое может быть объединено или определено на основе
bootиvendor_boot. Например: -
cmdlineобъединяется сcmdlineдляbootиvendor_boot. - Значение DTBO можно определить по заголовку
vendor_boot.
-
- образ
recoveryоперативного диска- Ресурсы восстановления
- Для раздела восстановления, отличного от A/B, содержимое виртуального диска в оперативной памяти должно быть автономным; см. Образы восстановления . Например:
-
lib/modulesдолжна содержать все модули ядра, необходимые для загрузки режима восстановления. - Восстановительный образ оперативной памяти должен содержать
init. - Для раздела восстановления A/B, образ восстановительной оперативной памяти добавляется в начало образов общей оперативной памяти и памяти
vendor_boot, поэтому он не обязательно должен быть отдельным. Например: -
lib/modulesможет содержать только дополнительные модули ядра, необходимые для загрузки режима восстановления, помимо модулей ядра в оперативной памятиvendor_boot. - Символическая ссылка в
/initвозможно, и существует, но она заслоняется исполняемым файлом/initпервого этапа загрузки образа.
- Версия заголовка V2
Содержимое типового образа оперативной памяти
Стандартный образ оперативной памяти содержит следующие компоненты.
-
init -
system/etc/ramdisk/build.prop -
ro. PRODUCT .bootimg.* buildprops - Пустые каталоги для точек монтирования:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/ -
first_stage_ramdisk/- Дублирующиеся пустые каталоги для точек монтирования:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
- Дублирующиеся пустые каталоги для точек монтирования:
интеграция образа загрузки
Флаги сборки определяют, как создаются образы init_boot , boot , recovery и vendor_boot . Значение логической переменной платы должно быть строкой true или пустым (что является значением по умолчанию).
TARGET_NO_KERNEL. Эта переменная указывает, используется ли в сборке предварительно собранный образ загрузки. Если эта переменная установлена вtrue, то установитеBOARD_PREBUILT_BOOTIMAGEв местоположение предварительно собранного образа загрузки (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img).BOARD_USES_RECOVERY_AS_BOOT. Эта переменная указывает, использует ли устройство образrecoveryв качествеbootобраза. При использовании GKI эта переменная пуста, и ресурсы восстановления следует переместить вvendor_boot.BOARD_USES_GENERIC_KERNEL_IMAGE. Эта переменная указывает, что плата использует GKI. Эта переменная не влияет на sysprops илиPRODUCT_PACKAGES.Это переключатель GKI на уровне платы; все последующие переменные ограничены этой переменной.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. Эта переменная определяет, будут ли ресурсы восстановления ramdisk создаваться вvendor_boot.Если установлено значение
true, ресурсы восстановления создаются только в каталогеvendor-ramdisk/и не создаются в каталогеrecovery/root/.Если каталог пуст, ресурсы восстановления создаются только в
recovery/root/и не создаются в каталогеvendor-ramdisk/.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. Эта переменная определяет, будут ли ключи GSI AVB встроены вvendor_boot.Если установлено значение
true, то приBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:Если все настроено, ключи GSI AVB создаются в каталоге
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb.Если параметр не задан, ключи GSI AVB создаются в каталоге
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb.
Если пусто, то если
BOARD_RECOVERY_AS_ROOT:Если все настроено, ключи GSI AVB создаются в каталоге
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb.Если параметр не задан, ключи GSI AVB создаются в каталоге
$ANDROID_PRODUCT_OUT/ramdisk/avb.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. Эта переменная определяет, содержит ли образrecoveryядро или нет. Устройства, запускаемые с Android 12 и использующие разделrecoveryA/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, и для цепочки vbmeta требуется установить переменныеBOARD_AVB_INIT_BOOT*.
Допустимые комбинации
| Компонент или переменная | Обновление устройства без раздела восстановления. | Обновление устройства с помощью раздела восстановления. | Запуск устройства без раздела восстановления | Запустите устройство с разделом восстановления 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
Для устройств, использующих GKI, использование прав root не поддерживается. На таких устройствах BOARD_BUILD_SYSTEM_ROOT_IMAGE должен быть пустым. Использование прав root также не поддерживается для устройств, использующих динамические разделы.
Конфигурации продукта
Устройства, использующие универсальный образ оперативной памяти (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 универсальный образ 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 ramdisk может содержать символическую ссылку /init на /system/bin/init и init_second_stage.recovery по адресу /system/bin/init . Однако, поскольку универсальный файл ramdisk добавляется после файла vendor_boot ramdisk, символическая ссылка /init перезаписывается. При загрузке устройства в режим восстановления для поддержки инициализации второго этапа необходим исполняемый файл /system/bin/init . Содержимое файлов vendor_boot + generic ramdisk выглядит следующим образом:
-
/init(из универсального образа оперативной памяти, созданного из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 , поэтому, если 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 , который устанавливает вариант snapuserd из vendor_ramdisk .
Изменения в процессе загрузки
Процесс загрузки в режим восстановления или в Android не меняется, за исключением следующего:
- Файл Ramdisk
build.propперемещается в/second_stage_resources, чтобыinitвторого этапа могла считывать метку времени сборки при загрузке.
Поскольку ресурсы перемещаются из универсального ramdisk в vendor_boot ramdisk, результат объединения универсального ramdisk с vendor_boot ramdisk не меняется.
Сделайте e2fsck доступным
Файлы makefile для устройств могут наследовать следующие типы данных:
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 и виртуальные устройства A/B, у которых раздел восстановления может быть обновлен, со следующей конфигурацией:
AB_OTA_PARTITIONS += recovery
Файл vendor_boot ramdisk содержит биты поставщика для самого ramdisk и модулей ядра поставщика, включая следующие:
Файлы
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 + generic ramdisks выглядит следующим образом:
-
/init(из ramdisk, создано изinit_first_stage) -
/system/bin/init(из образа оперативной памятиrecovery, созданного изinit_second_stage.recoveryи запущенного из/init)
При загрузке устройства в Android содержимое файлов vendor_boot и generic ramdisks выглядит следующим образом:
-
/init(из универсального образа оперативной памяти, созданного изinit_first_stage)
Переместите файлы fstab
Переместите все файлы fstab , установленные на универсальный образ оперативной памяти, в образ 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 . Если образ vendor_boot загружен в режиме восстановления, модуль также будет доступен в recovery . Если образ vendor_boot не загружен в режиме восстановления, устройство может дополнительно установить adbd.recovery .
Контрольные суммы метаданных
Для поддержки контрольных сумм метаданных на первом этапе монтирования устройства, не поддерживающие GKI, устанавливают вариант ramdisk следующих модулей. Чтобы добавить поддержку GKI, переместите модули в каталог $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin :
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
В качестве примера обратитесь к этому списку изменений .
Виртуальное A/B сжатие
Для поддержки виртуального A/B-сжатия необходимо установить snapuserd в vendor_ramdisk . Устройство должно наследовать настройки из virtual_ab_ota/compression.mk , который устанавливает вариант snapuserd для vendor_ramdisk .
Изменения в процессе загрузки
При загрузке Android процесс загрузки не меняется. Использование vendor_boot + generic ramdisk аналогично существующему процессу загрузки, за исключением того, что fstab загружается из vendor_boot . Поскольку system/bin/recovery не существует, first_stage_init обрабатывает его как обычную загрузку.
При загрузке в режим восстановления процесс загрузки изменяется. Загрузка с использованием `recovery + vendor_boot + generic ramdisk` аналогична существующему процессу восстановления, но ядро загружается из boot образа, а не из образа recovery . Процесс загрузки в режим восстановления выглядит следующим образом.
Загрузчик запускается, а затем выполняет следующие действия:
- Загружает образ восстановления +
vendor_boot+ универсальный образ оперативной памяти в/. (Если OEM-производитель дублирует модули ядра в образе оперативной памяти восстановления, добавляя их вBOARD_RECOVERY_KERNEL_MODULES),vendor_bootявляется необязательным.) - Запускает ядро из
bootраздела.
- Загружает образ восстановления +
Ядро монтирует виртуальный диск в оперативной памяти в корневой каталог
/а затем выполняет команду/initс этого универсального виртуального диска.На первом этапе запускается инициализация, после чего выполняются следующие действия:
- Устанавливает
IsRecoveryMode() == trueиForceNormalBoot() == false. - Загружает модули ядра от стороннего производителя из
/lib/modules. - Вызывает метод
DoFirstStageMount(), но пропускает монтирование, посколькуIsRecoveryMode() == true. (Устройство не освобождает ramdisk (поскольку/остается тем же), но вызываетSetInitAvbVersionInRecovery().) - Запускает второй этап инициализации из
/system/bin/initс образа оперативной памятиrecovery.
- Устанавливает
Сделайте e2fsck доступным
Файлы makefile для устройств могут наследовать следующие типы данных:
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 и виртуальные A/B, у которых раздел восстановления не обновляется. (Это необычно.)
Файл vendor_boot ramdisk содержит биты поставщика для самого ramdisk и модулей ядра поставщика, включая следующие:
- Файлы
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(изrecoveryобраза оперативной памяти) -
/system/bin/init(из образа оперативной памятиrecovery, созданного изinit_second_stage.recoveryи запущенного из/init)
При загрузке устройства в Android содержимое файлов vendor_boot и generic ramdisks выглядит следующим образом:
-
/init(из ramdisk, создано изinit_first_stage)
Переместите файлы fstab
Переместите все файлы fstab , установленные на универсальный образ оперативной памяти, в образ vendor_ramdisk и образ оперативной памяти recovery . Пример можно посмотреть в этом изменении .
Установка модулей
Вы можете установить модули, специфичные для устройства, в 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 обрабатывает его как обычную загрузку.
При загрузке в режим восстановления процесс загрузки не меняется. Образ восстановления загружается так же, как и в существующем процессе восстановления. Ядро загружается из образа recovery . Процесс загрузки в режим восстановления выглядит следующим образом.
Загрузчик запускается, а затем выполняет следующие действия:
- Загружает образ восстановительной оперативной памяти в
/. - Запускает ядро из раздела
recovery.
- Загружает образ восстановительной оперативной памяти в
Ядро монтирует виртуальный диск в
/а затем выполняет команду/init, которая представляет собой символическую ссылку на/system/bin/initс виртуального дискаrecovery.На первом этапе запускается инициализация, после чего выполняются следующие действия:
- Устанавливает
IsRecoveryMode() == trueиForceNormalBoot() == false. - Загружает модули ядра от стороннего производителя из
/lib/modules. - Вызывает метод
DoFirstStageMount(), но пропускает монтирование, посколькуIsRecoveryMode() == true. (Устройство не освобождает ramdisk (поскольку/остается тем же), но вызывает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образа.