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

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

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

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

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

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

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

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

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

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

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

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

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

Система как root

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

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

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

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

Файл generic_ramdisk.mk также предотвращает случайную установку других файлов makefile на виртуальный диск (вместо этого переместите такие файлы в 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 или восстановление), он не является полной целью. Информацию о конфигурациях сборки aosp_arm64 . в generic_arm64 .

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

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

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

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

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

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

  • /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, устанавливают вариант 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

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

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

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

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

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

Файлы сборки устройства могут наследовать от:

  • 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

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

  • Файлы 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 . Однако, поскольку загрузочный виртуальный диск объединяется после виртуального диска recovery , символическая ссылка /init перезаписывается. Когда устройство загружается в режим восстановления, двоичный файл /system/bin/init необходим для поддержки второго этапа инициализации.

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

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

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

  • /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 диск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 + аналогичен существующему процессу загрузки, за исключением того, что fstab загружается vendor_boot . Поскольку system/bin/recovery не существует, first_stage_init обрабатывает его как обычную загрузку.

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

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

    1. Помещает восстановление + vendor_boot +generic ramdisk в / . (Если 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 с виртуального диска recovery .

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

Файлы сборки устройства могут наследовать от:

  • 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 должен быть автономным. Он должен содержать все необходимые ресурсы для загрузки режима восстановления, в том числе:

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

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

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

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

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

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

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

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

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

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

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

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

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

При желании вы можете установить модули для конкретного устройства на vendor_ramdisk и виртуальный диск recovery (пропустите этот шаг, если у вас нет модулей для конкретного устройства для установки). init не переключает корень. Вариант 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, устанавливают вариант ramdisk следующих модулей. Чтобы добавить поддержку 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 обрабатывает его как обычную загрузку.

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