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

В Android 12 универсальный boot образ, называемый универсальным образом ядра (GKI) , содержит универсальный виртуальный диск и ядро ​​GKI.

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

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

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

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

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

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

Архитектура

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обновление до Android 12, восстановление при загрузке (восстановление при загрузке)

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

Рис. 7. Обновление устройств до Android 12, без GKI, восстановление при загрузке

Обновление до Android 12, выделенное восстановление (выделенный виртуальный диск)

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

Рис. 8. Обновление устройств до Android 12, без GKI, выделенное восстановление

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

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

  • Изображение init_boot добавлено для устройств, запускаемых с Android 13.

    • Версия заголовка V4
    • Общий образ виртуального диска
  • Общий boot образ

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

    • заголовок vendor_boot
      • BOARD_KERNEL_CMDLINE cmdline
    • Образ RAM vendor_boot
      • lib/modules
      • Ресурсы восстановления (если нет выделенного восстановления)
    • изображение dtb
  • образ recovery

    • Версия заголовка V2
      • Командная cmdline для конкретного устройства для восстановления, если это необходимо
      • Для раздела восстановления, отличного от A/B, содержимое заголовка должно быть автономным; см. Образы для восстановления . Например:
      • cmdline не объединяется с командной cmdline boot и vendor_boot .
      • Заголовок указывает восстановление DTBO, если это необходимо.
      • Для раздела восстановления A/B содержимое может быть объединено или выведено из boot и vendor_boot . Например:
      • cmdline объединяется с командной cmdline boot и vendor_boot .
      • DTBO можно вывести из заголовка vendor_boot .
    • образ виртуального диска recovery
      • Ресурсы восстановления
      • Для раздела восстановления, отличного от A/B, содержимое виртуального диска должно быть автономным; см. Образы для восстановления . Например:
      • lib/modules должен содержать все модули ядра, необходимые для загрузки режима восстановления
      • Виртуальный диск восстановления должен содержать init .
      • Для раздела восстановления A/B виртуальный диск восстановления добавляется к общему виртуальному диску и vendor_boot , поэтому он не должен быть автономным. Например:
      • lib/modules может содержать только дополнительные модули ядра, необходимые для загрузки режима восстановления, помимо модулей ядра в 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 . Значение логической переменной 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 . Эта переменная определяет, будут ли ресурсы восстановления виртуального диска встроены в vendor_boot .

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

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

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

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

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

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

    • Когда пусто, если BOARD_RECOVERY_AS_ROOT :

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

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

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

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

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

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

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE . Эта переменная определяет, генерируется ли init_boot.img , и устанавливает размер. Когда установлено, общий виртуальный диск добавляется в init_boot.img вместо boot.img и требует, чтобы переменные BOARD_AVB_INIT_BOOT* были установлены для связанной vbmeta.

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

Компонент или переменная Обновление устройства без раздела recovery Обновление устройства с разделом recovery Запустить устройство без раздела recovery Запустите устройство с разделом recovery A/B Запустите устройство с разделом recovery , отличным от 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 для загрузки

Цепочка 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

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

Система от имени root

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

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

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

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

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

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

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

  • Устройства, обновляющиеся до Android 12:

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

      • Установите для BOARD_USES_RECOVERY_AS_BOOT значение true , архитектура показана на рисунке 3 .

      • Установите для BOARD_USES_RECOVERY_AS_BOOT пустое значение, архитектура показана на рис. 4 .

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

      • Не используйте выделенный раздел recovery , архитектура показана на рис. 1 , а параметр настройки устройства — Вариант 1 .

      • Используйте выделенный раздел recovery , архитектура показана на рис. 2a или рис. 2b , а вариант настройки устройства — вариант 2a или вариант 2b .

  • Устройства, запускаемые с Android 12, должны установить BOARD_USES_RECOVERY_AS_BOOT на пустое значение и использовать новые конфигурации. Если такие устройства:

    • Не используйте выделенный раздел recovery , архитектура показана на рис. 1 , а параметр настройки устройства — Вариант 1 .

    • Используйте выделенный раздел recovery , архитектура показана на рис. 2a или рис. 2b , а вариант настройки устройства — вариант 2a или вариант 2b .

Поскольку aosp_arm64 создает только GKI (а не vendor_boot или recovery), он не является полной целью. Конфигурации сборки aosp_arm64 см. в generic_arm64 .

Вариант 1: нет выделенного раздела восстановления

Устройства без раздела recovery содержат общий boot образ в boot разделе. Виртуальный диск vendor_boot содержит все ресурсы для восстановления, включая lib/modules (с модулями ядра производителя). На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .

Установка значений BOARD

