В 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 и более ранних версиях. Однако для вашего удобства важно следующее различие:
- Параметры должны разделяться символом новой строки
\n, а не пробелами.
Пример загрузчика
Пример загрузчика см. в эталонной реализации загрузчика U-boot в Cuttlefish. Ниже перечислены два коммита из эталонной реализации. Первый обновляет поддержку версий заголовочного файла загрузки до последней версии. В примере первый коммит обновляет (или повышает) поддержку версий до следующей, 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 , аналогично тому, как командная строка ядра создается на основе 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 B
parameters size - 4
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.
При управлении обновлениями и понижением версий Android по воздуху (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 .