В Android 12 универсальный boot образ, называемый Generic Kernel Image (GKI) , содержит универсальный ramdisk и ядро GKI.
 Для устройств с Android 13 универсальный ramdisk удаляется из boot образа и помещается в отдельный образ init_boot . В результате boot образ остаётся только с ядром GKI.
 Для обновленных устройств, которые продолжают использовать Android 12 или более старые версии ядра, общий ramdisk остается там же, где и был, без необходимости в новом образе init_boot .
 Чтобы создать универсальный электронный диск, переместите специфичные для поставщика ресурсы из электронного диска таким образом, чтобы универсальный электронный диск содержал только первую стадию init и файл свойств, содержащий информацию о временных метках.
На устройствах, которые:
- Не используйте специальный раздел - recovery, все данные восстановления перемещаются из универсального ramdisk в ramdisk- vendor_boot.
- Используйте специальный раздел - recovery, никаких изменений в RAM-диске- recoveryне требуется, поскольку RAM-диск- recoveryявляется автономным.
Архитектура
 На следующих диаграммах показана архитектура устройств под управлением Android 12 и более поздних версий. Устройства с Android 13 имеют новый образ init_boot , содержащий универсальный RAM-диск. Устройства, обновляемые с Android 12 до Android 13, используют ту же архитектуру, что и в Android 12.
Запуск с Android 13, без специального восстановления

Рисунок 1. Устройства, запускаемые или обновляемые до Android 13 с GKI, без специального восстановления.
Запуск с Android 13, выделенным и A/B-восстановлением (выделенный ramdisk)

Рисунок 2. Устройства, запускаемые или обновляемые до Android 13 с GKI, выделенным восстановлением и восстановлением A/B.
 Обратитесь к этому рисунку, если на устройстве имеются разделы recovery_a и recovery_b .
Запуск с Android 13, выделенное и не-A/B восстановление (выделенный ramdisk)

Рисунок 3. Устройства, запускаемые или обновляемые до Android 13 с GKI, выделенным восстановлением и восстановлением без A/B.
 Обратитесь к этому рисунку, если на устройстве имеется раздел с именем recovery без суффикса слота.
Запуск или обновление до Android 12, без специального восстановления

Рисунок 4. Устройства, запускаемые или обновляемые до Android 12 с GKI, без специального восстановления.
Запуск или обновление до Android 12, выделенное и A/B-восстановление (выделенный ramdisk)

Рисунок 5. Устройства, запускаемые или обновляемые до Android 12 с GKI, выделенным восстановлением и восстановлением A/B.
 Обратитесь к этому рисунку, если на устройстве имеются разделы recovery_a и recovery_b .
Запуск или обновление до Android 12, выделенное и не-A/B восстановление (выделенный ramdisk)

Рисунок 6. Устройства, запускаемые или обновляемые до Android 12 с GKI, выделенным восстановлением и восстановлением без A/B.
 Обратитесь к этому рисунку, если на устройстве имеется раздел с именем recovery без суффикса слота.
Обновление до Android 12, recovery-as-boot (recovery-as-ramdisk)

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

Рисунок 8. Устройства, обновляющиеся до Android 12, без GKI, выделенное восстановление.
Содержимое загрузочных образов
Загрузочные образы Android содержат следующее.
- Добавлен образ - init_bootдля устройств с Android 13.- Версия заголовка V4
- Универсальный образ ramdisk
 
- Универсальный - bootобраз-  Версия заголовка V3 или V4-  Подпись boot_signatureдля сертификации образа boot.img GKI (только версия 4). Сертифицированныйboot.imgGKI не подписан для верифицированной загрузки. OEM-производители по-прежнему должны подписывать готовыйboot.imgс помощью ключа AVB для конкретного устройства.
-  Общая cmdline(GENERIC_KERNEL_CMDLINE)
- Ядро GKI
 
-  Подпись 
-  Универсальный образ ramdisk-  Включено только в bootобразы Android 12 и более ранних версий.
 
-  Включено только в 
 
