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

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

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

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

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

ประการที่ 2 คุณต้องระบุรายการที่ต้องใช้ของไบนารีที่สร้างไว้ล่วงหน้าใน 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 หากสัญลักษณ์ที่ไม่ได้ระบุไม่ได้ ได้รับการแก้ไขแล้ว ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น

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

คุณต้องระบุข้อมูลที่ต้องพึ่งพาของไบนารีที่สร้างไว้ล่วงหน้าอย่างใดอย่างหนึ่งต่อไปนี้

  • 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>