Чтобы сократить количество символов и типов, которые необходимо поддерживать стабильными, ядро 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.
Подготовка модулей внутри дерева для извлечения символов
Чтобы подготовить модули, входящие в дерево сборки, для извлечения символов перечислите специфичные для поставщика модули, входящие в дерево сборки, в атрибуте 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.