Внедрение OTA-обновлений

Для реализации обновлений по беспроводной сети (OTA) загрузчик должен иметь доступ к диску восстановления в оперативной памяти во время загрузки. Если устройство использует неизмененный образ восстановления 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 управления загрузкой

Загрузчик должен поддерживать 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 . При изменении раздела, являющегося частью слота, загрузчик очищает сообщение "successfully booted" и сбрасывает счетчик попыток для слота.

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

процесс размещения загрузчика
Рисунок 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 или команды setActiveBootSlot в контроллере загрузки загрузчика, загрузчик должен обновить текущий слот, очистить slot-unbootable и slot-successful и сбросить счетчик повторных попыток (это единственный способ очистить slot-unbootable ).

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

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

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

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

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

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

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