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

В Android 12 общий boot образ, называемый общим образом ядра (Generic Kernel Image, GKI) , содержит общий ramdisk и ядро ​​GKI.

Для устройств, запускаемых с Android 13, общий ramdisk удаляется из образа boot и помещается в отдельный образ init_boot . Это изменение оставляет образ boot только с ядром GKI.

Для обновленных устройств, которые продолжают использовать Android 12 или более ранние версии ядра, общий ramdisk остается там же, где и был, без необходимости в новом образе init_boot .

Чтобы создать универсальный электронный диск, переместите специфичные для поставщика ресурсы из электронного диска таким образом, чтобы универсальный электронный диск содержал только первую стадию init и файл свойств, содержащий информацию о временных метках.

На устройствах, которые:

  • Не используйте выделенный раздел recovery , все данные восстановления переносятся с универсального RAM-диска на RAM-диск vendor_boot .

  • Используйте выделенный раздел recovery , никаких изменений в RAM-диске recovery не требуется, поскольку RAM-диск recovery является автономным.

Архитектура

На следующих диаграммах показана архитектура для устройств с Android 12 и выше. Устройства, запускаемые с Android 13, имеют новый образ init_boot , содержащий универсальный ramdisk. Устройства, обновляемые с 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 для сертификации GKI boot.img (только v4). Сертифицированный GKI boot.img не подписан для проверенной загрузки. OEM-производители должны по-прежнему подписывать предварительно собранный boot.img с помощью ключа AVB для конкретного устройства.
      • Общая cmdline ( GENERIC_KERNEL_CMDLINE )
      • Ядро GKI
    • Универсальный образ ramdisk
      • Включено только в boot образы Android 12 и более ранних версий.
  • Образ vendor_boot (подробнее см. в разделе Разделы загрузки поставщика )

    • заголовок vendor_boot
      • Специфическая для устройства cmdline ( BOARD_KERNEL_CMDLINE )
    • образ электронного диска 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 содержимое ramdisk должно быть автономным; см. Образы восстановления . Например:
      • lib/modules должен содержать все модули ядра, необходимые для загрузки режима восстановления
      • RAM-диск восстановления должен содержать init .
      • Для раздела восстановления A/B ramdisk восстановления добавляется к generic и vendor_boot ramdisk, поэтому он не должен быть автономным. Например:
      • lib/modules может содержать только дополнительные модули ядра, необходимые для загрузки в режиме восстановления, помимо модулей ядра в ramdisk vendor_boot .
      • Символическая ссылка на /init может существовать, но она затмевается двоичным файлом /init первой стадии в загрузочном образе.

Содержимое образа общего электронного диска

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

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

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

Флаги сборки управляют тем, как создаются образы init_boot , boot , recovery и vendor_boot . Значение переменной boolean 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. Эта переменная не влияет на 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 и использующие раздел 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 и задает размер. При установке универсальный ramdisk добавляется в 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 для загрузки

Chained vbmeta должен быть включен для образов boot и init_boot . Укажите следующее:

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

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

Для примера обратитесь к этому изменению .

Система-как-корень

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

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

Устройства, использующие общий ramdisk, должны установить список файлов, которые разрешено устанавливать на 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 содержат образ generic boot в разделе boot . RAM-диск vendor_boot содержит все ресурсы восстановления, включая lib/modules (с модулями ядра vendor). На таких устройствах конфигурация продукта наследуется от 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 перезаписывается. Когда устройство загружается в режим восстановления, для поддержки второго этапа init необходим двоичный файл /system/bin/init . Содержимое RAM-дисков vendor_boot + generic следующее:

  • /init (из универсального ramdisk, собранного из init_first_stage )
  • /system/bin/init (из vendor_ramdisk , собранного из init_second_stage.recovery )

Переместить файлы fstab

Переместите все файлы fstab , которые были установлены на generic 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 , который устанавливает вариант vendor_ramdisk snapuserd .

Изменения в процессе загрузки

