Общий загрузочный раздел

В 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, без специального восстановления

Запуск/обновление устройства, GKI, без специального восстановления

Рисунок 1. Устройства, запускаемые или обновляемые до Android 13 с GKI, без специального восстановления.

Запуск с Android 13, выделенным и A/B-восстановлением (выделенный ramdisk)

Запуск/обновление устройства, GKI, выделенное и A/B-восстановление

Рисунок 2. Устройства, запускаемые или обновляемые до Android 13 с GKI, выделенным восстановлением и восстановлением A/B.

Обратитесь к этому рисунку, если на устройстве имеются разделы recovery_a и recovery_b .

Запуск с Android 13, выделенное и не-A/B восстановление (выделенный ramdisk)

Запуск/обновление устройства, GKI, выделенное и не-A/B восстановление

Рисунок 3. Устройства, запускаемые или обновляемые до Android 13 с GKI, выделенным восстановлением и восстановлением без A/B.

Обратитесь к этому рисунку, если на устройстве имеется раздел с именем recovery без суффикса слота.

Запуск или обновление до Android 12, без специального восстановления

Запуск/обновление устройства, GKI, без специального восстановления

Рисунок 4. Устройства, запускаемые или обновляемые до Android 12 с GKI, без специального восстановления.

Запуск или обновление до Android 12, выделенное и A/B-восстановление (выделенный ramdisk)

Запуск/обновление устройства, GKI, выделенное и A/B-восстановление

Рисунок 5. Устройства, запускаемые или обновляемые до Android 12 с GKI, выделенным восстановлением и восстановлением A/B.

Обратитесь к этому рисунку, если на устройстве имеются разделы recovery_a и recovery_b .

Запуск или обновление до Android 12, выделенное и не-A/B восстановление (выделенный ramdisk)

Запуск/обновление устройства, GKI, выделенное и не-A/B восстановление

Рисунок 6. Устройства, запускаемые или обновляемые до Android 12 с GKI, выделенным восстановлением и восстановлением без A/B.

Обратитесь к этому рисунку, если на устройстве имеется раздел с именем recovery без суффикса слота.

Обновление до Android 12, recovery-as-boot (recovery-as-ramdisk)

Запуск/обновление устройства, без GKI, восстановление в режиме загрузки

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

Обновление до Android 12, выделенный рекавери (выделенный ramdisk)

Устройство запуска/обновления, без GKI, выделенное восстановление

Рисунок 8. Устройства, обновляющиеся до Android 12, без GKI, выделенное восстановление.

Содержимое загрузочных образов

Загрузочные образы Android содержат следующее.

  • Добавлен образ init_boot для устройств с Android 13.

    • Версия заголовка V4
    • Универсальный образ ramdisk
  • Универсальный boot образ

    • Версия заголовка V3 или V4
      • Подпись boot_signature для сертификации образа boot.img GKI (только версия 4). Сертифицированный boot.img GKI не подписан для верифицированной загрузки. OEM-производители по-прежнему должны подписывать готовый boot.img с помощью ключа AVB для конкретного устройства.
      • Общая cmdline ( GENERIC_KERNEL_CMDLINE )
      • Ядро GKI
    • Универсальный образ ramdisk
      • Включено только в boot образы Android 12 и более ранних версий.
  • Образ vendor_boot (подробнее см. в разделе Загрузочные разделы поставщика )

    • заголовок vendor_boot
      • Специфическая для устройства cmdline ( BOARD_KERNEL_CMDLINE )
    • образ ramdisk vendor_boot
      • lib/modules
      • Ресурсы восстановления (если нет выделенного восстановления)
    • dtb изображение
  • изображение recovery

    • Версия заголовка V2
      • Специфическая для устройства cmdline для восстановления, если необходимо
      • Для раздела восстановления, отличного от A/B, содержимое заголовка должно быть автономным; см. раздел «Образы для восстановления» . Например:
      • cmdline не объединена с boot и vendor_boot cmdline .
      • Заголовок указывает восстановление DTBO, если необходимо.
      • Для раздела восстановления A/B содержимое может быть объединено или выведено из boot и vendor_boot . Например:
      • cmdline объединяется с boot и vendor_boot cmdline .
      • DTBO можно вывести из заголовка vendor_boot .
    • образ ramdisk recovery
      • Ресурсы восстановления
      • Для раздела восстановления, отличного от A/B, содержимое RAM-диска должно быть автономным; см. раздел «Образы для восстановления» . Например:
      • lib/modules должен содержать все модули ядра, необходимые для загрузки режима восстановления.
      • RAM-диск восстановления должен содержать init .
      • Для раздела восстановления A/B виртуальный диск восстановления добавляется к общему виртуальному диску и виртуальному диску vendor_boot , поэтому ему не обязательно быть отдельным. Например:
      • lib/modules может содержать только дополнительные модули ядра, необходимые для загрузки режима восстановления, помимо модулей ядра в ramdisk vendor_boot .
      • Символическая ссылка /init может существовать, но она затмевается двоичным файлом /init первой стадии в загрузочном образе.

