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