ไลบรารีที่ใช้ร่วมกันของ Android มีการพัฒนาอยู่เรื่อยๆ การอัปเดตไบนารีที่สร้างไว้ล่วงหน้า ต้องใช้ความพยายามอย่างมาก ใน Android 9 หรือเวอร์ชันก่อนหน้า ไบนารีที่สร้างไว้ล่วงหน้าซึ่งขึ้นอยู่กับไลบรารีหรือ ABI ที่นำออกไปเท่านั้น จะลิงก์ไม่สำเร็จในรันไทม์ นักพัฒนาแอปต้องติดตามบันทึกเพื่อค้นหาไบนารีที่สร้างไว้ล่วงหน้าที่ล้าสมัย ใน Android 10 เราได้เปิดตัวเครื่องมือตรวจสอบการใช้งาน ABI ที่อิงตามสัญลักษณ์ เครื่องมือตรวจสอบจะตรวจหาไบนารีที่สร้างไว้ล่วงหน้าที่ล้าสมัยได้ ในเวลาบิลด์ เพื่อให้นักพัฒนาไลบรารีที่ใช้ร่วมกันทราบว่าไบนารีที่สร้างไว้ล่วงหน้าใดบ้าง ที่อาจใช้งานไม่ได้เนื่องจากการเปลี่ยนแปลง และไบนารีที่สร้างไว้ล่วงหน้าใดบ้างที่ต้อง สร้างใหม่
เครื่องมือตรวจสอบการใช้งาน ABI ที่อิงตามสัญลักษณ์
เครื่องมือตรวจสอบการใช้งาน ABI ที่อิงตามสัญลักษณ์จะจำลองโปรแกรมลิงก์แบบไดนามิกของ Android ในโฮสต์ เครื่องมือตรวจสอบจะลิงก์ไบนารีที่สร้างไว้ล่วงหน้ากับทรัพยากร Dependency ของไบนารีที่สร้างไว้ล่วงหน้า และตรวจสอบว่ามีการแก้ไขสัญลักษณ์ที่ไม่ได้กำหนดทั้งหมดแล้วหรือไม่
ก่อนอื่น ตัวตรวจสอบจะตรวจสอบสถาปัตยกรรมเป้าหมายของไบนารีที่สร้างไว้ล่วงหน้า หาก ไบนารีที่สร้างไว้ล่วงหน้าไม่ได้กำหนดเป้าหมายสถาปัตยกรรม ARM, AArch64, x86 หรือ x86-64 เครื่องมือตรวจสอบจะข้ามไบนารีที่สร้างไว้ล่วงหน้า
ประการที่สอง ต้องแสดงรายการทรัพยากร Dependency ของไบนารีที่สร้างไว้ล่วงหน้าใน
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>