На устройствах без A/B-обновлений образ для восстановления должен содержать информацию из двоичного дерева устройств (DTB) или оверлейного образа расширенного интерфейса конфигурации и управления питанием (ACPI). Когда такие устройства загружаются в режиме восстановления, загрузчик может загрузить наложенное изображение, совместимое с образом восстановления. На устройствах, поддерживающих бесшовные обновления A/B, для загрузки следует использовать раздел восстановления вместо отдельного раздела восстановления (подробнее о реализации обновлений A/B…).
Способы включения DTBO/ACPIO для восстановления в образ загрузки/восстановления различаются в зависимости от версии Android.
| Освободить | Схема обновления | Соответствие требованиям GKI | Версия заголовка загрузки (для устройств, которые запускаются) | Версия заголовка загрузки (для устройств, которые обновляются) | Требуется специальный образ для восстановления |
|---|---|---|---|---|---|
| 11 | A/B, Virtual A/B |
Да | 3* | Н/Д | Нет |
| A/B, Virtual A/B |
Нет | 2, 3 | 0, 1, 2, 3 | Нет | |
| не A/B; | Да | 3 | Н/Д | Да | |
| не A/B; | Нет | 2, 3 | 0, 1, 2, 3 | Да | |
| 10 (Q) | A/B-тестирование | Н/Д | 2 | 0, 1, 2 | Нет |
| не A/B | Н/Д | 2 | 0, 1, 2 | Да | |
| 9 (П) | A/B-тестирование | Н/Д | 1 | 0, 1 | Нет |
| не A/B | Н/Д | 1 | 0, 1 | Да | |
| 8 (O) | A/B-тестирование | Н/Д | — (считается равным 0) | — (считается как 0) | Нет |
| не A/B | Н/Д | — (считается равным 0) | — (считается равным 0) | Да |
* На устройствах A/B с Android 11 или более поздней версии, на которых используется Generic Kernel Image (GKI), для совместимости с разделом загрузки поставщика должна быть установлена основная версия заголовка загрузки 3.
Ключевые моменты:
Для устройств с поддержкой A/B-обновлений не нужно указывать образ для восстановления, поскольку при таких обновлениях используются два набора разделов (включая
bootиdtbo), между которыми происходит переключение. Устройства A/B по-прежнему могут использовать специальный образ для восстановления.На устройствах без поддержки A/B-обновлений, которые поставляются с Android 11 или более поздней версией ОС и используют заголовок загрузки версии 3, необходимо явно указать заголовок загрузки версии 2 для образа восстановления. Пример:
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2Для архитектур, которые не поддерживают деревья устройств, образ для восстановления может включать образ ACPIO вместо образа DTBO.
О сбоях при беспроводном обновлении и образах для восстановления
Чтобы избежать сбоев при беспроводном обновлении на устройствах, не поддерживающих A/B-обновления, образ для восстановления должен быть самодостаточным и не зависеть от других образов. Во время беспроводного обновления, если после обновления наложенного изображения (но до завершения полного обновления) возникает проблема, устройство пытается загрузиться в режиме восстановления, чтобы завершить обновление. Однако поскольку раздел наложения уже обновлен, может возникнуть несоответствие с образом восстановления (который ещё не обновлен).
Чтобы при обновлении восстановление не зависело от раздела DTBO/ACPIO, на устройствах без поддержки A/B, работающих под управлением Android 9 или более поздней версии, можно указать образ DTBO/ACPIO для восстановления, содержащий информацию из наложенного образа в качестве отдельного раздела в формате образа загрузки (необходимо использовать заголовок загрузки версии 1 или 2).
Изменения в загрузочном образе
Чтобы образ для восстановления содержал DTBO или ACPIO на устройствах без разделов A/B с Android 9 или более поздней версии, обновите структуру загрузочного образа следующим образом:
| Раздел "Загрузочный образ" | Количество страниц |
|---|---|
| Заголовок загрузки (1 страница) | 1 |
| Ядро (l страниц) | l = (kernel_size + page_size -
1) / page_size |
| Ramdisk (m страниц) | m = (ramdisk_size + page_size -
1) / page_size |
| Загрузчик второго этапа (n страниц) | n = (second_size + page_size -
1) / page_size |
| Recovery DTBO или ACPIO (o страниц) | o = (recovery_[dtbo|acpio]_size + page_size -
1) / page_size |
Подробные сведения об аргументах инструмента mkbootimg, используемых для указания версии заголовка загрузочного образа и путей к оверлейным образам, приведены в разделе Управление версиями заголовков загрузочных образов.
Как реализовать DTBO
Устройства без A/B-обновлений с Android 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, чтобы указать версию заголовка загрузочного образа. Чтобы поддерживать ACPIO восстановления, значение переменной должно быть больше или равно 1.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.