-  Версия заголовка V3 или V4
- Образ - vendor_boot(подробнее см. в разделе Загрузочные разделы поставщика )-  заголовок vendor_boot-  Специфическая для устройства cmdline(BOARD_KERNEL_CMDLINE)
 
-  Специфическая для устройства 
-  образ ramdisk vendor_boot-  lib/modules
- Ресурсы восстановления (если нет выделенного восстановления)
 
-  
-  dtbизображение
 
-  заголовок 
- изображение - recovery-  Версия заголовка V2-  Специфическая для устройства cmdlineдля восстановления, если необходимо
- Для раздела восстановления, отличного от A/B, содержимое заголовка должно быть автономным; см. раздел «Образы для восстановления» . Например:
-  cmdlineне объединена сbootиvendor_bootcmdline.
- Заголовок указывает восстановление DTBO, если необходимо.
-  Для раздела восстановления A/B содержимое может быть объединено или выведено из bootиvendor_boot. Например:
-  cmdlineобъединяется сbootиvendor_bootcmdline.
-  DTBO можно вывести из заголовка vendor_boot.
 
-  Специфическая для устройства 
-  образ ramdisk recovery- Ресурсы восстановления
- Для раздела восстановления, отличного от A/B, содержимое RAM-диска должно быть автономным; см. раздел «Образы для восстановления» . Например:
-  lib/modulesдолжен содержать все модули ядра, необходимые для загрузки режима восстановления.
-  RAM-диск восстановления должен содержать init.
-  Для раздела восстановления A/B виртуальный диск восстановления добавляется к общему виртуальному диску и виртуальному диску vendor_boot, поэтому ему не обязательно быть отдельным. Например:
-  lib/modulesможет содержать только дополнительные модули ядра, необходимые для загрузки режима восстановления, помимо модулей ядра в ramdiskvendor_boot.
-  Символическая ссылка /initможет существовать, но она затмевается двоичным файлом/initпервой стадии в загрузочном образе.
 
 
-  Версия заголовка V2
Содержимое образа универсального ramdisk
Универсальный электронный диск содержит следующие компоненты.
-  init
-  system/etc/ramdisk/build.prop
-  ro. PRODUCT .bootimg.* buildprops
-  Пустые каталоги для точек монтирования: debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
-  first_stage_ramdisk/-  Дублированные пустые каталоги для точек монтирования: debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
 
-  Дублированные пустые каталоги для точек монтирования: 
Интеграция загрузочного образа
 Флаги сборки управляют сборкой образов init_boot , boot , recovery и vendor_boot . Значение логической переменной board должно быть строкой true или быть пустым (что является значением по умолчанию).
- TARGET_NO_KERNEL. Эта переменная указывает, использует ли сборка готовый загрузочный образ. Если эта переменная имеет значение- true, то в качестве значения- BOARD_PREBUILT_BOOTIMAGEуказывается расположение готового загрузочного образа (- BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img).
- BOARD_USES_RECOVERY_AS_BOOT. Эта переменная указывает, использует ли устройство образ- recoveryв качестве- bootобраза. При использовании GKI эта переменная пуста, и ресурсы восстановления следует перенести в- vendor_boot.
- BOARD_USES_GENERIC_KERNEL_IMAGE. Эта переменная указывает, что плата использует GKI. Эта переменная не влияет на системные свойства или- PRODUCT_PACKAGES.- Это переключатель GKI на уровне платы; все следующие переменные ограничиваются этой переменной. 
- BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. Эта переменная управляет тем, будут ли ресурсы восстановления RAM-диска встроены в- vendor_boot.- Если установлено значение - true, ресурсы восстановления создаются только в- vendor-ramdisk/и не создаются в- recovery/root/.
- Если он пуст, ресурсы восстановления создаются только в - recovery/root/и не создаются в- vendor-ramdisk/.
 
- BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. Эта переменная управляет тем, будут ли ключи GSI AVB создаваться в- vendor_boot.- Если установлено значение - true, если- BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:- Если установлено, ключи GSI AVB создаются в - $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb.
- Если не установлено, ключи GSI AVB создаются в - $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb.
 
