На этой странице описывается, как настроить новую функцию ядра как модуль GKI или настроить существующую встроенную функцию ядра как модуль GKI.
Настройте новую функцию как модуль GKI
Для новой функции отредактируйте
gki_defconfigи измените значение параметра конфигурации нужной функции ядра сnнаm(=m). Этот параметр следует задать как вarch/arm64/configs/gki_defconfigтак и вarch/x86/configs/gki_defconfig.Добавьте файлы KO (
.ko), сгенерированные для этой функции, в разделCOMMON_GKI_MODULES_LISTфайлаcommon/modules.bzl. Добавьте файлы в отсортированном порядке. Если вы не уверены, все ли файлы сгенерированы, сборка завершится ошибкой и будут перечислены все необходимые файлы KO для добавления в список.Для 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_exportsforaarch64.Убедитесь, что вновь добавленные файлы 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в сборке платформы.Отправьте свои изменения на проверку. Модули GKI доступны только в ядре Android, поэтому патчи для преобразования модулей не требуется отправлять в основной проект. Однако для отправки патчей Android Common Kernel (ACK) необходимо соблюдать другие правила.
Настройте встроенную функцию ядра как модуль GKI
Для существующей встроенной функции ядра отредактируйте файл
gki_defconfigи измените значение элемента конфигурации требуемой функции ядра сyнаm(=m). Этот параметр следует задать как вarch/arm64/configs/gki_defconfigтак и вarch/x86/configs/gki_defconfig.Добавьте файлы KO (
.ko), сгенерированные для этой функции, в разделCOMMON_GKI_MODULES_LISTфайлаcommon/modules.bzl. Добавьте файлы в отсортированном порядке. Если вы не уверены, все ли файлы сгенерированы, сборка завершится ошибкой и будут перечислены все необходимые файлы KO для добавления в список.Для 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_exportsforaarch64.Убедитесь, что вновь преобразованные файлы 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в сборке платформы.Отправьте свои изменения на проверку. Модули GKI доступны только в ядре Android, поэтому патчи для преобразования модулей не требуется отправлять в основной проект. Однако для отправки патчей Android Common Kernel (ACK) необходимо следовать другим правилам.
Преобразовать защищенный модуль GKI в незащищенный
Для Android 15 и выше добавьте модуль, преобразуемый из защищенного в незащищенный, в список
COMMON_UNPROTECTED_MODULES_LISTв файле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_exportsforaarch64.Отправьте свои изменения на проверку. Модули 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 , если неподписанный модуль является пользовательской версией.