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