В этой статье рассказывается, как создавать представления ABI ядра Android и выполнять мониторинг ABI. Оно применимо к Android 16 и более поздним версиям. Для более ранних версий см. ABI monitor previous kernel versions.
Также ознакомьтесь со справочной документацией по Kleaf: Поддержка мониторинга ABI (GKI) и Поддержка мониторинга ABI (устройство).
Создание ядра и его представления ABI
После скачивания исходного кода GKI выполните следующую команду, чтобы создать ядро GKI и артефакты ABI:
tools/bazel run //common:kernel_aarch64_abi_distЭта команда создает текущее представление ABI и копирует его в $DIST_DIR/abi.stg вместе с собранным ядром и модулями. $DIST_DIR
Значение по умолчанию – out_abi/kernel_aarch64_abi_dist/dist.
В конце команды после -- можно указать дополнительные аргументы для инструментов ABI. Например, чтобы изменить целевой каталог для ABI и артефактов сборки, можно использовать параметр --destdir:
tools/bazel run //common:kernel_aarch64_abi_dist -- --destdir=out/distАнализировать различия ABI между сборкой и эталонным представлением
Цель //common:kernel_aarch64_abi_dist, выполненная в предыдущей команде, анализирует и сообщает о любых различиях ABI, обнаруженных между сборкой и эталонным представлением, расположенным по адресу common/gki/aarch64/abi.stg (определенному в BUILD.bazel). Эти различия выводятся в конце сборки, как показано в следующем примере:
INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!
Напечатанный отчет создается на основе артефакта сборки, расположенного по адресу $DIST_DIR/abi_stgdiff/abi.report.short, вместе с отчетами в других форматах.
Автоматизация должна использовать код выхода команды сборки, который будет ненулевым, если будут обнаружены различия.
Обратите внимание, что ветви фазы разработки, в том числе android-mainline, не имеют эталонного представления ABI.
Без него //common:kernel_aarch64_abi_dist не сможет обнаружить различия.
Обновите представление ABI для эталонного устройства
Любое изменение, которое влияет на ABI ядра, например обновление списка символов, должно быть отражено в представлении эталонного ABI (common/gki/aarch64/abi.stg, определенном в BUILD.bazel).
Для этого выполните следующую команду:
tools/bazel run //common:kernel_aarch64_abi_updateЭта команда выполняет все действия, описанные в разделе Анализ различий ABI, а также обновляет эталонное представление в источниках. Обновленный ABI можно загрузить в том же коммите, что и изменение. Включите в сообщение коммита различия ABI из отчета в $DIST_DIR/abi_stgdiff/abi.report.short.
Отслеживание ABI и таргетинг на устройства
Отслеживание ABI нужно настроить только для основных целевых объектов сборки ядра. Смешанные конфигурации сборки (те, которые определяют base_kernel), компилируемые непосредственно с ядром GKI, должны добавить поддержку отслеживания списка символов устройства.
Определение ABI следует обновить с помощью сборки GKI.
Также ознакомьтесь со справочной документацией по Kleaf: Поддержка мониторинга ABI (устройство).
Монитор ABI для предыдущих версий ядра (Android 15 и более ранние версии)
Для предыдущих версий ядра инструкции по созданию и мониторингу ABI отличаются следующим образом.
Android 14 и 15
Инструкции в основном такие же, как для Android 16, но эталонное представление ABI – common/android/abi_gki_aarch64.stg и $DIST_DIR, а по умолчанию используется out_abi/kernel_aarch64/dist.
Android 13
Android 13 можно собрать с помощью Kleaf или устаревших скриптов сборки.
Для Kleaf инструкции такие же, как и для Android 14, за исключением того, что ABI имеет формат XML, а эталонное представление ABI – common/android/abi_gki_aarch64.xml.
Для устаревших скриптов сборки инструкции такие же, как для Android 12.
Android 12 и более ранние версии
Формат ABI – XML, а его представление в виде ссылки выглядит так:common/android/abi_gki_aarch64.xml
В этих ядрах вместо Kleaf используется build.sh. Для мониторинга ABI используйте build_abi.sh. Он принимает те же переменные среды для настройки сборки, что и build.sh. Пример:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.shЭто позволяет создать ядро и извлечь представление ABI в подкаталог OUT_DIR (по умолчанию out_abi). Это эквивалентно цели //common:kernel_aarch64_abi_dist Kleaf (см. Создание ядра и артефактов ABI).
Эталонное представление ABI хранится в android/abi_gki_aarch64.xml, как определено переменной ABI_DEFINITION в common/build.config.gki.aarch64.
Если вам нужно обновить представление ABI ядра, удобнее всего использовать параметры --update и --print-report:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-reportКоманда --print-report выводит различия в ABI между существующим файлом и недавно сгенерированным ABI.
Параметр --update перезаписывает эталонное представление ABI. Кроме того, при использовании BUILD_CONFIG для устройства с настроенным KMI_SYMBOL_LIST выполняется обновление списка символов.