Изображения для восстановления

На устройствах без 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.