Чтобы уменьшить количество символов и типов, которые необходимо поддерживать в стабильном состоянии, ядро GKI имеет возможность ограничивать экспортируемые символы только теми, которые необходимы модулям. Для модулей, скомпилированных извне, вам необходимо иметь список используемых символов, чтобы их можно было экспортировать ядром GKI. Например, символы, используемые модулями для Cuttlefish, хранятся в android/abi_gki_aarch64_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:android/abi_gki_<arch>_<device>
. См. common-modules/virtual-device/BUILD.bazel , например:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
Создайте и отправьте первоначальный список символов
Создайте пустой список символов в common/android/abi_gki_<arch>_<device>
. Для примера выше команда будет такой:
touch common/android/abi_gki_aarch64_virtual_device
Добавьте этот файл в additional_kmi_symbol_lists
базовой сборки ядра GKI. Например, //common:android/abi_gki_aarch64_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 , чтобы новые символы стали частью KMI.
Сообщение о фиксации должно включать список добавленных или удаленных символов. Вы можете либо написать этот список вручную для небольшого обновления списка символов, либо использовать отчет $DIST_DIR/abi.report.short
после обновления эталонного представления ABI .
Хотя обновление эталонного представления ABI перед отправкой обновления списка символов не требуется, это может исключить дополнительные шаги предварительной отправки и ускорить подготовку изменения к отправке. В любом случае он проверяется и при необходимости обновляется во время предварительной отправки.
Старые версии (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
.
Чтобы уменьшить количество символов и типов, которые необходимо поддерживать в стабильном состоянии, ядро GKI имеет возможность ограничивать экспортируемые символы только теми, которые необходимы модулям. Для модулей, скомпилированных извне, вам необходимо иметь список используемых символов, чтобы их можно было экспортировать ядром GKI. Например, символы, используемые модулями для Cuttlefish, хранятся в android/abi_gki_aarch64_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:android/abi_gki_<arch>_<device>
. См. common-modules/virtual-device/BUILD.bazel , например:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
Создайте и отправьте первоначальный список символов
Создайте пустой список символов в common/android/abi_gki_<arch>_<device>
. Для примера выше команда будет такой:
touch common/android/abi_gki_aarch64_virtual_device
Добавьте этот файл в additional_kmi_symbol_lists
базовой сборки ядра GKI. Например, //common:android/abi_gki_aarch64_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 , чтобы новые символы стали частью KMI.
Сообщение о фиксации должно включать список добавленных или удаленных символов. Вы можете либо написать этот список вручную для небольшого обновления списка символов, либо использовать отчет $DIST_DIR/abi.report.short
после обновления эталонного представления ABI .
Хотя обновление эталонного представления ABI перед отправкой обновления списка символов не требуется, это может исключить дополнительные шаги предварительной отправки и ускорить подготовку изменения к отправке. В любом случае он проверяется и при необходимости обновляется во время предварительной отправки.
Старые версии (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
.