ตัวตรวจสอบการใช้งาน ABI ที่สร้างไว้ล่วงหน้า

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

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

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

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

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

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

ประการที่สี่ ตัวตรวจสอบจะแก้ไขสัญลักษณ์ที่ไม่ได้กำหนดไว้ในไบนารี่ที่สร้างไว้ล่วงหน้า สัญลักษณ์ที่ไม่ได้กำหนดเหล่านั้นจะต้องถูกกำหนดไว้ในการอ้างอิงอย่างใดอย่างหนึ่ง และการผูกสัญลักษณ์ต้องเป็น 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>