- Если пусто, если - BOARD_RECOVERY_AS_ROOT:- Если установлено, ключи GSI AVB создаются в - $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb.
- Если не установлено, ключи GSI AVB создаются в - $ANDROID_PRODUCT_OUT/ramdisk/avb.
 
 
- BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. Эта переменная определяет, содержит ли образ- recoveryядро. Устройства, работающие под управлением Android 12 и использующие раздел- 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и задаёт его размер. При установке универсального RAM-диска он добавляется в- init_boot.imgвместо- boot.imgи требует установки переменных- BOARD_AVB_INIT_BOOT*для цепочек vbmeta .
Допустимые комбинации
| Компонент или переменная | Обновление устройства без раздела восстановления | Обновление устройства с помощью раздела восстановления | Запустить устройство без раздела восстановления | Запустить устройство с разделом восстановления A/B | Запустить устройство с разделом восстановления, отличным от A/B | aosp_arm64 | 
|---|---|---|---|---|---|---|
| Содержит boot | да | да | да | да | да | да | 
| Содержит init_boot(Android 13) | нет | нет | да | да | да | да | 
| Содержит vendor_boot | необязательный | необязательный | да | да | да | нет | 
| Содержит recovery | нет | да | нет | да | да | нет | 
| BOARD_USES_RECOVERY_AS_BOOT | true | пустой | пустой | пустой | пустой | пустой | 
| BOARD_USES_GENERIC_KERNEL_IMAGE | пустой | пустой | true | true | true | true | 
| PRODUCT_BUILD_RECOVERY_IMAGE | пустой | trueили пусто | пустой | trueили пусто | trueили пусто | пустой | 
| BOARD_RECOVERYIMAGE_PARTITION_SIZE | пустой | > 0 | пустой | > 0 | > 0 | пустой | 
| BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT | пустой | пустой | true | пустой | пустой | пустой | 
| BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT | пустой | пустой | true | true | true | пустой | 
| BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE | пустой | пустой | пустой | true | пустой | пустой | 
| BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES | пустой | пустой | пустой | пустой | пустой | true | 
 Устройства с выделенным разделом recovery могут установить PRODUCT_BUILD_RECOVERY_IMAGE в true или оставить пустым. Для таких устройств, если задан BOARD_RECOVERYIMAGE_PARTITION_SIZE , создаётся образ recovery .
Включить цепочку vbmeta для загрузки
 Для образов boot и init_boot необходимо включить цепочку vbmeta. Укажите следующее:
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
В качестве примера можно привести это изменение .
Система-как-root
 Система с правами root не поддерживается для устройств, использующих GKI. На таких устройствах BOARD_BUILD_SYSTEM_ROOT_IMAGE должен быть пустым. Система с правами root также не поддерживается для устройств, использующих динамические разделы.
Конфигурации продукта
 Устройства, использующие универсальный RAM-диск, должны установить список файлов, разрешённых к установке на RAM-диск. Для этого укажите в device.mk следующее:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
 Файл generic_ramdisk.mk также предотвращает случайную установку других файлов на ramdisk другими make-файлами (вместо этого перемещайте такие файлы в vendor_ramdisk ).
