Внедрение 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 .

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

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

Загрузчик должен поддерживать boot_control HAL, как определено в hardware/libhardware/include/hardware/boot_control.h . Обновление запрашивает boot control HAL , обновляет неиспользуемый слот загрузки, изменяет активный слот с помощью HAL и перезагружается в обновленную операционную систему. Подробности см. в разделе Реализация boot control 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 для генерации имени раздела, который должен быть прошит ( system_a , system_b и т. д.).

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

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

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

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

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

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

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

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