Установите следующие значения:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

Виртуальный диск vendor_boot может содержать символическую ссылку /init на /system/bin/init и init_second_stage.recovery в /system/bin/init . Однако, поскольку общий виртуальный диск объединяется после vendor_boot , символическая ссылка /init перезаписывается. Когда устройство загружается в режиме восстановления, двоичный файл /system/bin/init необходим для поддержки второго этапа инициализации. Содержимое vendor_boot + generic ramdisks выглядит следующим образом:

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

Перемещение файлов fstab

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

Установка модулей

При желании вы можете установить модули для конкретных устройств на vendor_ramdisk (пропустите этот шаг, если у вас нет модулей для конкретных устройств для установки).

  • Используйте вариант модуля vendor_ramdisk при установке модуля на /first_stage_ramdisk . Этот модуль должен быть доступен после того, как init переключит root на /first_stage_ramdisk но до того, как init переключит root на /system . Примеры см. в разделах Контрольные суммы метаданных и Виртуальное сжатие A/B .

  • Используйте вариант recovery модуля, когда модуль устанавливается в / . Этот модуль должен быть доступен до того, как init переключит root на /first_stage_ramdisk . Подробнее об установке модулей в / см. Консоль первой стадии .

Консоль первой ступени

Поскольку консоль первого этапа запускается до того, как init переключит root на /first_stage_ramdisk , вам необходимо установить вариант recovery модулей. По умолчанию оба варианта модуля устанавливаются в файл build/make/target/product/base_vendor.mk , поэтому, если make-файл устройства наследуется от этого файла, вам не нужно явно устанавливать вариант recovery .

Чтобы явно установить модули восстановления, используйте следующее.

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

Это гарантирует, что linker , sh и toybox установлены в $ANDROID_PRODUCT_OUT/recovery/root/system/bin , который затем будет установлен в /system/bin на vendor_ramdisk .

Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), используйте следующее.

PRODUCT_PACKAGES += adbd.recovery

Это гарантирует, что указанные модули будут установлены в $ANDROID_PRODUCT_OUT/recovery/root/system/bin , который затем будет установлен в /system/bin на vendor_ramdisk .

Контрольные суммы метаданных

Для поддержки контрольных сумм метаданных во время монтирования на первом этапе устройства, не поддерживающие GKI, устанавливают вариант RAM-диска следующих модулей. Чтобы добавить поддержку 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 мог считывать метку времени сборки при загрузке.

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

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

Makefiles устройств могут наследоваться от:

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

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

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

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

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

AB_OTA_PARTITIONS += recovery

Виртуальный диск vendor_boot содержит биты поставщика модулей виртуального диска и ядра поставщика, включая следующие:

  • Файлы fstab для конкретных устройств

  • lib/modules (включает модули ядра поставщика)

Виртуальный диск recovery содержит все ресурсы для восстановления. На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .

Установка значений BOARD

Установите следующие значения для устройств с разделом recovery A/B:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

Виртуальный диск recovery может содержать символическую ссылку /init -> /system/bin/init и init_second_stage.recovery в /system/bin/init . Однако, поскольку загрузочный виртуальный диск объединяется после виртуального диска recovery , символическая ссылка /init перезаписывается. Когда устройство загружается в режиме восстановления, двоичный файл /system/bin/init необходим для поддержки второго этапа инициализации.

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

  • /init (из виртуального диска, созданного из init_first_stage )
  • /system/bin/init (из RAM-диска recovery , созданного из init_second_stage.recovery и выполненного из /init )

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

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

Перемещение файлов fstab

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

Установка модулей

При желании вы можете установить модули для конкретных устройств на vendor_ramdisk (пропустите этот шаг, если у вас нет модулей для конкретных устройств для установки). Init не переключает root. Вариант модулей vendor_ramdisk устанавливается в корень vendor_ramdisk . Примеры установки модулей на vendor_ramdisk см. в разделах Консоль первого этапа , Контрольные суммы метаданных и Виртуальное сжатие A/B .

Консоль первой ступени

Чтобы установить вариант модулей vendor_ramdisk , используйте следующее:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Это гарантирует, что linker , sh и toybox установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , который затем будет установлен в /system/bin под vendor_ramdisk .

Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), включите вариант этих модулей vendor_ramdisk , загрузив соответствующие исправления в AOSP, а затем используйте следующее:

PRODUCT_PACKAGES += adbd.vendor_ramdisk

Это гарантирует, что указанные модули будут установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin . Если vendor_boot загружается в режиме восстановления, модуль также доступен в режиме recovery . Если виртуальный диск vendor_boot не загружен в режиме восстановления, устройство также может дополнительно установить adbd.recovery .