Настройка устройств
Инструкции по настройке различаются для устройств с Android 13, обновленных до Android 12 и устройств с Android 12. Процесс настройки Android 13 аналогичен процессу настройки Android 12.
- Устройства, обновляемые до Android 12: - Можно сохранить значение - BOARD_USES_RECOVERY_AS_BOOT. В этом случае используются устаревшие конфигурации, и новые переменные сборки должны быть пустыми. Если такие устройства:
- Можно установить - BOARD_USES_RECOVERY_AS_BOOTв пустое значение. Если это так, используются новые конфигурации. Если такие устройства:- Не используйте выделенный раздел - recovery, архитектура показана на рисунке 1 , а вариант настройки устройства — Вариант 1 .
- Используйте выделенный раздел - recovery, архитектура которого показана на рисунке 2a или рисунке 2b , а вариант настройки устройства — вариант 2a или вариант 2b .
 
 
- Устройствам с Android 12 необходимо сбросить - BOARD_USES_RECOVERY_AS_BOOTи использовать новые конфигурации. Если такие устройства:- Не используйте выделенный раздел - recovery, архитектура показана на рисунке 1 , а вариант настройки устройства — Вариант 1 .
- Используйте выделенный раздел - recovery, архитектура которого показана на рисунке 2a или рисунке 2b , а вариант настройки устройства — вариант 2a или вариант 2b .
 
 Поскольку aosp_arm64 собирает только GKI (а не vendor_boot или recovery), это не полноценный целевой ресурс. Конфигурации сборки aosp_arm64 см. в generic_arm64 .
Вариант 1: без выделенного раздела восстановления
 Устройства без раздела recovery содержат образ универсальной boot в boot разделе. Виртуальный диск vendor_boot содержит все ресурсы восстановления, включая lib/modules (с модулями ядра вендора). На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .
Установить значения BOARD
Установите следующие значения:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Инициализация двоичных файлов и символических ссылок
 RAM-диск vendor_boot может содержать символическую ссылку /init на /system/bin/init и init_second_stage.recovery на /system/bin/init . Однако, поскольку универсальный RAM-диск добавляется после RAM-диска vendor_boot , символическая ссылка /init перезаписывается. При загрузке устройства в режим восстановления для поддержки инициализации второго этапа необходим двоичный файл /system/bin/init . Содержимое RAM-дисков vendor_boot и generic следующее:
-  /init(из универсального ramdisk, собранного изinit_first_stage)
-  /system/bin/init(изvendor_ramdisk, собран изinit_second_stage.recovery)
Переместить файлы fstab
 Переместите все файлы fstab , установленные на универсальном ramdisk, в vendor_ramdisk . Пример см. в этом изменении .
Установить модули
 Вы можете установить модули, специфичные для устройств, в vendor_ramdisk (пропустите этот шаг, если у вас нет модулей, специфичных для устройств, для установки).
- Используйте вариант модуля - vendor_ramdiskпри установке модуля в- /first_stage_ramdisk. Этот модуль должен быть доступен после того, как- initпереключит root в- /first_stage_ramdiskно до того, как- initпереключит root в- /system. Примеры см. в разделах Контрольные суммы метаданных и Сжатие виртуального A/B .
- Используйте вариант - recoveryмодуля при установке в- /. Этот модуль должен быть доступен до того, как- initпереключит root в- /first_stage_ramdisk. Подробную информацию об установке модулей в- /см. в разделе Консоль первого этапа .
Консоль первой ступени
 Поскольку консоль первого этапа запускается до того, как init переключит root в /first_stage_ramdisk , необходимо установить версию recovery модулей. По умолчанию оба варианта модулей устанавливаются в build/make/target/product/base_vendor.mk , поэтому, если make-файл устройства наследует этот файл, вам не нужно явно устанавливать версию recovery .
Для явной установки модулей восстановления используйте следующее.
PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \
 Это гарантирует, что linker , sh и toybox будут установлены в $ANDROID_PRODUCT_OUT/recovery/root/system/bin , который затем установится в /system/bin в vendor_ramdisk .
Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), используйте следующее.
PRODUCT_PACKAGES += adbd.recovery
 Это гарантирует, что указанные модули будут установлены в $ANDROID_PRODUCT_OUT/recovery/root/system/bin , который затем будет установлен в /system/bin в vendor_ramdisk .
Контрольные суммы метаданных
 Для поддержки контрольных сумм метаданных во время монтирования первого этапа устройства, не поддерживающие GKI, устанавливают следующие модули в формате ramdisk. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin :
PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \
Для примера обратитесь к этому списку изменений .
Виртуальное сжатие A/B
 Для поддержки виртуального сжатия A/B необходимо установить snapuserd в vendor_ramdisk . Устройство должно наследовать от virtual_ab_ota/compression.mk , который устанавливает вариант snapuserd для vendor_ramdisk .
