Общие библиотеки 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 в качестве входных данных, и фиксер выведет предлагаемое исправление на stdout. При желании запустите фиксер с опцией --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>