На этой странице описывается, как настроить новую функцию ядра как модуль 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_exports
foraarch64
.Убедитесь, что вновь добавленные файлы 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_exports
foraarch64
.Убедитесь, что вновь преобразованные файлы 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_exports
дляaarch64
.Отправьте свои изменения на проверку. Модули 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
в список символов поставщика. В качестве альтернативы используйте версию 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
, если неподписанный модуль является пользовательской версией.