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

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

,

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