Как реализовать беспроводные обновления

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

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

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

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

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

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

  • Чтобы загрузить раздел 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. При изменении раздела, входящего в слот, загрузчик очищает флаг "успешная загрузка" и сбрасывает счетчик попыток для слота.

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

Процесс загрузки загрузчика ОС
Рисунок 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).

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

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

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

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

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

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

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