Чтобы уменьшить количество символов и типов, которые необходимо поддерживать в стабильном состоянии, ядро GKI имеет возможности ограничивать экспортируемые символы только теми, которые необходимы модулям. Для модулей, скомпилированных извне, необходим список используемых символов, чтобы ядро GKI могло их экспортировать. Например, символы, используемые модулями для Cuttlefish , хранятся в gki/aarch64/symbols/virtual_device .
Добавьте цель для генерации списка символов.
Списки символов генерируются целевым объектом kernel_abi . Добавьте этот целевой объект в файл device 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 определенной в файле device 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 , чтобы новые символы стали частью 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.