В 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 to the kernel cmdline and move selected parameters to bootconfig.
Реализация
Партнеры должны добавить поддержку своих загрузчиков и переместить свои параметры androidboot.* времени сборки из командной строки ядра в файл bootconfig. Лучший способ реализовать это изменение — делать это постепенно; см. раздел Инкрементная реализация и проверка для получения информации о выполнении инкрементного процесса.
Если у вас есть изменения, которые ищут в файле /proc/cmdline параметры androidboot.* , вместо этого укажите их в файле /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. Распределение памяти в конфигурации загрузки Android 12
Загрузчик создает раздел bootconfig в памяти. Раздел bootconfig содержит выделение памяти для следующего:
- Параметры
- 4
parameters size -
parameters checksumразмера 4 B - 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 .