Чтобы уменьшить количество символов и типов, которые должны быть стабильными, ядро GKI может ограничивать экспорт символов только теми, которые нужны модулям. Для внешних модулей вам понадобится список используемых символов, чтобы разрешить их экспорт ядром GKI. Например, символы, используемые модулями для Cuttlefish, хранятся в gki/aarch64/symbols/virtual_device.
Как добавить цель для создания списка символов
Списки символов генерируются целью kernel_abi. Добавьте эту цель в устройство BUILD.bazel, используя следующие варианты:
nameДолжен быть в формате
<kernel_build>_abi.kernel_buildДолжен содержать название целевого устройства
kernel_build.
Вы также можете использовать следующие варианты:
kernel_modulesСписок целей для модулей out-of-tree. Встроенные модули здесь указывать не нужно. Подробную информацию вы найдете в разделе Подготовка встроенных модулей к извлечению символов.
kmi_symbol_list_add_onlyЭтот параметр запрещает удаление неиспользуемых символов. Удалять символы разрешается только в определенные моменты во время стабилизации KMI и запрещено после того, как KMI будет заморожен.
Это также удобно, если вы используете один и тот же список символов на нескольких устройствах. Так вы не удалите символы, которые используются на устройстве А, но не используются на устройстве Б.
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.
Как обновить список значков устройств
Все основные символы ядра, используемые модулями в 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 списка символов
Отправьте патч с изменениями списка символов в Android Common Kernel Gerrit, чтобы новые символы стали частью 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.