В Android 12 функция bootconfig заменяет параметры командной строки ядра androidboot.*
используемые в Android 11 и более ранних версиях. Функция bootconfig представляет собой механизм передачи данных конфигурации из сборки и загрузчика в Android 12.
Эта функция позволяет отделить параметры конфигурации пользовательского пространства Android от параметров ядра. Перенос длинных параметров ядра androidboot.*
в файл bootconfig освобождает место в командной строке ядра и делает его доступным для дальнейшего расширения.
И ядро, и пользовательское пространство Android должны поддерживать bootconfig
.
- Первый релиз с такой поддержкой: Android 12
- Первая версия ядра, которая поддерживает эту функцию: ядро 12-5.4.xx
Реализуйте функцию bootconfig для новых устройств, запускаемых с версией ядра 12-5.10.xx. При обновлении устройств её реализовывать не нужно.
Примеры и источники
При просмотре примеров и исходного кода в этом разделе обратите внимание, что формат кода bootconfig
лишь незначительно отличается от формата командной строки ядра, используемой в Android 11 и более ранних версиях. Однако для вашего использования важно следующее различие:
- Параметры должны быть разделены escape-последовательностью новой строки
\n
, а не пробелами.
Пример загрузчика
Пример загрузчика см. в справочной реализации загрузчика Cuttlefish U-boot. Ниже перечислены два коммита из этой справки. Первый повышает поддержку версии заголовка загрузчика до последней. В этом примере первый коммит обновляет (или повышает) поддержку версии до следующей, v4. Второй выполняет две функции: добавляет обработку bootconfig и демонстрирует добавление параметров во время выполнения:
- Обновите поддержку версии загрузочного заголовка до последней версии v4 .
- Добавьте обработку bootconfig .
Пример сборки
Пример сборки, демонстрирующий изменения mkbootimg
для сборки vendor_boot.img
с заголовком загрузки вендора версии 4, см. в разделе « mkbootimg changes for bootconfig
. См. раздел «Изменения Cuttlefish», чтобы выполнить следующие действия:
- Используйте (или увеличьте до) версию заголовка загрузки поставщика v4 .
- Добавьте bootconfig в командную строку ядра и переместите выбранные параметры в bootconfig .
Выполнение
Партнёрам необходимо добавить поддержку своих загрузчиков и перенести параметры androidboot.*
, используемые во время сборки, из командной строки ядра в файл bootconfig. Лучший способ внедрения этого изменения — поэтапное внедрение; информацию о поэтапном внедрении и проверке см. в разделе «Поэтапное внедрение и проверка».
Если у вас есть изменения, которые ищут параметры androidboot.*
в файле /proc/cmdline, укажите их в файле /proc/bootconfig
. Свойства ro.boot.*
задаются с использованием новых значений bootconfig
, поэтому вам не нужно вносить изменения в код, использующий эти параметры.
Изменения сборки
Во-первых, обновите версию заголовка загрузки до версии 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Добавьте параметр командной строки ядра bootconfig
. Это заставит ядро искать раздел bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
Параметры bootconfig создаются из параметров в переменной BOARD_BOOTCONFIG
, подобно тому, как строка ядра cmdline создается из BOARD\_KERNEL\_CMDLINE
.
Любые параметры androidboot.*
можно перемещать как есть, например так:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Изменения загрузчика
Загрузчик настраивает initramfs
перед переходом к ядру. Конфигурация загрузки ядра ищет раздел bootconfig и ищет его в самом конце initramfs,
с ожидаемым завершением.
Загрузчик получает информацию о макете vendor_boot.img
из заголовка загрузочного образа поставщика.
Рисунок 1. Распределение памяти bootconfig в Android 12
Загрузчик создаёт в памяти раздел bootconfig. Раздел bootconfig содержит распределение памяти для следующих компонентов:
- Параметры
- 4
parameters size
- 4 B
parameters checksum
суммы - 12 B магическая строка bootconfig (
#BOOTCONFIG\n
)
Параметры берутся из двух источников: параметры, известные на момент сборки, и параметры, неизвестные на момент сборки. Неизвестные параметры необходимо добавить.
Параметры, известные во время сборки, упаковываются в конец образа vendor_boot
в разделе bootconfig. Размер раздела (в байтах) хранится в поле заголовка загрузки вендора vendor_bootconfig_size
.
Параметры, неизвестные во время сборки, известны только во время выполнения в загрузчике. Их необходимо добавить в конец раздела параметров bootconfig перед применением трейлера bootconfig.
Если вам необходимо добавить какие-либо параметры после применения трейлера bootconfig, перезапишите трейлер и примените его повторно.
Поэтапная реализация и проверка
Реализуйте функцию bootconfig постепенно, следуя инструкциям, описанным в этом разделе. Оставьте параметры командной строки ядра неизменными, пока вы добавляете параметры bootconfig.
Вот шаги для постепенного внедрения с проверкой:
- Внесите изменения в загрузчик и сборку, затем выполните следующие действия:
- Используйте переменную
BOARD_BOOTCONFIG
для добавления нового параметра bootconfig. - Сохраните параметры командной строки ядра без изменений, чтобы устройство могло продолжить корректную загрузку. Это значительно упрощает отладку и проверку.
- Используйте переменную
- Проверьте свою работу, проверив содержимое файла
/proc/bootconfig
. Убедитесь, что после загрузки устройства вы видите новый добавленный параметр. - Переместите параметры
androidboot.*
из командной строки ядра в bootconfig, используя переменнуюBOARD_BOOTCONFIG
и загрузчик. - Убедитесь , что каждый из параметров присутствует в
/proc/bootconfig
и отсутствует в/proc/cmdline
. Если вы можете это проверить, значит, реализация прошла успешно.
Рекомендации по обновлению и понижению версии OTA
При управлении обновлениями и понижениями OTA между различными версиями Android или различными версиями ядра следует проявлять особую осторожность.
Android 12 — первая версия с поддержкой bootconfig. При переходе на любую более раннюю версию вместо bootconfig необходимо использовать параметры командной строки ядра.
Версии ядра 12–5.4 и более поздние поддерживают bootconfig. При переходе на любую более раннюю версию (включая 11–5.4) необходимо использовать параметры командной строки ядра.
При обновлении с Android 11 и ниже до Android 12 и выше можно продолжать использовать параметры командной строки ядра. То же самое касается и обновления версий ядра.
Поиск неисправностей
Если при выполнении проверки вы не видите ожидаемых параметров в /proc/bootconfig
, проверьте логи ядра в logcat
. Запись для bootconfig всегда присутствует в журнале, если ядро поддерживает её.
Пример вывода журнала
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Если вы видите журнал ошибок, это означает, что возникла проблема с загрузкой bootconfig. Чтобы увидеть различные типы ошибок, откройте файл init/main.c .