Изменения в процессе загрузки
Процесс загрузки в режим восстановления или в Android не меняется, за следующим исключением:
-  Ramdisk build.propперемещается в/second_stage_resources, чтобыinitвторого этапа могла прочитать временную метку сборки при загрузке.
 Поскольку ресурсы перемещаются из универсального ramdisk в ramdisk vendor_boot , результат объединения универсального ramdisk с ramdisk vendor_boot не изменяется.
Сделать e2fsck доступным
Makefile-ы устройств могут наследовать от:
- virtual_ab_ota/launch_with_vendor_ramdisk.mk, если устройство поддерживает виртуальный A/B, но не сжатие.
- virtual_ab_ota/compression.mk, если устройство поддерживает виртуальное сжатие A/B.
 Makefiles продукта устанавливает $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck . Во время выполнения процесс init первого этапа переключает root в /first_stage_ramdisk а затем выполняет /system/bin/e2fsck .
Вариант 2a: Выделенный раздел восстановления A/B
 Используйте этот параметр для устройств с разделами recovery A/B, то есть, если устройство имеет разделы recovery_a и recovery_b partition . К таким устройствам относятся устройства A/B и виртуальные устройства A/B, раздел восстановления которых является обновляемым, со следующей конфигурацией:
AB_OTA_PARTITIONS += recovery
 RAM-диск vendor_boot содержит биты поставщика RAM-диска и модули ядра поставщика, включая следующее:
- Файлы - fstabдля конкретных устройств
- lib/modules(включает модули ядра поставщика)
 RAM-диск recovery содержит все ресурсы восстановления. На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .
Установить значения BOARD
 Установите следующие значения для устройств с разделом recovery A/B:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Инициализация двоичных файлов и символических ссылок
 RAM-диск recovery может содержать символическую ссылку /init -> /system/bin/init и файл init_second_stage.recovery в /system/bin/init . Однако, поскольку загрузочный RAM-диск присоединяется после RAM-диска recovery , символическая ссылка /init перезаписывается. При загрузке устройства в режиме восстановления для поддержки инициализации второго этапа необходим двоичный файл /system/bin/init .
 При загрузке устройства в режим recovery содержимое разделов recovery + vendor_boot + generic ramdisk выглядит следующим образом:
-  /init(из ramdisk, собранного изinit_first_stage)
-  /system/bin/init(из RAM-дискаrecovery, собранного изinit_second_stage.recoveryи запущенного из/init)
 При загрузке устройства в Android содержимое vendor_boot + generic ramdisk выглядит следующим образом:
-  /init(из универсального ramdisk, собранного изinit_first_stage)
Переместить файлы fstab
 Переместите все файлы fstab , установленные на универсальном ramdisk, в vendor_ramdisk . Пример см. в этом изменении .
Установить модули
 При желании вы можете установить модули, специфичные для устройств, в vendor_ramdisk (пропустите этот шаг, если у вас нет модулей, специфичных для устройств, для установки). Init не переключает корневой каталог. Модули в варианте vendor_ramdisk устанавливаются в корень vendor_ramdisk . Примеры установки модулей в vendor_ramdisk см. в разделах Консоль первого этапа , Контрольные суммы метаданных и Сжатие виртуального A/B .
Консоль первой ступени
 Для установки варианта модулей vendor_ramdisk используйте следующее:
PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \
 Это гарантирует, что linker , sh и toybox будут установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , который затем установится в /system/bin в vendor_ramdisk .
 Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), включите вариант vendor_ramdisk этих модулей, загрузив соответствующие патчи в AOSP, а затем используйте следующее: 
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Это гарантирует установку указанных модулей в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin . Если RAM-диск vendor_boot загружен в режиме восстановления, модуль также доступен в recovery . Если RAM-диск vendor_boot не загружен в режиме восстановления, устройство может также установить adbd.recovery .
Контрольные суммы метаданных
 Для поддержки контрольных сумм метаданных на первом этапе монтирования устройства, не поддерживающие GKI, устанавливают следующие модули в формате ramdisk. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin : 
PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \
Для примера обратитесь к этому списку изменений .
Виртуальное сжатие A/B
 Для поддержки сжатия Virtual A/B необходимо установить snapuserd в vendor_ramdisk . Устройство должно наследовать от virtual_ab_ota/compression.mk , который устанавливает версию snapuserd для vendor_ramdisk .
Изменения в процессе загрузки
 При загрузке Android процесс загрузки не меняется. vendor_boot + generic ramdisk аналогичен существующему процессу загрузки, за исключением того, что fstab загружает данные из vendor_boot . Поскольку system/bin/recovery отсутствует, first_stage_init обрабатывает её как обычную загрузку.
 При загрузке в режиме восстановления процесс загрузки изменяется. Схема восстановления + vendor_boot + generic ramdisk аналогична существующей, но ядро загружается из boot образа, а не из образа recovery . Процесс загрузки в режиме восстановления выглядит следующим образом.
- Запускается загрузчик, затем выполняется следующее: -  Помещает recovery + vendor_boot+ generic ramdisk в/. (Если OEM-производитель дублирует модули ядра в recovery ramdisk, добавляя их вBOARD_RECOVERY_KERNEL_MODULES),vendor_bootнеобязателен.)
-  Запускает ядро из bootраздела.
 
-  Помещает recovery + 
- Ядро монтирует ramdisk в - /а затем выполняет- /initс общего ramdisk.
- Запускается первый этап init, затем выполняется следующее: -  Устанавливает IsRecoveryMode() == trueиForceNormalBoot() == false.
-  Загружает модули ядра поставщика из /lib/modules.
-  Вызывает DoFirstStageMount(), но пропускает монтирование, посколькуIsRecoveryMode() == true. (Устройство не освобождает ramdisk (потому что/все тот же), но вызываетSetInitAvbVersionInRecovery().)
-  Запускает второй этап инициализации из /system/bin/initс RAM-дискаrecovery.
 
-  Устанавливает 
Сделать e2fsck доступным
Makefile-ы устройств могут наследовать от:
- virtual_ab_ota/launch_with_vendor_ramdisk.mk, если устройство поддерживает виртуальный A/B, но не сжатие.
- virtual_ab_ota/compression.mk, если устройство поддерживает виртуальное сжатие A/B.
 Makefiles продукта устанавливает $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck . Во время выполнения первый этап init выполняет /system/bin/e2fsck .
Вариант 2б: Выделенный и не-A/B раздел восстановления
 Используйте этот параметр для устройств с разделом recovery , отличным от A/B, то есть, если на устройстве есть раздел с именем recovery без суффикса слота. К таким устройствам относятся:
- не-A/B-устройства;
- Устройства A/B и Virtual A/B, раздел восстановления которых не подлежит обновлению. (Это необычно.)
 RAM-диск vendor_boot содержит биты поставщика RAM-диска и модули ядра поставщика, включая следующее:
-  Файлы fstabдля конкретных устройств
-  lib/modules(включает модули ядра поставщика)
 Образ recovery должен быть самодостаточным. Он должен содержать все необходимые ресурсы для загрузки режима восстановления, включая:
- Образ ядра
- Изображение DTBO
-  Модули ядра в lib/modules
-  Инициализация первого этапа как символическая ссылка /init -> /system/bin/init
-  Двоичный файл инициализации второго этапа /system/bin/init
-  Файлы fstabдля конкретных устройств
-  Все остальные ресурсы восстановления, включая двоичный файл recovery
 На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .
Установить значения BOARD
Установите следующие значения для устройств, отличных от A/B:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Инициализация двоичных файлов и символических ссылок
 RAM-диск recovery должен содержать символическую ссылку /init -> /system/bin/init и файл init_second_stage.recovery в /system/bin/init . При загрузке устройства в режиме восстановления двоичный файл /system/bin/init необходим для поддержки как первой, так и второй стадии инициализации.
 При загрузке устройства в recovery содержимое виртуальных дисков recovery выглядит следующим образом:
