На устройствах, отличных от A/B, образ для восстановления должен содержать информацию из большого двоичного объекта дерева устройств (DTB) или наложенного образа расширенного интерфейса конфигурации и питания (ACPI) . Когда такие устройства загружаются в режиме восстановления, загрузчик может затем загрузить образ наложения, совместимый с образом восстановления. Устройства, поддерживающие A/B (бесшовные) обновления , должны использовать восстановление в качестве загрузки вместо отдельного раздела восстановления (подробности см. в разделе Реализация обновлений A/B ).
Варианты включения DTBO/ACPIO для восстановления в образ загрузки/восстановления различаются в разных версиях Android.
| Выпускать | Схема обновления | соответствие требованиям ГКИ | Версия загрузочного заголовка (запускающие устройства) | Версия загрузочного заголовка (обновление устройств) | Требуется специальный образ для восстановления |
|---|---|---|---|---|---|
| 11 | А/Б, Виртуальный А/Б | да | 3 * | Н/Д | Нет |
| А/Б, Виртуальный А/Б | Нет | 2, 3 | 0, 1, 2, 3 | Нет | |
| не-A/B | да | 3 | Н/Д | да | |
| не-A/B | Нет | 2, 3 | 0, 1, 2, 3 | да | |
| 10 (К) | А/Б | Н/Д | 2 | 0, 1, 2 | Нет |
| не-A/B | Н/Д | 2 | 0, 1, 2 | да | |
| 9 (П) | А/Б | Н/Д | 1 | 0, 1 | Нет |
| не-A/B | Н/Д | 1 | 0, 1 | да | |
| 8 (О) | А/Б | Н/Д | Н/Д (считается 0) | Н/Д (считается 0) | Нет |
| не-A/B | Н/Д | Н/Д (считается 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 для указания версии заголовка загрузочного образа и путей к образу наложения см. в разделе Управление версиями заголовка загрузочного образа .
Внедрение DTBO
Устройства, отличные от 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 .
Внедрение АКПИО
Устройства без 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 .