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