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

В 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 .
      • Символическая ссылка на /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 .

Разрешенные комбинации

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

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

Включить связанную vbmeta для загрузки

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

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

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

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

Система как root

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

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

Устройства, использующие общий виртуальный диск, должны установить список файлов, которые разрешено устанавливать на виртуальный диск. Для этого укажите в 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 или восстановление), он не является полной целью. Информацию о конфигурациях сборки 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, устанавливают варианты с виртуальным диском следующих модулей. Чтобы добавить поддержку 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 snapuserd virtual_ab_ota/compression.mk , который устанавливает вариант 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 не загружен в режиме восстановления, устройство также может дополнительно установить 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 snapuserd virtual_ab_ota/compression.mk , который устанавливает вариант 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.

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

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

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

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

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

,

В 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
      • 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 .
      • Символическая ссылка на /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 . Эта переменная контролирует, созданы ли ресурсы восстановления 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 и с помощью A/B recovery Partition, должны установить эту переменную на true . Устройства, запущенные с Android 12 и с использованием Non-A/B, должны установить эту переменную на false , чтобы сохранить их изображение.

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

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

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

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

Разрешены комбинации

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

Устройства с выделенным разделом recovery могут установить PRODUCT_BUILD_RECOVERY_IMAGE true или EMPLE. Для этих устройств, если устанавливается 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

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

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

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

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

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

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

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

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

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

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

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

      • SET BOARD_USES_RECOVERY_AS_BOOT В true архитектура показана на рисунке 3 .

      • SET BOARD_USES_RECOVERY_AS_BOOT .

    • Может установить 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 разделе. vendor_boot Ramdisk содержит все ресурсы восстановления, включая lib/modules (с модулями ядра поставщика). На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .

Установить значения доски

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

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 symlink и init_second_stage.recovery at /system/bin/init . Однако, поскольку общий рамдиск объединяется после vendor_boot ramdisk, символа /init перезаписана. Когда устройство загружается в восстановление, для поддержки второго этапа Bynare Travel Trabily /system/bin/init . Содержание vendor_boot + общие рамдиски следующие:

  • /init (из Generic Ramdisk, построенный из init_first_stage )
  • /system/bin/init (от vendor_ramdisk , построенный из init_second_stage.recovery )

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

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

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

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

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

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

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

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

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

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

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

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

PRODUCT_PACKAGES += adbd.recovery

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

Метаданные контрольные суммы

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

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

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

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

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

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

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

  • Ramdisk build.prop перемещается в /second_stage_resources так что второй init может прочитать временную метку Build Boot.

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

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

Устройство Makefiles может наследовать от:

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

  • virtual_ab_ota/compression.mk Если устройство поддерживает Virtual A/B Compression.

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

Вариант 2A: выделенная и A/B -перегородка

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

AB_OTA_PARTITIONS += recovery

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

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

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

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

Установить значения доски

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

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

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

  • /init (из ramdisk, построенный из init_first_stage )
  • /system/bin/init (из recovery Ramdisk, построенный из init_second_stage.recovery и выполнено из /init )

Когда устройство загружается в Android, содержимое vendor_boot + Generic Ramdisks заключается в следующем:

  • /init (из Generic Ramdisk, построенный из init_first_stage )

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

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

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

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

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

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

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

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

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

PRODUCT_PACKAGES += adbd.vendor_ramdisk

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

Метаданные контрольные суммы

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

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

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

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

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

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

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

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

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

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

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

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

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

Устройство Makefiles может наследовать от:

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

  • virtual_ab_ota/compression.mk Если устройство поддерживает Virtual A/B Compression.

Продукт Makefiles устанавливает $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 как Symlink /init -> /system/bin/init
  • Второй стадий инициатор Binary /system/bin/init
  • Файлы fstab , специфичные для устройства
  • Все остальные ресурсы восстановления, в том числе бинарник recovery

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

Установить значения доски

