Trình kiểm tra việc sử dụng ABI tạo sẵn

Thư viện dùng chung Android phát triển tuỳ từng thời điểm. Lưu giữ tệp nhị phân tạo sẵn việc cập nhật thường xuyên đòi hỏi nỗ lực đáng kể. Trong Android 9 trở xuống, các tệp nhị phân tạo sẵn chỉ phụ thuộc vào thư viện hoặc ABI đã bị xoá không liên kết được trong thời gian chạy. Nhà phát triển phải theo dõi nhật ký để tìm các nội dung lỗi thời tệp nhị phân tạo sẵn. Trong Android 10, ABI dựa trên biểu tượng giới thiệu trình kiểm tra mức độ sử dụng. Trình kiểm tra có thể phát hiện các tệp nhị phân tạo sẵn đã lỗi thời tại thời điểm xây dựng, để nhà phát triển thư viện dùng chung có thể biết thư viện tạo sẵn nào tệp nhị phân có thể bị hỏng do sự thay đổi của chúng và bạn phải chọn các tệp nhị phân tạo sẵn tạo 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 tạo sẵn với các phần phụ thuộc của tệp nhị phân tạo sẵn nhị phân và kiểm tra xem tất cả các ký hiệu không xác định đã được giải quyết hay chưa.

Trước tiên, trình kiểm tra sẽ kiểm tra kiến trúc mục tiêu của tệp nhị phân được tạo sẵn. Nếu tệp nhị phân tạo sẵn không nhắm đến kiến trúc ARM, AArch64, x86 hoặc x86-64, trình kiểm tra bỏ qua tệp nhị phân tạo sẵn.

Thứ hai, các phần phụ thuộc của tệp nhị phân tạo 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 mô-đun tên của biến thể phù hợp (tức là core so với vendor) của biến thể được chia sẻ thư viện.

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

Thứ tư, trình kiểm tra phân giải các ký hiệu không xác định trong tệp nhị phân tạo sẵn. Những ký hiệu không xác định phải được định nghĩa trong một trong các phần phụ thuộc và ký hiệu đó liên kết phải là GLOBAL hoặc WEAK. Nếu một biểu tượng không xác định không thể được đã giải quyết thì một thông báo lỗi sẽ xuất hiện.

Thuộc tính mô-đun tạo sẵn

Bạn phải chỉ định các phần phụ thuộc của tệp nhị phân tạo sẵn ở một trong những mục sau:

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

Nếu tệp nhị phân tạo sẵn được thiết kế để có một số phần tử không xác định không thể giải quyết biểu tượng, hãy chỉ định một trong các tham số sau:

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

Để tệp nhị phân được tạo sẵn bỏ qua bước kiểm tra tệp ELF, hãy chỉ định một trong 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 này áp dụng cho mọi mô-đun tạo sẵn ELF trong quy trình xây dựng Android.

Để chạy riêng trình kiểm tra nhằm rút ngắn thời gian xử lý:

m check-elf-files

Trình sửa lỗi ABI

Trình khắc phục sự cố tự động có thể giúp giải quyết các lỗi kiểm tra ABI. Bạn chỉ cần chạy trình sửa lỗi với Android.bp / Android.mk làm dữ liệu đầu vào và trình sửa lỗi sẽ in các đề xuất sửa thành stdout. Bạn có thể chạy trình khắc phục sự cố với tuỳ chọn --in-place để trực tiếp cập nhật Android.bp / Android.mk với bản sửa lỗi đề 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>