Чтобы реализовать обновления по беспроводной сети, загрузчик должен иметь доступ к диску 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. При изменении раздела, входящего в слот, загрузчик очищает флаг "успешная загрузка" и сбрасывает счетчик попыток для слота.
Загрузчик также должен определить, какой слот загружать. На рисунке показан пример процесса принятия решения.
Определите, какой слот вы хотите занять. Не пытайтесь загрузить слот, помеченный как
slot-unbootable. Этот слот должен соответствовать значениям, возвращаемым fastboot, и называется текущим слотом.Если текущий слот не помечен как
slot-successfulи имеетslot-retry-count = 0, пометьте его какslot-unbootable. Затем выберите другое место, которое не отмечено значкомunbootableи отмечено значкомslot-successful. Теперь это место выбрано. Если текущий слот недоступен, загрузите режим восстановления или покажите пользователю сообщение об ошибке.Выберите подходящий вариант
boot.imgи добавьте путь к правильному системному разделу в командную строку ядра.Заполните параметр командной строки ядра
slot_suffix.Загрузка. Если не указано значение
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также должен быть способен прошить радиомодуль. Это можно сделать двумя способами:Загрузчик прошивает радиомодуль. В этом случае можно перезагрузить устройство из раздела восстановления обратно в загрузчик, чтобы завершить обновление.
Образ для восстановления прошивает приемопередатчик. Эта функция может быть реализована в виде двоичной библиотеки или утилиты.