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