เครื่องมือตรวจสอบการใช้งาน ABI ที่คอมไพล์ไว้ล่วงหน้า

ไลบรารีที่ใช้ร่วมกันของ Android มีการพัฒนาอยู่เรื่อยๆ การอัปเดตไบนารีที่สร้างไว้ล่วงหน้าให้เป็นเวอร์ชันล่าสุดต้องใช้ความพยายามอย่างมาก ใน Android 9 หรือเวอร์ชันก่อนหน้า ไบนารีที่สร้างไว้ล่วงหน้าที่ขึ้นอยู่กับไลบรารีหรือ ABI ที่นำออกไปจะลิงก์ไม่สำเร็จเมื่อรันไทม์เท่านั้น นักพัฒนาแอปต้องติดตามบันทึกเพื่อค้นหาไบนารีที่สร้างไว้ล่วงหน้าที่ล้าสมัย ใน Android 10 มีการเปิดตัวเครื่องมือตรวจสอบการใช้งาน ABI ตามสัญลักษณ์ เครื่องมือตรวจสอบนี้สามารถตรวจหาไบนารีที่สร้างไว้ล่วงหน้าที่ล้าสมัยได้ในระหว่างการสร้าง เพื่อให้นักพัฒนาไลบรารีที่ใช้ร่วมกันทราบว่าการเปลี่ยนแปลงของตนอาจทำให้ไบนารีที่สร้างไว้ล่วงหน้าใดใช้งานไม่ได้ และต้องสร้างไบนารีที่สร้างไว้ล่วงหน้าใดขึ้นมาใหม่

เครื่องมือตรวจสอบการใช้งาน ABI ตามสัญลักษณ์

เครื่องมือตรวจสอบการใช้งาน ABI ตามสัญลักษณ์จะจำลองโปรแกรมลิงก์แบบไดนามิกของ Android ในโฮสต์ เครื่องมือตรวจสอบจะลิงก์ไบนารีที่สร้างไว้ล่วงหน้ากับทรัพยากร Dependency ของไบนารีที่สร้างไว้ล่วงหน้า และตรวจสอบว่าสัญลักษณ์ที่ไม่ได้กำหนดทั้งหมดได้รับการแก้ไขแล้วหรือไม่

ขั้นแรก เครื่องมือตรวจสอบจะตรวจสอบสถาปัตยกรรมเป้าหมายของไบนารีที่สร้างไว้ล่วงหน้า หากไบนารีที่สร้างไว้ล่วงหน้าไม่ได้กำหนดเป้าหมายเป็นสถาปัตยกรรม ARM, AArch64, x86 หรือ x86-64 เครื่องมือตรวจสอบจะข้ามไบนารีที่สร้างไว้ล่วงหน้า

ประการที่ 2 ทรัพยากร Dependency ของไบนารีที่สร้างไว้ล่วงหน้าต้องระบุไว้ใน LOCAL_SHARED_LIBRARIES หรือ shared_libs ระบบบิลด์จะแปลงชื่อโมดูลเป็นตัวแปรที่ตรงกัน (เช่น core กับ vendor) ของไลบรารีที่ใช้ร่วมกัน

ประการที่ 3 เครื่องมือตรวจสอบจะเปรียบเทียบรายการ DT_NEEDED กับ LOCAL_SHARED_LIBRARIES หรือ shared_libs โดยเฉพาะอย่างยิ่ง เครื่องมือตรวจสอบจะแยกรายการ DT_SONAME ออกจากไลบรารีที่ใช้ร่วมกันแต่ละรายการ และเปรียบเทียบ DT_SONAME เหล่านี้กับรายการ DT_NEEDED ที่บันทึกไว้ในไบนารีที่สร้างไว้ล่วงหน้า หากไม่ตรงกัน ระบบจะแสดงข้อความแสดงข้อผิดพลาด

ประการที่ 4 เครื่องมือตรวจสอบจะแก้ไขสัญลักษณ์ที่ไม่ได้กำหนดในไบนารีที่สร้างไว้ล่วงหน้า สัญลักษณ์ที่ไม่ได้กำหนดเหล่านั้นต้องกำหนดไว้ในทรัพยากร Dependency รายการใดรายการหนึ่ง และการผูกสัญลักษณ์ต้องเป็น GLOBAL หรือ WEAK หากแก้ไขสัญลักษณ์ที่ไม่ได้กำหนดไม่ได้ ระบบจะแสดงข้อความแสดงข้อผิดพลาด

พร็อพเพอร์ตี้โมดูลที่สร้างไว้ล่วงหน้า

ต้องระบุทรัพยากร Dependency ของไบนารีที่สร้างไว้ล่วงหน้าในรายการใดรายการหนึ่งต่อไปนี้

  • 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

เรียกใช้เครื่องมือตรวจสอบ

เครื่องมือตรวจสอบจะครอบคลุมโมดูลที่สร้างไว้ล่วงหน้าของ ELF ทั้งหมดในระหว่างกระบวนการบิลด์ Android

หากต้องการเรียกใช้เครื่องมือตรวจสอบเพียงอย่างเดียวเพื่อให้ได้ผลลัพธ์เร็วขึ้น ให้ทำดังนี้

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>