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

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

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

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

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

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

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

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

Архитектура

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

Запуск с Android 13, без выделенного режима восстановления.

Запуск/обновление устройства, 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-ramdisk)

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

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

Содержимое типового образа оперативной памяти

Стандартный образ оперативной памяти содержит следующие компоненты.

  • 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 . Значение логической переменной платы должно быть строкой 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 , и для цепочки vbmeta требуется установить переменные BOARD_AVB_INIT_BOOT* .

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

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

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

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

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

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

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

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

Система как root

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Поскольку aosp_arm64 собирает только GKI (а не vendor_boot или recovery), это не полноценная целевая платформа. Для получения информации о конфигурациях сборки aosp_arm64 обратитесь к generic_arm64 .

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

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

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

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

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

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

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

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

Переместите все файлы fstab , установленные на универсальный ramdisk, в раздел vendor_ramdisk . Пример можно посмотреть в этом изменении .

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

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

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

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

Консоль первого этапа

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

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

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

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

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

PRODUCT_PACKAGES += adbd.recovery

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

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

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

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

В качестве примера обратитесь к этому списку изменений .

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

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

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

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

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

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

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

Файлы makefile для устройств могут наследовать следующие типы данных:

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

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

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

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

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

AB_OTA_PARTITIONS += recovery

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

  • Файлы fstab , специфичные для конкретного устройства

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

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

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

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

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

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

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

  • /init (из ramdisk, создано из init_first_stage )
  • /system/bin/init (из образа оперативной памяти recovery , созданного из init_second_stage.recovery и запущенного из /init )

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

  • /init (из универсального образа оперативной памяти, созданного из init_first_stage )

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

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

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

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

Консоль первого этапа

Для установки варианта модулей vendor_ramdisk используйте следующее:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

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

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

PRODUCT_PACKAGES += adbd.vendor_ramdisk

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

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

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

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

В качестве примера обратитесь к этому списку изменений .

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

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

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

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

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

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

    1. Загружает образ восстановления + 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 . (Устройство не освобождает ramdisk (поскольку / остается тем же), но вызывает SetInitAvbVersionInRecovery() .)
    4. Запускает второй этап инициализации из /system/bin/init с образа оперативной памяти recovery .

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

Файлы makefile для устройств могут наследовать следующие типы данных:

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

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

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

Вариант 2b: Выделенный раздел восстановления без поддержки A/B-параметров.

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

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

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

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

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

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

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

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

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

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

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

При загрузке устройства в recovery содержимое образов памяти recovery выглядит следующим образом:

  • /init -> /system/bin/init (из recovery образа оперативной памяти)
  • /system/bin/init (из образа оперативной памяти recovery , созданного из init_second_stage.recovery и запущенного из /init )

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

  • /init (из ramdisk, создано из init_first_stage )

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

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

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

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

Консоль первого этапа

Для установки варианта модулей vendor_ramdisk используйте следующее:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

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

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

PRODUCT_PACKAGES += adbd.vendor_ramdisk

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

Для установки варианта модулей recovery замените vendor_ramdisk на recovery :

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

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

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

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

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

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

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

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

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

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

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

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

метки времени загрузочного образа

Ниже приведён пример кода файла с метками времени boot образа:

####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
  • В процессе сборки в универсальный виртуальный диск в оперативной памяти добавляется файл system/etc/ramdisk/build.prop . Этот файл содержит информацию о временной метке сборки.

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