Встроенная проверка использования ABI

Библиотеки общего назначения 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>