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