Содержимое образа универсального ramdisk

Универсальный электронный диск содержит следующие компоненты.

  • init
  • system/etc/ramdisk/build.prop
  • ro. PRODUCT .bootimg.* build props
  • Пустые каталоги для точек монтирования: debug_ramdisk/ , mnt/ , dev/ , sys/ , proc/ , metadata/
  • first_stage_ramdisk/
    • Дублированные пустые каталоги для точек монтирования: debug_ramdisk/ , mnt/ , dev/ , sys/ , proc/ , metadata/

Интеграция загрузочного образа

Флаги сборки управляют сборкой образов init_boot , boot , recovery и vendor_boot . Значение логической переменной board должно быть строкой true или быть пустым (что является значением по умолчанию).

  • TARGET_NO_KERNEL . Эта переменная указывает, использует ли сборка готовый загрузочный образ. Если эта переменная имеет значение true , то в качестве значения BOARD_PREBUILT_BOOTIMAGE указывается расположение готового загрузочного образа ( BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img ).

  • BOARD_USES_RECOVERY_AS_BOOT . Эта переменная указывает, использует ли устройство образ recovery в качестве boot образа. При использовании GKI эта переменная пуста, и ресурсы восстановления следует перенести в vendor_boot .

  • BOARD_USES_GENERIC_KERNEL_IMAGE . Эта переменная указывает, что плата использует GKI. Эта переменная не влияет на системные свойства или PRODUCT_PACKAGES .

    Это переключатель GKI на уровне платы; все следующие переменные ограничиваются этой переменной.

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT . Эта переменная управляет тем, будут ли ресурсы восстановления RAM-диска встроены в vendor_boot .

    • Если установлено значение true , ресурсы восстановления создаются только в vendor-ramdisk/ и не создаются в recovery/root/ .

    • Если он пуст, ресурсы восстановления создаются только в recovery/root/ и не создаются в vendor-ramdisk/ .

  • BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT . Эта переменная управляет тем, будут ли ключи GSI AVB создаваться в vendor_boot .

    • Если установлено значение true , если BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :

      • Если установлено, ключи GSI AVB создаются в $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb .

      • Если не установлено, ключи GSI AVB создаются в $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb .

    • Если пусто, если BOARD_RECOVERY_AS_ROOT :

      • Если установлено, ключи GSI AVB создаются в $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb .

      • Если не установлено, ключи GSI AVB создаются в $ANDROID_PRODUCT_OUT/ramdisk/avb .

  • BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE . Эта переменная определяет, содержит ли образ recovery ядро. Устройства, работающие под управлением Android 12 и использующие раздел recovery A/B, должны установить для этой переменной значение true . Устройства, работающие под управлением Android 12 и использующие раздел восстановления, отличный от A/B, должны установить для этой переменной значение false , чтобы образ восстановления оставался автономным.

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES . Эта переменная управляет копированием $OUT/boot*.img в IMAGES/ в целевых файлах.

    • aosp_arm64 должен установить эту переменную в true .

    • Другие устройства должны оставить эту переменную пустой.

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE . Эта переменная управляет созданием init_boot.img и задаёт его размер. При установке универсального RAM-диска он добавляется в init_boot.img вместо boot.img и требует установки переменных BOARD_AVB_INIT_BOOT* для цепочек vbmeta .

Допустимые комбинации

