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

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