Trình kiểm tra sử dụng ABI dựng sẵn

Thư viện chia sẻ của Android phát triển theo thời gian. Việc cập nhật các tệp nhị phân dựng sẵn đòi hỏi nỗ lực đáng kể. Trong Android 9 trở về trước, các tệp nhị phân dựng sẵn phụ thuộc vào các thư viện hoặc ABI đã xóa chỉ không liên kết được trong thời gian chạy. Các nhà phát triển phải theo dõi nhật ký để tìm các tệp nhị phân dựng sẵn đã lỗi thời. Trong Android 10, trình kiểm tra mức sử dụng ABI dựa trên biểu tượng đã được giới thiệu. Trình kiểm tra có thể phát hiện các tệp nhị phân dựng sẵn đã lỗi thời tại thời điểm xây dựng, để các nhà phát triển thư viện dùng chung có thể biết tệp nhị phân dựng sẵn nào có thể bị hỏng do thay đổi của họ và tệp nhị phân dựng sẵn nào phải được xây dựng lại.

Trình kiểm tra mức sử dụng ABI dựa trên biểu tượng

Trình kiểm tra mức sử dụng ABI dựa trên biểu tượng mô phỏng trình liên kết động Android trên máy chủ. Trình kiểm tra liên kết tệp nhị phân dựng sẵn với các phần phụ thuộc của tệp nhị phân dựng sẵn và kiểm tra xem tất cả các ký hiệu không xác định có được giải quyết hay không.

Đầu tiên, trình kiểm tra sẽ kiểm tra kiến ​​trúc đích của tệp nhị phân dựng sẵn. Nếu tệp nhị phân dựng sẵn không nhắm mục tiêu kiến ​​trúc ARM, AArch64, x86 hoặc x86-64 thì trình kiểm tra sẽ bỏ qua tệp nhị phân dựng sẵn.

Thứ hai, các phần phụ thuộc của tệp nhị phân dựng sẵn phải được liệt kê trong LOCAL_SHARED_LIBRARIES hoặc shared_libs . Hệ thống xây dựng phân giải tên mô-đun thành biến thể phù hợp (tức là core so với vendor ) của các thư viện dùng chung.

Thứ ba, trình kiểm tra so sánh các mục DT_NEEDED với LOCAL_SHARED_LIBRARIES hoặc shared_libs . Cụ thể, trình kiểm tra sẽ trích xuất mục nhập DT_SONAME từ mỗi thư viện dùng chung và so sánh DT_SONAME này với các mục nhập DT_NEEDED được ghi trong tệp nhị phân dựng sẵn. Nếu có sự không khớp, một thông báo lỗi sẽ được phát ra.

Thứ tư, trình kiểm tra giải quyết các ký hiệu không xác định trong tệp nhị phân dựng sẵn. Những ký hiệu không xác định đó phải được xác định ở một trong các phần phụ thuộc và ràng buộc ký hiệu phải là GLOBAL hoặc WEAK . Nếu không thể giải quyết được ký hiệu không xác định, thông báo lỗi sẽ được phát ra.

Thuộc tính mô-đun dựng sẵn

Các phần phụ thuộc của tệp nhị phân dựng sẵn phải được chỉ định theo một trong các cách sau:

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

Nếu tệp nhị phân dựng sẵn được thiết kế để có một số ký hiệu không xác định không thể giải quyết được , hãy chỉ định một trong các mục sau:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Để yêu cầu tệp nhị phân dựng sẵn bỏ qua việc kiểm tra tệp ELF, hãy chỉ định một trong các thao tác sau:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Chạy trình kiểm tra

Trình kiểm tra bao gồm tất cả các mô-đun dựng sẵn ELF trong quá trình xây dựng Android.

Để chạy trình kiểm tra một mình để có thời gian quay vòng nhanh hơn:

m check-elf-files

Trình sửa lỗi ABI

Trình sửa lỗi tự động có thể giúp giải quyết các lỗi kiểm tra ABI. Chỉ cần chạy trình sửa lỗi với Android.bp / Android.mk làm đầu vào và trình sửa lỗi sẽ in bản sửa lỗi được đề xuất ra thiết bị xuất chuẩn. Theo tùy chọn, hãy chạy trình sửa lỗi với tùy chọn --in-place để cập nhật trực tiếp Android.bp / Android.mk bằng bản sửa lỗi được đề xuất.

Đối với 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>

Đối với 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>