Компонент или переменная Обновление устройства без раздела восстановления Обновление устройства с помощью раздела восстановления Запустить устройство без раздела восстановления Запустить устройство с разделом восстановления A/B Запустить устройство с разделом восстановления, отличным от A/B aosp_arm64
Содержит boot да да да да да да
Содержит init_boot (Android 13) нет нет да да да да
Содержит vendor_boot необязательный необязательный да да да нет
Содержит recovery нет да нет да да нет
BOARD_USES_RECOVERY_AS_BOOT true пустой пустой пустой пустой пустой
BOARD_USES_GENERIC_KERNEL_IMAGE пустой пустой true true true true
PRODUCT_BUILD_RECOVERY_IMAGE пустой true или пусто пустой true или пусто true или пусто пустой
BOARD_RECOVERYIMAGE_PARTITION_SIZE пустой > 0 пустой > 0 > 0 пустой
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT пустой пустой true пустой пустой пустой
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT пустой пустой true true true пустой
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE пустой пустой пустой true пустой пустой
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES пустой пустой пустой пустой пустой true

Устройства с выделенным разделом recovery могут установить PRODUCT_BUILD_RECOVERY_IMAGE в true или оставить пустым. Для таких устройств, если задан BOARD_RECOVERYIMAGE_PARTITION_SIZE , создаётся образ recovery .

Включить цепочку vbmeta для загрузки

Для образов boot и init_boot необходимо включить цепочку vbmeta. Укажите следующее:

BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2

BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3

В качестве примера можно привести это изменение .

Система-как-root

Система с правами root не поддерживается для устройств, использующих GKI. На таких устройствах BOARD_BUILD_SYSTEM_ROOT_IMAGE должен быть пустым. Система с правами root также не поддерживается для устройств, использующих динамические разделы.

Конфигурации продукта

Устройства, использующие универсальный RAM-диск, должны установить список файлов, разрешённых к установке на RAM-диск. Для этого укажите в device.mk следующее:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)

Файл generic_ramdisk.mk также предотвращает случайную установку других файлов на ramdisk другими make-файлами (вместо этого перемещайте такие файлы в vendor_ramdisk ).

Настройка устройств

Инструкции по настройке различаются для устройств с Android 13, обновленных до Android 12 и устройств с Android 12. Процесс настройки Android 13 аналогичен процессу настройки Android 12.

  • Устройства, обновляемые до Android 12:

    • Можно сохранить значение BOARD_USES_RECOVERY_AS_BOOT . В этом случае используются устаревшие конфигурации, и новые переменные сборки должны быть пустыми. Если такие устройства:

      • Установите BOARD_USES_RECOVERY_AS_BOOT в 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

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 . Процесс загрузки в режиме восстановления выглядит следующим образом.

  1. Запускается загрузчик, затем выполняется следующее:

    1. Помещает recovery + vendor_boot + generic ramdisk в / . (Если OEM-производитель дублирует модули ядра в recovery ramdisk, добавляя их в BOARD_RECOVERY_KERNEL_MODULES ), vendor_boot необязателен.)
    2. Запускает ядро ​​из boot раздела.
  2. Ядро монтирует ramdisk в / а затем выполняет /init с общего ramdisk.

  3. Запускается первый этап init, затем выполняется следующее:

    1. Устанавливает IsRecoveryMode() == true и ForceNormalBoot() == false .
    2. Загружает модули ядра поставщика из /lib/modules .
    3. Вызывает DoFirstStageMount() , но пропускает монтирование, поскольку IsRecoveryMode() == true . (Устройство не освобождает ramdisk (потому что / все тот же), но вызывает SetInitAvbVersionInRecovery() .)
    4. Запускает второй этап инициализации из /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 . Процесс загрузки в режиме восстановления выглядит следующим образом.

  1. Запускается загрузчик, затем выполняется следующее:

    1. Перемещает RAM-диск восстановления в / .
    2. Запускает ядро ​​из раздела recovery .
  2. Ядро монтирует ramdisk в / а затем выполняет /init , который является символической ссылкой на /system/bin/init с ramdisk recovery .

  3. Запускается первый этап init, затем выполняется следующее:

    1. Устанавливает IsRecoveryMode() == true и ForceNormalBoot() == false .
    2. Загружает модули ядра поставщика из /lib/modules .
    3. Вызывает DoFirstStageMount() , но пропускает монтирование, поскольку IsRecoveryMode() == true . (Устройство не освобождает ramdisk (потому что / все тот же), но вызывает SetInitAvbVersionInRecovery() .)
    4. Запускает второй этап инициализации из /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 образа.