Работа со списками символов

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