Крайне важно поддерживать стабильный интерфейс модулей ядра (KMI) для модулей поставщиков. Ядро GKI собирается и поставляется в двоичной форме, а загружаемые поставщиком модули встроены в отдельное дерево. Полученное ядро GKI и модули поставщика должны работать так, как если бы они были собраны вместе.
В целом сообщество Linux неодобрительно относится к идее стабильности ABI в ядре основного ядра. Учитывая различные наборы инструментов, конфигурации и постоянно развивающееся ядро Linux, поддерживать стабильный KMI в основной ветке невозможно. Однако можно поддерживать стабильный KMI в сильно ограниченной среде GKI со следующими ограничениями:
Для сборки ядра можно использовать только одну конфигурацию
gki_defconfig
.KMI стабилен только в пределах одной и той же версии ядра LTS и Android, например
android13-5.10
,android12-5.10
илиandroid13-5.15
.- Для
android-mainline
стабильность KMI не поддерживается.
- Для
Для сборки ядра и модулей используется только конкретная цепочка инструментов Clang, поставляемая в AOSP и определенная для соответствующей ветки.
Только символы, которые, как известно, используются модулями, указанными в списке символов, проверяются на стабильность и считаются символами KMI.
- Следствием этого является то, что модули поставщиков должны использовать только символы KMI. Это ограничение усиливается за счет неудачной загрузки модуля, если требуются символы, отличные от KMI.
После заморозки ветки KMI изменения разрешены, но не могут нарушить работу KMI. Эти изменения включают следующее:
- Изменения конфигурации
- Изменения кода ядра
- Изменения в инструментальной цепочке (включая обновления)
Используйте герметичный процесс сборки и набор инструментов LLVM.
Герметичный процесс сборки обеспечивает стабильный KMI, поскольку манифесты repo
в kernel/manifest
полностью описывают среду сборки. Например, манифест для android13-5.15
включает цепочку инструментов, сценарии сборки и все остальное, необходимое для сборки ядра Generic Kernel Image (GKI). Соответствующие файлы конфигурации build.config
, такие как GKI build config build.config.gki.aarch64
, гарантируют правильное использование включенных инструментов для получения согласованных результатов сборки.
Использование герметичного процесса сборки также гарантирует, что описание ABI для дерева будет единообразным независимо от того, создано ли оно Google (например, abi_gki_aarch64.xml
для android13-5.15
) или создано в локальном дереве, включающем модули поставщика. Инструменты для создания и сравнения описания ABI для интерфейса модуля ядра (KMI) также предоставляются как часть репозитория, описанного в манифесте.
Инструментальная цепочка, используемая для сборки ядра GKI, должна быть полностью совместима с инструментальной цепочкой, используемой для сборки модулей поставщика. Начиная с Android 10, все ядра Android должны быть созданы с использованием набора инструментов LLVM. При использовании GKI цепочка инструментов LLVM, используемая для создания ядер продуктов и модулей поставщиков, должна генерировать тот же ABI, что и цепочка инструментов LLVM от AOSP, а партнеры должны гарантировать, что KMI совместим с ядром GKI. Настоятельно рекомендуется использовать предоставленные инструменты сборки, поскольку они обеспечивают наилучшую совместимость.
Что дальше?
Инструкции по сборке ядра с использованием герметичного процесса сборки и набора инструментов LLVM см. в разделе Сборка ядер .
Инструкции по мониторингу ABI и устранению проблем см. в разделе Мониторинг ABI ядра Android.