На устройствах, отличных от A/B, образ восстановления должен содержать информацию из BLOB-объекта дерева устройств (DTB) или образа наложения расширенного интерфейса конфигурации и питания (ACPI) . Когда такие устройства загружаются в режим восстановления, загрузчик может загрузить наложенный образ, совместимый с образом восстановления. Устройства, поддерживающие A/B (бесшовные) обновления, должны использовать восстановление в качестве загрузочного, а не отдельный раздел восстановления (подробнее см. в разделе «Реализация обновлений A/B» ).
Варианты включения DTBO/ACPIO восстановления в образ загрузки/восстановления различаются в зависимости от версии Android.
Выпускать | Обновить схему | Соответствие ГКИ | Версия загрузочного заголовка (запускающие устройства) | Версия загрузочного заголовка (обновление устройств) | Требуется специальный образ восстановления. |
---|---|---|---|---|---|
11 | А/Б, Виртуальный А/Б | Да | 3 * | Н/Д | Нет |
А/Б, Виртуальный А/Б | Нет | 2, 3 | 0, 1, 2, 3 | Нет | |
не А/Б | Да | 3 | Н/Д | Да | |
не А/Б | Нет | 2, 3 | 0, 1, 2, 3 | Да | |
10 (Q) | А/Б | Н/Д | 2 | 0, 1, 2 | Нет |
не А/Б | Н/Д | 2 | 0, 1, 2 | Да | |
9 (П) | А/Б | Н/Д | 1 | 0, 1 | Нет |
не А/Б | Н/Д | 1 | 0, 1 | Да | |
8 (О) | А/Б | Н/Д | Н/Д (считается 0) | Н/Д (считается 0) | Нет |
не А/Б | Н/Д | Н/Д (считается 0) | Н/Д (считается 0) | Да |
* Устройства A/B под управлением Android 11 или выше и использующие универсальный образ ядра (GKI) должны использовать версию основного загрузочного заголовка 3, чтобы быть совместимыми с загрузочным разделом поставщика .
Ключевые моменты:
Устройствам A/B не нужно указывать образ восстановления, поскольку обновления A/B используют два набора разделов (включая
boot
иdtbo
) и переключаются между ними во время обновлений, что устраняет необходимость в образе восстановления. Устройства A/B по-прежнему могут использовать специальный образ восстановления.Устройства, отличные от A/B, запускаемые с Android 11 или более поздней версии и использующие загрузочный заголовок версии 3, должны явно указать версию загрузочного заголовка 2 для образа восстановления отдельно. Например:
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
Для архитектур, которые не поддерживают деревья устройств, образ восстановления может включать образ ACPIO вместо образа DTBO.
О сбоях OTA и образах восстановления
Чтобы предотвратить сбои по беспроводной сети (OTA) на устройствах, отличных от A/B, образ восстановления должен быть самодостаточным и независимым от других образов. Если во время OTA-обновления проблема возникает после обновления наложенного образа (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления, чтобы завершить OTA-обновление. Однако, поскольку оверлейный раздел уже обновлен, может возникнуть несоответствие с образом восстановления (который еще не был обновлен).
Чтобы восстановление не зависело от раздела DTBO/ACPIO во время обновления, устройства, не относящиеся к A/B, под управлением Android 9 или выше, могут указать образ восстановления DTBO/ACPIO, содержащий информацию из наложенного образа, в виде отдельного раздела в формате загрузочного образа ( необходимо использовать версию загрузочного заголовка 1 или 2).
Изменения загрузочного образа
Чтобы образ восстановления мог содержать DTBO или ACPIO восстановления на устройствах, отличных от A/B, под управлением Android 9 или более поздней версии, обновите структуру загрузочного образа следующим образом.
Раздел загрузочного образа | Количество страниц |
---|---|
Загрузочный заголовок (1 страница) | 1 |
Ядро (л страниц) | l = ( kernel_size + page_size - 1) / page_size |
Рамдиск (м страниц) | m = ( ramdisk_size + page_size - 1) / page_size |
Загрузчик второго этапа (n страниц) | n = ( second_size + page_size - 1) / page_size |
Восстановление DTBO или ACPIO (о стр.) | o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size |
Подробные сведения об аргументах инструмента mkbootimg
для указания версии заголовка загрузочного образа и путей наложения образа см. в разделе Управление версиями заголовка загрузочного образа .
Внедрить ДТБО
Устройства, не относящиеся к A/B, работающие под управлением версии 9 или выше, могут заполнять раздел recovery_dtbo
образа восстановления. Чтобы включить образ recovery_dtbo
в recovery.img
, в BoardConfig.mk
устройства:
Установите для конфигурации
BOARD_INCLUDE_RECOVERY_DTBO
значениеtrue
:BOARD_INCLUDE_RECOVERY_DTBO := true
Расширьте переменную
BOARD_MKBOOTIMG_ARGS
, чтобы указать версию заголовка загрузочного образа:BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Убедитесь, что для переменной
BOARD_PREBUILT_DTBOIMAGE
задан путь к образу DTBO. Система сборки Android использует эту переменную для установки аргументаrecovery_dtbo
инструментаmkbootimg
во время создания образа восстановления.
Если переменные BOARD_INCLUDE_RECOVERY_DTBO
, BOARD_MKBOOTIMG_ARGS
и BOARD_PREBUILT_DTBOIMAGE
установлены правильно, система сборки Android включает DTBO, указанный переменной BOARD_PREBUILT_DTBOIMAGE
в recovery.img
.
Внедрить ACPIO
Устройства, не относящиеся к A/B, под управлением Android 9 или более поздней версии могут использовать наложенный образ ACPIO (вместо образа DTBO) и заполнять раздел recovery_acpio
(вместо раздела recovery_dtbo
) образа восстановления. Чтобы включить образ recovery_acpio
в recovery.img
, в BoardConfig.mk
устройства:
Установите для конфигурации
BOARD_INCLUDE_RECOVERY_ACPIO
значениеtrue
:BOARD_INCLUDE_RECOVERY_ACPIO := true
Расширьте переменную
BOARD_MKBOOTIMG_ARGS
, чтобы указать версию заголовка загрузочного образа. Переменная должна быть больше или равна 1, чтобы поддерживать восстановление ACPIO.BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Убедитесь, что для переменной
BOARD_RECOVERY_ACPIO
задан путь к образу ACPIO. Система сборки Android использует эту переменную для установки аргументаrecovery_acpio
инструментаmkbootimg
во время создания образа восстановления.
Если переменные BOARD_INCLUDE_RECOVERY_ACPIO
, BOARD_MKBOOTIMG_ARGS
и BOARD_RECOVERY_ACPIO
установлены правильно, система сборки Android включает ACPIO, указанный переменной BOARD_RECOVERY_ACPIO
в recovery.img
.