Для поддержки беспроводных обновлений (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.Платформа Android отвечает за вызов
markBootSuccessfulиз HAL. Загрузчик никогда не должен помечать раздел как успешно загруженный.
Поддержка управления загрузкой 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 ). slot-unbootable ).
Устройства без обновлений A/B
Для поддержки OTA-обновлений на устройствах, которые не используют обновления A/B (см. Устройства, не обновляемые A/B ), убедитесь, что загрузчик устройства соответствует следующим критериям.
Раздел
recoveryдолжен содержать образ, способный считывать образ системы с какого-либо поддерживаемого раздела (cache,userdata) и записывать его вsystemраздел.Загрузчик должен поддерживать перезагрузку непосредственно в режиме восстановления.
Если поддерживаются обновления образа радио, раздел
recoveryтакже должен иметь возможность прошивать радио. Это может быть выполнено одним из двух способов:Загрузчик прошивает радио. В этом случае должна быть возможность перезагрузиться из раздела восстановления обратно в загрузчик для завершения обновления.
Образ рекавери прошивает радио. Эта функциональность может быть предоставлена в виде двоичной библиотеки или утилиты.