Настройте функции ядра как модули GKI

На этой странице описано, как настроить новую функцию ядра в качестве модуля GKI или настроить существующую встроенную функцию ядра в качестве модуля GKI.

Настройте новую функцию как модуль GKI.

  1. Для использования новой функции отредактируйте gki_defconfig и измените значение параметра конфигурации необходимой функции ядра с n на m ( =m ). Установите этот параметр как в arch/arm64/configs/gki_defconfig так и в arch/x86/configs/gki_defconfig .

  2. Добавьте файлы KO ( .ko ), сгенерированные для данной функции, в раздел _COMMON_GKI_MODULES_LIST следующего файла. Добавляйте файлы в отсортированном порядке. Если вы не уверены во всех сгенерированных файлах, сборка завершится с ошибкой, и будет перечислен список всех необходимых файлов KO, которые следует добавить в список.

    • В android17-6.18 и выше добавьте элементы в файл common/bazel/modules_private.bzl .
    • В android16-6.12 и более ранних версиях добавьте элементы в файл common/modules.bzl .
  3. Для Android 14 добавьте тот же набор KO-файлов из шага 2, отсортированных в порядке возрастания для поиска бинарных файлов во время выполнения, в папку common/android/gki_{ARCH}_protected_modules , чтобы обозначить модуль как защищенный модуль GKI.

  4. Для Android 14 и 15 обновите список экспортируемых параметров, чтобы он включал недавно добавленные параметры в common/android/abi_gki_protected_exports_ ARCHITECTURE . Например, чтобы обновить список, выполните tools/bazel run //common:kernel_aarch64_abi_update_protected_exports for aarch64 .

  5. Убедитесь, что новые файлы KO, добавленные на шаге 2, скопированы в папки ядра out/<androidX-YZ>/dist/system_dlkm.img и out/ androidX-YZ /dist/system_dlkm_staging_archive.tar.gz . Модули из архива system_dlkm_staging_archive.tar.gz можно использовать в качестве входных данных для генерации файла system_dlkm.img при сборке платформы.

  6. Отправьте свои изменения на проверку. Модули GKI — это функция ядра, доступная только для Android, поэтому патчи для преобразования модулей не обязательно отправлять в основной репозиторий. Однако для отправки патчей Android Common Kernel (ACK) необходимо следовать другим рекомендациям.

Настройте встроенную функцию ядра как модуль GKI.

  1. Для уже существующей встроенной функции ядра отредактируйте файл gki_defconfig и измените значение параметра конфигурации необходимой функции ядра с y на m ( =m ). Установите этот параметр как в arch/arm64/configs/gki_defconfig , так и в arch/x86/configs/gki_defconfig .

  2. Добавьте файлы KO ( .ko ), сгенерированные для данной функции, в раздел _COMMON_GKI_MODULES_LIST следующего файла. Добавляйте файлы в отсортированном порядке. Если вы не уверены во всех сгенерированных файлах, сборка завершится с ошибкой, и будет перечислен список всех необходимых файлов KO, которые следует добавить в список.

    • В android17-6.18 и выше добавьте элементы в файл common/bazel/modules_private.bzl .
    • В android16-6.12 и более ранних версиях добавьте элементы в файл `common/modules.bzl.`.
  3. Для Android 14 добавьте тот же набор KO-файлов из шага 2, отсортированных в порядке возрастания для поиска бинарных файлов во время выполнения, в папку common/android/gki_{ARCH}_protected_modules , чтобы обозначить модуль как защищенный модуль GKI.

  4. Для Android 14 и 15 обновите список защищенных экспортов, включив в него экспорты из недавно добавленного модуля в common/android/abi_gki_protected_exports_{ARCH} используя tools/bazel run //common:kernel_aarch64_abi_update_protected_exports for aarch64 .

  5. Убедитесь, что новые файлы KO модулей, преобразованные на шаге 2, скопированы в папки ядра out/<androidX-YZ>/dist/system_dlkm.img и out/ androidX-YZ /dist/system_dlkm_staging_archive.tar.gz . Модули из архива system_dlkm_staging_archive.tar.gz можно использовать в качестве входных данных для генерации файла system_dlkm.img при сборке платформы.

  6. Отправьте свои изменения на проверку. Модули GKI — это функция ядра, доступная только для Android, поэтому патчи для преобразования модулей не обязательно отправлять в основную ветку. Однако для отправки патчей Android Common Kernel (ACK) необходимо следовать другим рекомендациям.

Преобразовать защищенный модуль GKI в незащищенный.

  1. Для Android 15 и выше добавьте модуль, который преобразуется из защищенного в незащищенный, в список _COMMON_UNPROTECTED_MODULES_LIST в следующем файле:

    • В android17-6.18 и выше добавьте элементы в файл common/bazel/modules_private.bzl .
    • В android16-6.12 и более ранних версиях добавьте элементы в файл common/modules.bzl .
  2. Для Android 14 удалите модуль, который преобразуется из защищенного в незащищенный, из списка защищенных модулей в файле common/android/gki_protected_modules .

  3. Для Android 14 и 15 обновите список защищенных экспортов, исключив из него экспорты из недавно преобразованного незащищенного модуля в common/android/abi_gki_protected_exports_{ARCH} используя tools/bazel run //common:kernel_aarch64_abi_update_protected_exports for aarch64 .

  4. Отправьте свои изменения на проверку. Модули GKI — это функция ядра, доступная только для Android, поэтому патчи для преобразования модулей не обязательно отправлять в основную ветку. Однако для отправки патчей Android Common Kernel (ACK) необходимо следовать другим рекомендациям.

Краткое руководство по устранению нарушений символики в модулях GKI

Когда неподписанные модули нарушают защиту символов, применяемую к модулям GKI, при загрузке модуля могут возникать два типа ошибок, приводящие к сбою.

1. Неподписанный модуль, использующий защищенный символ.

Ошибка:

module: Protected symbol: some_kernel_function (err -13)

Причина:

Файл module.ko представляет собой неподписанный модуль поставщика и пытается разрешить экспортируемый символ модуля GKI some_kernel_function во время загрузки, не будучи включенным в список символов поставщика.

Разрешение:

Если module.ko не является защищенным модулем GKI, обновление списка символов устраняет ошибку, добавляя some_kernel_function в список символов поставщика. В качестве альтернативы используйте версию module.ko , относящуюся к GKI.

2. Неподписанный модуль, экспортирующий защищенный символ.

Ошибка:

module: exports protected symbol some_kernel_function

Причина:

Модуль, экспортирующий some_kernel_function является защищенным модулем GKI, а module.ko вероятно, представляет собой неподписанную пользовательскую версию этого модуля. Когда module.ko пытается экспортировать some_kernel_function , которая может быть экспортирована только подписанным модулем GKI, загрузка завершается с ошибкой, о чем свидетельствует следующее сообщение.

Разрешение:

Это можно исправить, используя версию модуля GKI, которая экспортирует some_kernel_function , если неподписанный модуль является пользовательской версией.