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

Определите, какой слот следует попытаться загрузить. Не пытайтесь загрузить слот, помеченный как
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 для генерации имени раздела, который следует прошить ( 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также должен поддерживать прошивку радиомодуля. Этого можно добиться двумя способами:Загрузчик прошивает радиомодуль. В этом случае должна быть возможность перезагрузиться из раздела восстановления обратно в загрузчик, чтобы завершить обновление.
Образ восстановления перепрошивает радиостанцию. Эта функция может быть предоставлена в виде бинарной библиотеки или утилиты.