-  /init -> /system/bin/init(из RAM-дискаrecovery)
-  /system/bin/init(из RAM-дискаrecovery, собранного изinit_second_stage.recoveryи запущенного из/init)
 При загрузке устройства в Android содержимое vendor_boot + generic ramdisk выглядит следующим образом:
-  /init(из ramdisk, собранного изinit_first_stage)
Переместить файлы fstab
 Перенесите все файлы fstab , установленные на общий ramdisk, на ramdisk vendor_ramdisk и ramdisk recovery . Пример см. в этом изменении .
Установить модули
 Вы можете установить модули, специфичные для устройств, в vendor_ramdisk и RAMDisk recovery (пропустите этот шаг, если у вас нет модулей, специфичных для устройств, для установки). init не переключает корневой каталог. Модули в варианте vendor_ramdisk устанавливаются в корень vendor_ramdisk . Модули в варианте recovery устанавливаются в корень RAMDisk recovery . Примеры установки модулей в vendor_ramdisk и RAMDisk recovery см. в разделах Консоль первого этапа и Контрольные суммы метаданных .
Консоль первой ступени
 Для установки варианта модулей vendor_ramdisk используйте следующее: 
PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \
Это гарантирует, что linker , sh и toybox будут установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , который затем установится в /system/bin в vendor_ramdisk .
 Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), включите вариант vendor_ramdisk этих модулей, загрузив соответствующие патчи в AOSP, а затем используйте следующее: 
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Это гарантирует установку указанных модулей в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin .
 Чтобы установить вариант recovery модулей, замените vendor_ramdisk на recovery : 
PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \
    adbd.recovery \
Контрольные суммы метаданных
 Для поддержки контрольных сумм метаданных на первом этапе монтирования устройства, не поддерживающие GKI, устанавливают следующие модули в формате ramdisk. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin : 
PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \
Для поддержки контрольных сумм метаданных на первом этапе монтирования при восстановлении включите вариант восстановления этих модулей и также установите их.
Изменения в процессе загрузки
 При загрузке Android процесс загрузки не меняется. vendor_boot + generic ramdisk аналогичен существующему процессу загрузки, за исключением того, что fstab загружает данные из vendor_boot . Поскольку system/bin/recovery отсутствует, first_stage_init обрабатывает её как обычную загрузку.
 При загрузке в режиме восстановления процесс загрузки не меняется. RAM-диск восстановления загружается так же, как и в текущем процессе восстановления. Ядро загружается из образа recovery . Процесс загрузки в режиме восстановления выглядит следующим образом.
- Запускается загрузчик, затем выполняется следующее: -  Перемещает RAM-диск восстановления в /.
-  Запускает ядро из раздела recovery.
 
-  Перемещает RAM-диск восстановления в 
- Ядро монтирует ramdisk в - /а затем выполняет- /init, который является символической ссылкой на- /system/bin/initс ramdisk- recovery.
- Запускается первый этап init, затем выполняется следующее: -  Устанавливает IsRecoveryMode() == trueиForceNormalBoot() == false.
-  Загружает модули ядра поставщика из /lib/modules.
-  Вызывает DoFirstStageMount(), но пропускает монтирование, посколькуIsRecoveryMode() == true. (Устройство не освобождает ramdisk (потому что/все тот же), но вызываетSetInitAvbVersionInRecovery().)
-  Запускает второй этап инициализации из /system/bin/initс RAM-дискаrecovery.
 
-  Устанавливает 
Временные метки загрузочного образа
 Следующий код представляет собой пример файла временной метки boot образа: 
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
- Во время сборки в общий ramdisk добавляется файл - system/etc/ramdisk/build.prop. Этот файл содержит информацию о времени сборки.
- Во время выполнения первый этап - initкопирует файлы с ramdisk в- tmpfsперед освобождением ramdisk, чтобы второй этап- initмог прочитать этот файл и задать свойства временной метки- bootобраза.