Установите следующие значения для устройств Non-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 symlink и init_second_stage.recovery at /system/bin/init . Когда устройство загружается в режим восстановления, для поддержки как первой ступени, так и второй этапа /system/bin/init Init.

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

  • /init -> /system/bin/init (от recovery ramdisk)
  • /system/bin/init (из recovery Ramdisk, построенный из init_second_stage.recovery и выполнено из /init )

Когда устройство загружается в Android, содержимое vendor_boot + Generic Ramdisks заключается в следующем:

  • /init (из ramdisk, построенный из init_first_stage )

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

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

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

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

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

Чтобы установить вариант 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. Подталкивает восстановление Ramdisk до / .
    2. Запускает ядро ​​от раздела recovery .
  2. Ядра Mounts Ramdisk to / затем выполняет /init , которая является символом /system/bin/init из recovery Ramdisk.

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

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

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

Следующий код является примером файла boot Image примером:

####################################
# 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 добавляется в общий рамдиск. Этот файл содержит информацию о временной метке сборки.

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

,

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

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

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

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

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

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

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

Архитектура

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

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

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

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

Запуск с Android 13, Jexicated и A/B Recovery (выделенный Ramdisk)

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

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

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

Запуск с Android 13, выделенным и не-A/B Recovery (выделенный 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 Recovery (выделенный Ramdisk)

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

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

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

Обновление до Android 12, Recovery-AS-Boot (восстановление как рамдиск)

Устройство запуска/обновления, без GKI, Recovery-As Boot

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

Обновление до Android 12, выделенное восстановление (выделенный Ramdisk)

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

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

    • Версия заголовка V2
      • CMDLine cmdline для восстановления, при необходимости
      • Для раздела по восстановлению не A/B содержимое заголовка должно быть автономным; Смотрите изображения восстановления . Например:
      • cmdline не объединяется с boot и vendor_boot cmdline .
      • Заголовок Указывает восстановление DTBO, при необходимости.
      • Для раздела восстановления A/B содержимое может быть объединено или выведено из boot и vendor_boot . Например:
      • cmdline объединяется с boot и vendor_boot cmdline .
      • DTBO может быть выведен из заголовка vendor_boot .
    • recovery Ramdisk Image
      • Восстановление ресурсов
      • Для раздела по восстановлению не A/B содержимое рамдиска должно быть автономным; Смотрите изображения восстановления . Например:
      • lib/modules должны содержать все модули ядра, необходимые для режима восстановления загрузки
      • Рэмдиск восстановления должен содержать init .
      • Для раздела восстановления A/B, Recovery Ramdisk готовит к Generic и vendor_boot Ramdisk, следовательно, он не должен быть автономным. Например:
      • lib/modules могут содержать только дополнительные модули ядра, необходимые для режима восстановления, помимо модулей ядра в vendor_boot Ramdisk.
      • Symlink AT /init может существовать, но она омрачена бинарной первой стадии /init в загрузке.

Общее содержимое изображения рамдиска

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

  • init
  • system/etc/ramdisk/build.prop
  • ro. PRODUCT .bootimg.* build реквизит
  • Пустые каталоги для монтирующих точек: debug_ramdisk/ , mnt/ , dev/ , sys/ , proc/ , metadata/
  • first_stage_ramdisk/
    • Дублированные пустые каталоги для Mount Points: 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 и с помощью A/B recovery Partition, должны установить эту переменную на true . Устройства, запущенные с Android 12 и с использованием Non-A/B, должны установить эту переменную на false , чтобы сохранить их изображение восстановления.

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

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

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

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

Разрешены комбинации

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

Устройства с выделенным разделом recovery могут установить PRODUCT_BUILD_RECOVERY_IMAGE true или EMPLE. Для этих устройств, если устанавливается 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

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

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

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

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

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

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

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

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

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

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

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

      • SET BOARD_USES_RECOVERY_AS_BOOT В true архитектура показана на рисунке 3 .

      • SET BOARD_USES_RECOVERY_AS_BOOT .

    • Может установить 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 разделе. vendor_boot Ramdisk содержит все ресурсы восстановления, включая lib/modules (с модулями ядра поставщика). На таких устройствах конфигурация продукта наследуется от generic_ramdisk.mk .

Установить значения доски

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

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

The vendor_boot ramdisk can contain an /init to /system/bin/init symlink, and init_second_stage.recovery at /system/bin/init . However, because the generic ramdisk is concatenated after the vendor_boot ramdisk, the /init symlink is overwritten. When the device boots into recovery, the /system/bin/init binary is needed to support second stage init. The contents of vendor_boot + generic ramdisks are as follows:

  • /init (from generic ramdisk, built from init_first_stage )
  • /system/bin/init (from vendor_ramdisk , built from init_second_stage.recovery )

Move fstab files

Move any fstab files that were installed to the generic ramdisk to vendor_ramdisk . For an example, refer to this change .

Install modules

You can install device-specific modules to vendor_ramdisk (skip this step if you don't have any device-specific modules to install).

  • Use the vendor_ramdisk variant of the module when the module installs to the /first_stage_ramdisk . This module should be available after init switches root into /first_stage_ramdisk but before init switches root into /system . For examples, see Metadata checksums and Virtual A/B compression .

  • Use the recovery variant of the module when the module installs to / . This module should be available before init switches root into /first_stage_ramdisk . For details on installing modules to / , see First stage console .

First stage console

Because the first stage console starts before init switches root into /first_stage_ramdisk , you need to install the recovery variant of modules. By default, both module variants are installed to build/make/target/product/base_vendor.mk , so if the device makefile inherits from that file you don't need to explicitly install the recovery variant.

To explicitly install the recovery modules, use the following.

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

This ensures that the linker , sh , and toybox install to $ANDROID_PRODUCT_OUT/recovery/root/system/bin , which then installs to /system/bin under the vendor_ramdisk .

To add modules needed for the first stage console (for example, adbd), use the following.

PRODUCT_PACKAGES += adbd.recovery

This ensures that the specified modules install to $ANDROID_PRODUCT_OUT/recovery/root/system/bin , which then installs to /system/bin under the vendor_ramdisk .

Metadata checksums

To support metadata checksums during first stage mount, devices that don't support GKI install the ramdisk variant of the following modules. To add support for GKI, move the modules to $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin :

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

For an example, refer to this changelist .

Virtual A/B compression

To support virtual A/B compression, snapuserd must be installed to vendor_ramdisk . The device should inherit from virtual_ab_ota/compression.mk , which installs the vendor_ramdisk variant of snapuserd .

Changes to the boot process

The process of booting into recovery or into Android doesn't change, with the following exception:

  • Ramdisk build.prop moves into /second_stage_resources so that second stage init can read the build timestamp of boot.

Because resources move from generic ramdisk to vendor_boot ramdisk, the result of concatenating generic ramdisk to vendor_boot ramdisk doesn't change.

Make e2fsck available

The device makefiles can inherit from:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk if the device supports virtual A/B but not compression.

  • virtual_ab_ota/compression.mk if the device supports virtual A/B compression.

The product makefiles install $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck . At runtime, the first stage init switches root into /first_stage_ramdisk then executes /system/bin/e2fsck .

Option 2a: Dedicated and A/B recovery partition

Use this option for devices with A/B recovery partitions; that is, the device has a recovery_a and recovery_b partition . Such devices include A/B and Virtual A/B devices of which the recovery partition is updateable, with the following configuration:

AB_OTA_PARTITIONS += recovery

The vendor_boot ramdisk contains the vendor bits of the ramdisk and vendor kernel modules, including the following:

  • Device-specific fstab files

  • lib/modules (includes vendor kernel modules)

The recovery ramdisk contains all recovery resources. On such devices, the product configuration inherits from generic_ramdisk.mk .

Set BOARD values

Set the following values for devices with A/B recovery partition:

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

The recovery ramdisk can contain an /init -> /system/bin/init symlink, and init_second_stage.recovery at /system/bin/init . However, because the boot ramdisk is concatenated after the recovery ramdisk, the /init symlink is overwritten. When the device boots into recovery mode, the /system/bin/init binary is needed to support second stage init.

When the device boots into recovery , the contents of recovery + vendor_boot + generic ramdisks are as follows:

  • /init (from ramdisk, built from init_first_stage )
  • /system/bin/init (from recovery ramdisk, built from init_second_stage.recovery , and executed from /init )

When the device boots into Android, the contents of vendor_boot + generic ramdisks are as follows:

  • /init (from generic ramdisk, built from init_first_stage )

Move fstab files

Move any fstab files that were installed to the generic ramdisk to the vendor_ramdisk . For an example, refer to this change .

Install modules

Optionally, you can install device-specific modules to vendor_ramdisk (skip this step if you don't have any device-specific modules to install). Init doesn't switch root. The vendor_ramdisk variant of modules installs to the root of vendor_ramdisk . For examples on installing modules to vendor_ramdisk , see First stage console , Metadata checksums , and Virtual A/B compression .

First stage console

To install the vendor_ramdisk variant of the modules, use the following:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

This ensures that the linker , sh , and toybox install to $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , which then installs to /system/bin under the vendor_ramdisk .

To add modules needed for the first stage console (for example, adbd), enable the vendor_ramdisk variant of these modules by uploading relevant patches to AOSP, then use the following,

PRODUCT_PACKAGES += adbd.vendor_ramdisk

This ensures that the specified modules install to $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin . If the vendor_boot ramdisk is loaded in recovery mode, the module is also available in recovery . If the vendor_boot ramdisk isn't loaded in recovery mode, the device can optionally install adbd.recovery as well.

Metadata checksums

To support metadata checksums during first stage mount, devices that don't support GKI install the ramdisk variant of the following modules. To add support for GKI, move the modules to $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin :

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

For an example, refer to this changelist .

Virtual A/B compression

To support Virtual A/B compression, snapuserd must be installed to vendor_ramdisk . The device should inherit from virtual_ab_ota/compression.mk , which installs the vendor_ramdisk variant of snapuserd .

Changes to the boot process

When booting into Android, the boot process doesn't change. The vendor_boot + generic ramdisk is similar to the existing boot process, except that fstab loads from vendor_boot . Because system/bin/recovery doesn't exist, first_stage_init handles it as a normal boot.

When booting into recovery mode, the boot process changes. The recovery + vendor_boot + generic ramdisk is similar to the existing recovery process, but the kernel is loaded from the boot image instead of from the recovery image. The boot process for recovery mode is as follows.

  1. Bootloader starts, then does the following:

    1. Pushes recovery + vendor_boot + generic ramdisk to / . (If the OEM duplicates kernel modules in recovery ramdisk by adding them to BOARD_RECOVERY_KERNEL_MODULES ), vendor_boot is optional.)
    2. Runs the kernel from the boot partition.
  2. Kernel mounts ramdisk to / then executes /init from the generic ramdisk.

  3. First stage init starts, then does the following:

    1. Sets IsRecoveryMode() == true and ForceNormalBoot() == false .
    2. Loads vendor kernel modules from /lib/modules .
    3. Calls DoFirstStageMount() but skips mounting because IsRecoveryMode() == true . (The device doesn't free ramdisk (because / is still the same) but does call SetInitAvbVersionInRecovery() .)
    4. Starts second stage init from /system/bin/init from recovery ramdisk.

Make e2fsck available

The device makefiles can inherit from:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk if the device supports virtual A/B but not compression.

  • virtual_ab_ota/compression.mk if the device supports virtual A/B compression.

The product makefiles install $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck . At runtime, the first stage init executes /system/bin/e2fsck .

Option 2b: Dedicated and non-A/B recovery partition

Use this option for devices with a non-A/B recovery partition; that is, the device has a partition named recovery without a slot suffix. Such devices include:

  • non-A/B devices;
  • A/B and Virtual A/B devices, of which the recovery partition isn't updateable. (This is unusual.)

The vendor_boot ramdisk contains the vendor bits of the ramdisk and vendor kernel modules, including the following:

  • Device-specific fstab files
  • lib/modules (includes vendor kernel modules)

The recovery image must be self-contained. It must contain all required resources to boot the recovery mode, including:

  • The kernel image
  • The DTBO image
  • Kernel modules in lib/modules
  • First-stage init as a symlink /init -> /system/bin/init
  • Second-stage init binary /system/bin/init
  • Device-specific fstab files
  • All other recovery resources, including the recovery binary

On such devices, the product configuration inherits from generic_ramdisk.mk .

Set BOARD values

Set the following values for non-A/B devices:

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

The recovery ramdisk must contain an /init -> /system/bin/init symlink, and init_second_stage.recovery at /system/bin/init . When the device boots into recovery mode, the /system/bin/init binary is needed to support both first stage and second stage init.

When the device boots into recovery , the contents of recovery ramdisks are as follows:

  • /init -> /system/bin/init (from recovery ramdisk)
  • /system/bin/init (from recovery ramdisk, built from init_second_stage.recovery , and executed from /init )

When the device boots into Android, the contents of vendor_boot + generic ramdisks are as follows:

  • /init (from ramdisk, built from init_first_stage )

Move fstab files

Move any fstab files that were installed to the generic ramdisk to the vendor_ramdisk and recovery ramdisk. For an example, refer to this change .

Install modules

You can install device-specific modules to vendor_ramdisk and recovery ramdisk (skip this step if you don't have any device-specific modules to install). init doesn't switch root. The vendor_ramdisk variant of modules installs to the root of vendor_ramdisk . The recovery variant of modules installs to the root of recovery ramdisk. For examples on installing modules to vendor_ramdisk and recovery ramdisk, se First stage console and Metadata checksums .

First stage console

To install the vendor_ramdisk variant of the modules, use the following:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

This ensures that the linker , sh , and toybox install to $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin , which then installs to /system/bin under the vendor_ramdisk .

To add modules needed for the first stage console (for example, adbd), enable the vendor_ramdisk variant of these modules by uploading relevant patches to AOSP, then use the following,

PRODUCT_PACKAGES += adbd.vendor_ramdisk

This ensures that the specified modules install to $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin .

To install the recovery variant of the modules, replace vendor_ramdisk with recovery :

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

Metadata checksums

To support metadata checksums during first stage mount, devices that don't support GKI install the ramdisk variant of the following modules. To add support for GKI, move the modules to $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin :

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

To support metadata checksums during first stage mount in recovery, enable the recovery variant of these modules and install them as well.

Changes to the boot process

When booting into Android, the boot process doesn't change. The vendor_boot + generic ramdisk is similar to the existing boot process, except that fstab loads from vendor_boot . Because system/bin/recovery doesn't exist, first_stage_init handles it as a normal boot.

When booting into recovery mode, the boot process doesn't change. The recovery ramdisk is loaded in the same way as the existing recovery process. The kernel is loaded from the recovery image. The boot process for recovery mode is as follows.

  1. Bootloader starts, then does the following:

    1. Pushes recovery ramdisk to / .
    2. Runs the kernel from the recovery partition.
  2. Kernel mounts ramdisk to / then executes /init , which is a symlink to /system/bin/init from the recovery ramdisk.

  3. First stage init starts, then does the following:

    1. Sets IsRecoveryMode() == true and ForceNormalBoot() == false .
    2. Loads vendor kernel modules from /lib/modules .
    3. Calls DoFirstStageMount() but skips mounting because IsRecoveryMode() == true . (The device doesn't free ramdisk (because / is still the same) but does call SetInitAvbVersionInRecovery() .)
    4. Starts second stage init from /system/bin/init from recovery ramdisk.

Boot image timestamps

The following code is an example boot image timestamp file:

####################################
# 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
  • At build time, a system/etc/ramdisk/build.prop file is added to the generic ramdisk. This file contains timestamp information of the build.

  • At runtime, first stage init copies files from the ramdisk to tmpfs before freeing the ramdisk so that second stage init can read this file to set boot image timestamp properties.