Контрольные суммы метаданных

Для поддержки контрольных сумм метаданных во время монтирования на первом этапе устройства, не поддерживающие GKI, устанавливают вариант RAM-диска следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin :

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

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

Виртуальное сжатие A/B

Для поддержки виртуального сжатия A/B snapuserd должен быть установлен на vendor_ramdisk . Устройство должно наследоваться от virtual_ab_ota/compression.mk , который устанавливает вариант vendor_ramdisk snapuserd .

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

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

При загрузке в режиме восстановления процесс загрузки меняется. Процесс восстановления + vendor_boot + общий виртуальный диск аналогичен существующему процессу восстановления, но ядро ​​загружается из boot образа, а не из образа recovery . Процесс загрузки для режима восстановления выглядит следующим образом.

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

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

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

    1. Устанавливает IsRecoveryMode() == true и ForceNormalBoot() == false .
    2. Загружает модули ядра поставщика из /lib/modules .
    3. Вызывает DoFirstStageMount() но пропускает монтирование, поскольку IsRecoveryMode() == true . (Устройство не освобождает виртуальный диск (потому что / остается прежним), но вызывает SetInitAvbVersionInRecovery() .)
    4. Запускает второй этап инициализации из /system/bin/init с RAM-диска recovery .

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

Makefiles устройств могут наследоваться от:

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

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

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

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

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

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

Виртуальный диск vendor_boot содержит биты поставщика модулей виртуального диска и ядра поставщика, включая следующие:

  • Файлы fstab для конкретных устройств
  • lib/modules (включает модули ядра поставщика)

Образ recovery должен быть автономным. Он должен содержать все необходимые ресурсы для загрузки режима восстановления, в том числе:

  • Образ ядра
  • Изображение DTBO
  • Модули ядра в lib/modules
  • Инициализация первого этапа как символическая ссылка /init -> /system/bin/init
  • Двоичный файл инициализации второго этапа /system/bin/init
  • Файлы fstab для конкретных устройств
  • Все остальные ресурсы восстановления, включая двоичный файл recovery и т. д.
  • и т.п.

На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .

Установка значений BOARD

Установите следующие значения для устройств, отличных от A/B:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

Виртуальный диск recovery должен содержать символическую ссылку /init -> /system/bin/init и init_second_stage.recovery в /system/bin/init . Когда устройство загружается в режим восстановления, двоичный файл /system/bin/init необходим для поддержки как первого, так и второго этапа инициализации.

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

  • /init -> /system/bin/init (с RAM-диска recovery )
  • /system/bin/init (из RAM-диска recovery , созданного из init_second_stage.recovery и выполненного из /init )

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

  • /init (из виртуального диска, созданного из init_first_stage )

Перемещение файлов fstab

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

Установка модулей

При желании вы можете установить модули для конкретного устройства на vendor_ramdisk и виртуальный диск recovery (пропустите этот шаг, если у вас нет модулей для конкретного устройства для установки). init не переключает root. Вариант модулей vendor_ramdisk устанавливается в корень vendor_ramdisk . Вариант recovery модулей устанавливается в корень виртуального диска recovery . Примеры установки модулей на vendor_ramdisk и на виртуальный диск recovery см. в разделе Консоль первого этапа и контрольные суммы метаданных .

Консоль первой ступени

Чтобы установить вариант модулей vendor_ramdisk , используйте следующее:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

Это гарантирует, что linker , sh и toybox установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , который затем будет установлен в /system/bin под vendor_ramdisk .

Чтобы добавить модули, необходимые для консоли первого этапа (например, adbd), включите вариант этих модулей vendor_ramdisk , загрузив соответствующие исправления в AOSP, а затем используйте следующее:

PRODUCT_PACKAGES += adbd.vendor_ramdisk

Это гарантирует, что указанные модули будут установлены в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin .

Чтобы установить вариант recovery модулей, замените vendor_ramdisk на recovery :

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \
    adbd.recovery \

Контрольные суммы метаданных

Для поддержки контрольных сумм метаданных во время монтирования на первом этапе устройства, не поддерживающие GKI, устанавливают вариант RAM-диска следующих модулей. Чтобы добавить поддержку GKI, переместите модули в $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin :

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

Для поддержки контрольных сумм метаданных на первом этапе монтирования в процессе восстановления включите вариант восстановления этих модулей и также установите их.

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

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

При загрузке в режиме восстановления процесс загрузки не меняется. Виртуальный диск восстановления загружается так же, как и существующий процесс восстановления. Ядро загружается из образа recovery . Процесс загрузки для режима восстановления выглядит следующим образом.

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

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

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

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

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