На этой странице рассказывается, как настроить новую функцию ядра в качестве модуля GKI или настроить существующую встроенную функцию ядра в качестве модуля GKI.
Как настроить новую функцию в качестве модуля GKI
Для новой функции измените
gki_defconfigи задайте для обязательного элемента конфигурации функции ядра значениеm(=m) вместоn. Укажите это значение вarch/arm64/configs/gki_defconfigиarch/x86/configs/gki_defconfig.Добавьте файлы KO (
.ko), созданные для функции, в раздел_COMMON_GKI_MODULES_LISTследующего файла: Добавляйте файлы в отсортированном порядке. Если вы не уверены, какие файлы были сгенерированы, сборка завершится ошибкой и вы увидите список всех необходимых KO-файлов, которые нужно добавить в список.- В версии
android17-6.18и более поздних добавьте объекты вcommon/bazel/modules_private.bzl. - В
android16-6.12и более ранних версиях добавляйте элементы вcommon/modules.bzl.
- В версии
Для Android 14 добавьте тот же набор KO-файлов, что и на шаге 2, отсортированных по возрастанию для двоичного поиска во время выполнения, в
common/android/gki_{ARCH}_protected_modules, чтобы обозначить модуль как защищенный модуль GKI.Для Android 14 и 15 обновите список экспортов, чтобы он включал новые экспорты, добавленные в
common/android/abi_gki_protected_exports_ARCHITECTURE. Например, чтобы обновить список, выполните командуtools/bazel run //common:kernel_aarch64_abi_update_protected_exportsдляaarch64.Убедитесь, что добавленные на шаге 2 файлы KO скопированы в каталоги ядра
out/<androidX-Y.Z>/dist/system_dlkm.imgиout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz. Модули в архивеsystem_dlkm_staging_archive.tar.gzможно использовать в качестве входных данных для созданияsystem_dlkm.imgна платформе.Отправьте изменения на проверку. Модули GKI – это функция ядра, доступная только в Android, поэтому патчи для преобразования модулей не нужно отправлять в основной репозиторий. Однако для отправки исправлений общего ядра Android (ACK) необходимо следовать другим рекомендациям.
Как настроить встроенную функцию ядра в качестве модуля GKI
Для существующей встроенной функции ядра отредактируйте
gki_defconfigи установите для элемента конфигурации требуемой функции ядра значениеm(=m) вместоy. Задайте эту настройку как вarch/arm64/configs/gki_defconfig, так и вarch/x86/configs/gki_defconfig.Добавьте файлы KO (
.ko), созданные для функции, в раздел_COMMON_GKI_MODULES_LISTследующего файла: Добавьте файлы в отсортированном порядке. Если вы не уверены, что все файлы созданы, сборка завершится с ошибкой и будет показан список всех необходимых файлов KO, которые нужно добавить.- В
android17-6.18и более поздних версиях добавьте элементы вcommon/bazel/modules_private.bzl. - В версии
android16-6.12и более ранних добавьте элементы в файл `common/modules.bzl`.
- В
Для Android 14 добавьте тот же набор KO-файлов, что и на шаге 2, отсортированных по возрастанию для двоичного поиска во время выполнения, в
common/android/gki_{ARCH}_protected_modules, чтобы обозначить модуль как защищенный модуль GKI.Для Android 14 и 15 обновите список защищенных экспортируемых данных, добавив в него данные из нового модуля в
common/android/abi_gki_protected_exports_{ARCH}с помощьюtools/bazel run //common:kernel_aarch64_abi_update_protected_exportsдляaarch64.Убедитесь, что новые файлы KO модуля, преобразованные на шаге 2, скопированы в
out/<androidX-Y.Z>/dist/system_dlkm.imgиout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gzядра. Модули в архивеsystem_dlkm_staging_archive.tar.gzможно использовать в качестве входных данных для созданияsystem_dlkm.imgна платформе.Отправьте изменения на проверку. Модули GKI – это функция ядра, доступная только в Android, поэтому патчи для преобразования модулей не нужно отправлять в основной репозиторий. Однако вы должны следовать другим рекомендациям по отправке исправлений для общего ядра Android (ACK).
Как преобразовать защищенный модуль GKI в незащищенный
Для Android 15 и более поздних версий добавьте модуль, который преобразуется из защищенного в незащищенный, в список
_COMMON_UNPROTECTED_MODULES_LISTв следующем файле:- В версии
android17-6.18и более поздних добавьте объекты вcommon/bazel/modules_private.bzl. - В
android16-6.12и более ранних версиях добавляйте элементы вcommon/modules.bzl.
- В версии
В Android 14 удалите модуль, который преобразуется из защищенного в незащищенный, из списка защищенных модулей в
common/android/gki_protected_modules.В Android 14 и 15 обновите список защищенных экспортов, исключив из него экспорты из нового незащищенного модуля в
common/android/abi_gki_protected_exports_{ARCH}, используяtools/bazel run //common:kernel_aarch64_abi_update_protected_exportsдляaarch64.Отправьте изменения на проверку. Модули GKI – это функция ядра, доступная только в Android, поэтому патчи для преобразования модулей не нужно отправлять в основной репозиторий. Однако вы должны соблюдать другие правила, чтобы отправлять исправления для общего ядра Android (ACK).
Краткое руководство по устранению нарушений символов в модулях GKI
Если неподписанные модули нарушают защиту символов, установленную для модулей GKI, при загрузке модуля могут возникнуть два типа ошибок, которые приведут к сбою.
1. Модуль без подписи, в котором используется защищенный символ
Ошибка
module: Protected symbol: some_kernel_function (err -13)
Причина
Файл module.ko – это неподписанный модуль поставщика, который при загрузке пытается разрешить экспортированный символ модуля GKI some_kernel_function, не будучи указанным в списке символов поставщика.
Разрешение
Если module.ko не является защищенным модулем GKI, обновление списка символов устранит ошибку, добавив some_kernel_function в список символов поставщика.
Вы также можете использовать версию GKI module.ko.
2. Модуль без подписи экспортирует защищенный символ
Ошибка
module: exports protected symbol some_kernel_function
Причина
Модуль, экспортирующий some_kernel_function, является защищенным модулем GKI, а module.ko, скорее всего, – неподписанная пользовательская версия этого модуля. Когда module.ko пытается экспортировать some_kernel_function, который можно экспортировать только с помощью подписанного модуля GKI, загрузка завершается неудачно с этим сообщением.
Решение
Если неподписанный модуль является пользовательской версией, это можно исправить, используя версию GKI модуля, который экспортирует some_kernel_function.