預先建構的 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_LIBRARIES 進行比較 或 shared_libs。特別是檢查工具會擷取 DT_SONAME 項目 請將這些 DT_SONAMEDT_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 做為輸入內容,修復工具則會輸出建議的 修正 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>