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

Thư viện dùng chung của Android không ngừng phát triển. Việc cập nhật tệp nhị phân tạo sẵn đòi hỏi nhiều nỗ lực. Trong Android 9 trở xuống, các tệp nhị phân tạo sẵn phụ thuộc vào các thư viện hoặc ABI đã bị xoá chỉ 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 tệp nhị phân tạo sẵn đã lỗi thời. Trong Android 10, chúng tôi đã giới thiệu một trình kiểm tra mức sử dụng ABI dựa trên biểu tượng. Trình kiểm tra này 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 tạo bản dựng. Nhờ đó, nhà phát triển thư viện dùng chung có thể biết được tệp nhị phân tạo sẵn nào có thể bị hỏng do thay đổi và phải tạo lại tệp nhị phân tạo sẵn nào.

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 và kiểm tra xem tất cả các ký hiệu chưa xác định có được phân giải hay không.

Trước tiên, trình kiểm tra sẽ kiểm tra cấu trúc mục tiêu của tệp nhị phân tạo sẵn. Nếu tệp nhị phân tạo sẵn không nhắm đến cấu trúc ARM, AArch64, x86 hoặc x86-64, thì trình kiểm tra sẽ 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 tên mô-đun thành biến thể trùng khớp (tức là core so với vendor) của 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 trích xuất mục nhập DT_SONAME từ mỗi thư viện dùng chung và so sánh các DT_SONAME này với các mục nhập DT_NEEDED được ghi lại trong tệp nhị phân tạo sẵn. Nếu không khớp, hệ thống sẽ phát ra thông báo lỗi.

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

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 theo một trong những 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 tạo sẵn được thiết kế để có một số biểu tượng chưa xác định không thể phân giải, hãy chỉ định một trong những cách sau:

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

Để tệp nhị phân tạo sẵn bỏ qua bước kiểm tra tệp ELF, hãy chỉ định một trong các tuỳ chọn 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 bao gồm tất cả các mô-đun ELF tạo sẵn trong quá trình tạo bản dựng Android.

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

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. Bạn chỉ cần chạy trình khắc phục với Android.bp / Android.mk làm phương thức nhập và trình sửa lỗi sẽ in bản sửa lỗi đề xuất vào stdout. Nếu muốn, hãy chạy trình sửa lỗi bằng tuỳ 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>