預建 ABI 使用檢查器

Android 共享庫會不斷發展。使預構建的二進製文件保持最新需要相當大的努力。在 Android 9 或更早版本中,依賴於已移除庫或 ABI 的預構建二進製文件僅在運行時無法鏈接。開發人員必須跟踪日誌以找到過時的預構建二進製文件。在 Android 10 中,引入了基於符號的 ABI 使用檢查器。檢查器可以在構建時檢測過時的預構建二進製文件,以便共享庫開發人員可以知道哪些預構建二進製文件可能因更改而損壞,哪些預構建二進製文件必須重新構建。

基於符號的 ABI 使用檢查器

基於符號的 ABI 使用檢查器在主機上模擬 Android 動態鏈接器。檢查器將預構建的二進製文件與預構建的二進製文件的依賴項鍊接起來,並檢查是否所有未定義的符號都已解析。

首先,檢查器檢查預構建二進製文件的目標架構。如果預構建的二進製文件不針對 ARM、AArch64、x86 或 x86-64 架構,則檢查器會跳過預構建的二進製文件。

其次,預構建二進製文件的依賴項必須列在LOCAL_SHARED_LIBRARIESshared_libs中。構建系統將模塊名稱解析為共享庫的匹配變體(即corevendor )。

第三,檢查器將DT_NEEDED條目與LOCAL_SHARED_LIBRARIESshared_libs進行比較。特別是,檢查器從每個共享庫中提取DT_SONAME條目,並將這些DT_SONAME與記錄在預構建二進製文件中的DT_NEEDED條目進行比較。如果不匹配,則會發出錯誤消息。

第四,檢查器解析預構建二進製文件中的未定義符號。那些未定義的符號必須在依賴項之一中定義,並且符號綁定必須是GLOBALWEAK 。如果無法解析未定義的符號,則會發出錯誤消息。

預建模塊屬性

必須在以下之一中指定預構建二進製文件的依賴項:

  • 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

運行檢查器

檢查器涵蓋了 Android 構建過程中的所有 ELF 預構建模塊。

要單獨運行檢查器以加快周轉時間:

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>