Поддерживать стабильный интерфейс модуля ядра

Для модулей поставщика важно поддерживать стабильный интерфейс модуля ядра (KMI). Ядро GKI создается и поставляется в двоичной форме, а загружаемые модули поставщика создаются в отдельном дереве. Полученное ядро GKI и модули поставщика должны работать так, как если бы они были созданы вместе.

В целом сообщество Linux негативно относится к идее стабильности ABI в ядре для основной ветки. Из-за различий в цепочках инструментов, конфигурациях и постоянно развивающемся основном ядре Linux поддерживать стабильный интерфейс KMI в основном ядре невозможно. Однако в среде GKI с жесткими ограничениями можно поддерживать стабильный KMI, если соблюдать следующие условия:

  • Для сборки ядра можно использовать только одну конфигурацию – gki_defconfig.

  • KMI стабилен только в пределах одной версии LTS и Android, например android14-6.1, android15-6.6 или android16-6.12.

    • Для 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. Мы настоятельно рекомендуем использовать предоставленные инструменты сборки, поскольку они обеспечивают наилучшую совместимость.

Что дальше?