Чтобы уменьшить поверхность символов и типов, которые должны поддерживаться как стабильные, ядро GKI имеет возможности ограничивать экспортируемые символы только теми, которые нужны модулям. Для внешне скомпилированных модулей вам необходимо иметь список используемых символов, чтобы разрешить их экспорт ядром GKI. Например, символы, используемые модулями для Cuttlefish , хранятся в gki/aarch64/symbols/virtual_device
.
Добавить цель для генерации списка символов
Списки символов генерируются целью kernel_abi
. Добавьте эту цель в устройство BUILD.bazel
со следующими параметрами:
name
Должен иметь формат
<kernel_build>_abi
.kernel_build
Должно содержать имя цели
kernel_build
устройства.
Вы также можете использовать следующие варианты:
kernel_modules
Список целей для модулей вне дерева . Модули внутри дерева не должны быть включены сюда. См. Подготовка модулей внутри дерева для извлечения символов .
kmi_symbol_list_add_only
Эта опция предотвращает удаление неиспользуемых символов. Удаление символов разрешено только в определенные моменты во время стабилизации KMI и не разрешено после заморозки KMI.
Это также полезно, когда вы используете один и тот же список символов для нескольких разных устройств. Таким образом, он не удалит символы, используемые устройством A, но не устройством B.
module_grouping
Если
True
или не указано, то список символов группирует символы на основе модулей ядра, которые ссылаются на символ. В противном случае список символов представляет собой отсортированный список символов, используемых всеми модулями ядра.
См., например common-modules/virtual-device/BUILD.bazel
:
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [":virtual_device_aarch64_external_modules"],
kmi_symbol_list_add_only = True,
)
Также см. справочную документацию по цели kernel_abi
в Kleaf.
Подготовка модулей внутри дерева для извлечения символов
Чтобы подготовить модули in-tree для извлечения символов, перечислите специфичные для поставщика модули in-tree в атрибуте module_outs
цели kernel_build
. См. _VIRT_COMMON_MODULES
и его использование для примера. Не включайте модули GKI в этот список.
Настройте эти модули как неподписанные , иначе список символов может быть пустым. Для этого добавьте эту строку в фрагменты конфигурации ядра:
# CONFIG_MODULE_SIG_ALL is not set
См., например common-modules/virtual-device/virtual_device_core.fragment
.
Добавить список символов устройства в сборку ядра устройства
Добавьте атрибут kmi_symbol_list
к цели kernel_build
, определенной в устройстве BUILD.bazel
. Имя списка символов должно быть в формате //common:gki/<arch>/symbols/<device>
.
См. common-modules/virtual-device/BUILD.bazel
, например:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
Создайте и отправьте первоначальный список символов
Создайте пустой список символов в common/gki/<arch>/symbols/<device>
. Для примера выше команда будет такой:
touch common/gki/aarch64/symbols/virtual_device
Добавьте этот файл в additional_kmi_symbol_lists
базовой сборки ядра GKI. Например, //common:gki/aarch64/symbols/virtual_device
добавляется в файловую группу aarch64_additional_kmi_symbol_lists
, объявленную в common/BUILD.bazel
.
Обновите список символов устройства , чтобы заполнить новый список символов, и отправьте его в репозиторий Android Common Kernel.
Обновить список символов устройства
Все основные символы ядра, используемые модулями в module_outs
kernel_build
и kernel_modules
kernel_abi
должны быть включены в список символов. Это можно сделать, запустив цель kernel_abi
с суффиксом _update_symbol_list
. Например, следующая команда обновляет список символов для //common-modules/virtual-device:virtual_device_aarch64
:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list
Отправить обновление списка символов на ACK
Отправьте патч с изменением списка символов в gerrit Android Common Kernel, чтобы сделать новые символы частью KMI.
Сообщение о коммите должно включать список добавленных или удаленных символов. Вы можете либо написать этот список вручную для небольшого обновления списка символов, либо использовать отчет $DIST_DIR/abi_stgdiff/abi.report.short
после обновления ссылочного представления ABI .
Хотя обновление справочного представления ABI перед отправкой обновления списка символов не требуется, это может устранить дополнительные шаги предварительной отправки и ускорить готовность изменения к отправке. В любом случае, оно проверяется и обновляется при необходимости во время предварительной отправки.
Работа со списками символов (Android 13)
Android 13 поддерживает как Kleaf, так и устаревшие скрипты сборки, поэтому вы можете управлять списками символов, как описано в предыдущих разделах или как описано в следующем разделе.
Работа со списками символов (Android 12 и ниже)
Используйте инструмент build_abi.sh
следующим образом:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
В этом примере build.config.device
должен включать следующие параметры конфигурации:
vmlinux
Должен быть частью списка
FILES
. Это можно сделать, включивbuild.config.aarch64
.KMI_SYMBOL_LIST
Необходимо установить и указать на список символов KMI для обновления.
После обновления списка символов устройств вам также необходимо отразить эти изменения в сборке GKI ( common/build.config.gki.aarch64
):
Скопируйте обновленный список символов в
common/android/abi_gki_aarch64_<device>
.Проверьте, что
android/abi_gki_aarch64_<device>
включен вADDITIONAL_KMI_SYMBOL_LISTS
вcommon/build.config.gki.aarch64
.