Поддержка обновлений OTA

Для поддержки беспроводных обновлений (OTA) загрузчик должен иметь доступ к RAM-диску восстановления во время загрузки. Если устройство использует немодифицированный образ восстановления AOSP, загрузчик считывает первые 32 байта в разделе misc ; если данные там совпадают boot-recovery , загрузчик загружается в образ recovery . Этот метод позволяет продолжать любые незавершенные работы по восстановлению (например, применение OTA или удаление данных) до завершения.

Для получения подробной информации о содержимом блока во флэш-памяти, используемого для связи восстановления и загрузчика, обратитесь к файлу bootable/recovery/bootloader_message/bootloader_message.h .

Устройства с обновлениями A/B

Для поддержки обновлений OTA на устройствах, использующих обновления A/B , убедитесь, что загрузчик устройства соответствует следующим критериям.

Общие критерии

  • Все разделы, обновленные через OTA, должны обновляться во время загрузки основной системы (и не обновляться при восстановлении).

  • Для загрузки system раздела загрузчик передает в командную строку ядра следующее значение: ro root=/dev/[node] rootwait init=/init .

  • Платформа Android отвечает за вызов markBootSuccessful из HAL. Загрузчик никогда не должен помечать раздел как успешно загруженный.

Поддержка управления загрузкой HAL

Загрузчик должен поддерживать HAL boot_control , как определено в hardware/libhardware/include/hardware/boot_control.h ). Средство обновления запрашивает HAL управления загрузкой , обновляет неиспользуемый в данный момент загрузочный слот, изменяет активный слот с помощью HAL и перезагружается в обновленную операционную систему. Подробнее см. в разделе Реализация управления загрузкой HAL .

Поддержка слотов

Загрузчик должен поддерживать функции, связанные с разделами и слотами, в том числе:

  • Имена разделов должны включать суффикс, указывающий, какие разделы принадлежат определенному слоту загрузчика. Для каждого такого раздела есть соответствующая переменная has-slot: partition base name со значением yes . Слоты именуются в алфавитном порядке как a, b, c и т. д., соответствующие разделам с суффиксом _a , _b , _c и т. д. Загрузчик должен сообщить операционной системе, какой слот был загружен, используя свойство командной строки androidboot.slot_suffix . Это свойство задается через bootconfig для устройств, запускаемых с Android 12 или более поздней версии.

  • Значение slot-retry-count сбрасывается в положительное значение (обычно 3 ) либо с помощью HAL управления загрузкой с помощью обратного вызова setActiveBootSlot , либо с помощью команды fastboot set_active . При изменении раздела, который является частью слота, загрузчик очищает «успешно загружен» и сбрасывает счетчик повторных попыток для слота.

Загрузчик также должен определить, какой слот загружать. На рисунке показан пример процесса принятия решения.

Процесс слотирования загрузчика
Рисунок 1. Схема слотирования загрузчика
  1. Определите, в какой слот попытаться. Не пытайтесь загрузить слот с пометкой slot-unbootable . Этот слот должен соответствовать значениям, возвращаемым fastboot, и называется текущим слотом.

  2. Если текущий слот не помечен как slot-successful и имеет slot-retry-count = 0 , пометьте текущий слот как slot-unbootable . Затем выберите другой слот, который не помечен unbootable и помечен как slot-successful ; этот слот теперь является выбранным слотом. Если текущий слот недоступен, загрузитесь для восстановления или отобразите для пользователя осмысленное сообщение об ошибке.

  3. Выберите соответствующий boot.img и укажите путь к нужному системному разделу в командной строке ядра.

  4. Заполните параметр slot_suffix командной строки ядра.

  5. Ботинок. Если не помечен slot-successful , уменьшите slot-retry-count .

Утилита fastboot определяет, какой раздел прошивать при выполнении любых команд прошивания. Например, запуск команды fastboot flash system system.img сначала запрашивает переменную current-slot а затем объединяет результат с системой для создания имени раздела, который необходимо прошить ( system_a , system_b и т. д.).

При установке текущего слота с помощью команды fastboot set_active или команды управления загрузкой HAL setActiveBootSlot загрузчик должен обновить текущий слот, очистить slot-unbootable и slot-successful и сбросить счетчик повторных попыток (это единственный способ очистить слот- slot-unbootable ). slot-unbootable ).

Устройства без обновлений A/B

Для поддержки OTA-обновлений на устройствах, которые не используют обновления A/B (см. Устройства, не обновляемые A/B ), убедитесь, что загрузчик устройства соответствует следующим критериям.

  • Раздел recovery должен содержать образ, способный считывать образ системы с какого-либо поддерживаемого раздела ( cache , userdata ) и записывать его в system раздел.

  • Загрузчик должен поддерживать перезагрузку непосредственно в режиме восстановления.

  • Если поддерживаются обновления образа радио, раздел recovery также должен иметь возможность прошивать радио. Это может быть выполнено одним из двух способов:

    • Загрузчик прошивает радио. В этом случае должна быть возможность перезагрузиться из раздела восстановления обратно в загрузчик для завершения обновления.

    • Образ рекавери прошивает радио. Эта функциональность может быть предоставлена ​​в виде двоичной библиотеки или утилиты.