Общие библиотеки Android периодически меняются. Поддержание актуальности готовых двоичных файлов требует значительных усилий. В Android 9 и более ранних версиях готовые двоичные файлы, зависящие от удалённых библиотек или ABI, не линкуются только во время выполнения. Разработчикам приходится отслеживать журналы, чтобы найти устаревшие готовые двоичные файлы. В Android 10 представлен инструмент проверки использования ABI на основе символов. Этот инструмент может обнаруживать устаревшие готовые двоичные файлы во время сборки, чтобы разработчики общих библиотек могли знать, какие готовые двоичные файлы могут быть повреждены в результате внесённых изменений, и какие из них необходимо пересобрать.
Проверка использования ABI на основе символов
Проверка использования ABI на основе символов эмулирует динамический компоновщик Android на хосте. Проверка связывает готовый двоичный файл с его зависимостями и проверяет, разрешены ли все неопределённые символы.
Сначала программа проверки проверяет целевую архитектуру готового двоичного файла. Если готовая архитектура не предназначена для архитектуры ARM, AArch64, x86 или x86-64, программа проверки пропускает готовый двоичный файл.
Во-вторых, зависимости готового двоичного файла должны быть указаны в LOCAL_SHARED_LIBRARIES
или shared_libs
. Система сборки определяет имена модулей в соответствии с вариантом (например, core
или vendor
) общих библиотек.
В-третьих, программа проверки сравнивает записи DT_NEEDED
с LOCAL_SHARED_LIBRARIES
или shared_libs
. В частности, программа проверки извлекает запись DT_SONAME
из каждой разделяемой библиотеки и сравнивает эти DT_SONAME
с записями DT_NEEDED
, записанными в предварительно собранном двоичном файле. В случае несоответствия выдаётся сообщение об ошибке.
В-четвертых, программа проверки разрешает неопределенные символы в предварительно собранном двоичном файле. Эти неопределенные символы должны быть определены в одной из зависимостей, а привязка символов должна быть либо GLOBAL
, либо WEAK
. Если неопределенный символ не может быть разрешен, выдается сообщение об ошибке.
Свойства готовых модулей
Зависимости предварительно собранного двоичного файла должны быть указаны в одном из следующих вариантов:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Если готовый двоичный файл содержит некоторые неразрешимые неопределенные символы , укажите одно из следующих:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Чтобы готовый двоичный файл пропустил проверку ELF-файла, укажите одно из следующих:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Запустить проверку
Средство проверки охватывает все предварительно собранные модули ELF в процессе сборки Android.
Чтобы запустить проверку отдельно и ускорить обработку данных:
m check-elf-files
Исправление ошибок ABI
Автоматический фиксер поможет устранить ошибки проверки ABI. Просто запустите фиксер, указав в качестве входных данных файл Android.bp / Android.mk, и он выведет предлагаемое исправление на стандартный вывод. При желании можно запустить фиксер с опцией --in-place
чтобы напрямую обновить Android.bp / Android.mk, добавив предлагаемое исправление.
Для Android.bp,
m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>
Для Android.mk,
m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>