Общие библиотеки 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>