Процесс загрузки в режим восстановления или в Android не меняется, за следующим исключением:

  • Ramdisk build.prop перемещается в /second_stage_resources , чтобы init второго этапа могла считывать временную метку сборки при загрузке.

Поскольку ресурсы перемещаются из универсального ramdisk в ramdisk vendor_boot , результат объединения универсального ramdisk с ramdisk vendor_boot не меняется.

Сделать e2fsck доступным

Файлы make-файлов устройств могут наследоваться от:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk , если устройство поддерживает виртуальный A/B, но не сжатие.

  • virtual_ab_ota/compression.mk , если устройство поддерживает виртуальное сжатие A/B.

Файлы makefile продукта устанавливают $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck . Во время выполнения первый этап init переключает root в /first_stage_ramdisk а затем выполняет /system/bin/e2fsck .

Вариант 2a: Выделенный раздел и раздел восстановления A/B

Используйте эту опцию для устройств с разделами recovery A/B; то есть, устройство имеет раздел recovery_a и recovery_b partition . К таким устройствам относятся устройства A/B и Virtual A/B, раздел восстановления которых является обновляемым, со следующей конфигурацией:

AB_OTA_PARTITIONS += recovery

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 необходим для поддержки второго этапа init.

Когда устройство загружается в recovery , содержимое дисков recovery + vendor_boot + generic выглядит следующим образом:

  • /init (из ramdisk, собранного из init_first_stage )
  • /system/bin/init (из RAM-диска recovery , собранного из init_second_stage.recovery и запущенного из /init )

При загрузке Android на устройстве содержимое vendor_boot + generic ramdisks выглядит следующим образом:

  • /init (из универсального ramdisk, собранного из init_first_stage )

Переместить файлы fstab

Переместите все файлы fstab , которые были установлены на generic 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 . Если ramdisk vendor_boot загружен в режиме восстановления, модуль также доступен в recovery . Если ramdisk 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 , который устанавливает вариант vendor_ramdisk snapuserd .

Изменения в процессе загрузки

При загрузке в Android процесс загрузки не меняется. vendor_boot + generic ramdisk аналогичен существующему процессу загрузки, за исключением того, что fstab загружается из vendor_boot . Поскольку system/bin/recovery не существует, first_stage_init обрабатывает его как обычную загрузку.

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

Файлы make-файлов устройств могут наследоваться от:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk , если устройство поддерживает виртуальный A/B, но не сжатие.

  • virtual_ab_ota/compression.mk , если устройство поддерживает виртуальное сжатие A/B.

Файлы makefile продукта устанавливают $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck . Во время выполнения первый этап init выполняет /system/bin/e2fsck .

Вариант 2b: Выделенный и не-A/B раздел восстановления

Используйте эту опцию для устройств с разделом recovery , отличным от A/B; то есть, устройство имеет раздел с именем recovery без суффикса слота. К таким устройствам относятся:

  • не-A/B устройства;
  • Устройства A/B и Virtual A/B, раздел восстановления которых не подлежит обновлению. (Это необычно.)

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 необходим для поддержки как первой, так и второй стадии init.

Когда устройство загружается в recovery , содержимое виртуальных дисков recovery выглядит следующим образом:

  • /init -> /system/bin/init (из RAM-диска recovery )
  • /system/bin/init (из RAM-диска recovery , собранного из init_second_stage.recovery и запущенного из /init )

При загрузке Android на устройстве содержимое vendor_boot + generic ramdisks выглядит следующим образом:

  • /init (из ramdisk, собранного из init_first_stage )

Переместить файлы fstab

Переместите все файлы fstab , которые были установлены на generic ramdisk, в vendor_ramdisk и recovery ramdisk. Для примера обратитесь к этому изменению .

Установить модули

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

При загрузке в режиме восстановления процесс загрузки не меняется. 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
  • Во время сборки файл system/etc/ramdisk/build.prop добавляется в общий ramdisk. Этот файл содержит информацию о временных метках сборки.

  • Во время выполнения первый этап init копирует файлы с ramdisk в tmpfs перед освобождением ramdisk, чтобы второй этап init мог прочитать этот файл и задать свойства временной метки boot образа.