Крайне важно поддерживать стабильный интерфейс модуля ядра (KMI) для модулей поставщика. Ядро GKI собирается и поставляется в двоичной форме, а загружаемые поставщиком модули собираются в отдельном дереве. Полученное ядро GKI и модули поставщика должны работать так, как будто они были собраны вместе.
В целом, сообщество Linux не одобряет идею стабильности ABI в ядре для основного ядра. В условиях различных инструментальных цепочек, конфигураций и постоянно развивающегося основного ядра Linux невозможно поддерживать стабильный KMI в основной линии. Однако возможно поддерживать стабильный KMI в сильно ограниченной среде GKI с этими ограничениями:
Для сборки ядра можно использовать только одну конфигурацию —
gki_defconfig
.KMI стабилен только в пределах одной и той же версии ядра LTS и Android, например
android14-6.1
,android15-6.6
илиandroid16-6.12
.- Стабильность KMI для
android-mainline
не поддерживается.
- Стабильность KMI для
Для сборки ядра и модулей используется только определенный набор инструментов Clang , поставляемый в AOSP и определенный для соответствующей ветви.
Только те символы, которые, как известно, используются модулями, указанными в списке символов, контролируются на стабильность и считаются символами KMI.
- Следствием этого является то, что модули поставщиков должны использовать только символы KMI. Это ограничение усиливается неудачной загрузкой модулей, если требуются не-KMI-символы.
После заморозки ветки KMI изменения разрешены, но не могут сломать KMI. Эти изменения включают следующее:
- Изменения конфигурации
- Изменения кода ядра
- Изменения в цепочке инструментов (включая обновления)
Используйте герметичный процесс сборки и набор инструментов LLVM
Герметичный процесс сборки обеспечивает стабильный KMI, поскольку манифесты repo
в kernel/manifest
полностью описывают среду сборки. Например, манифест для android16-6.12
включает в себя цепочку инструментов, систему сборки и все остальное, необходимое для сборки ядра Generic Kernel Image (GKI). Конфигурация сборки, в первую очередь BUILD.bazel
, гарантирует, что включенные инструменты используются правильно для получения согласованных результатов сборки.
Использование герметичного процесса сборки также гарантирует, что описание ABI для дерева будет согласованным, независимо от того, сгенерировано ли оно Google (например, gki/aarch64/abi.stg
для android16-6.12
) или сгенерировано в локальном дереве, включающем модули поставщика. Инструменты для создания и сравнения описания ABI для интерфейса модуля ядра (KMI) также предоставляются как часть репозитория, описанного в манифесте.
Набор инструментов, используемый для сборки ядра GKI, должен быть полностью совместим с набором инструментов, используемым для сборки модулей поставщиков. Начиная с Android 10, все ядра Android должны быть собраны с набором инструментов LLVM. С GKI набор инструментов LLVM, используемый для сборки ядер продукта и модулей поставщиков, должен генерировать тот же ABI, что и набор инструментов LLVM от AOSP, а партнеры должны гарантировать совместимость KMI с ядром GKI. Использование предоставленных инструментов сборки настоятельно рекомендуется, поскольку они обеспечивают наилучшую совместимость.
Что дальше?
Инструкции по сборке ядра с использованием герметичного процесса сборки и набора инструментов LLVM см. в разделе Сборка ядер .
Инструкции по мониторингу ABI и устранению неполадок см. в разделе Мониторинг ABI ядра Android.