ไลบรารีที่ใช้ร่วมกันของ Android พัฒนาเป็นครั้งคราว การเก็บไบนารีที่สร้างไว้ล่วงหน้า การอัปเดตให้เป็นปัจจุบันต้องอาศัยความพยายามอย่างมาก ใน Android 9 หรือก่อนหน้า ไบนารีที่สร้างไว้ล่วงหน้าซึ่งขึ้นอยู่กับ ไลบรารีที่ถูกนำออกหรือ ABI เพียงไม่สามารถลิงก์ขณะรันไทม์ นักพัฒนาแอปต้อง ติดตามบันทึกเพื่อค้นหาไบนารีที่สร้างไว้ล่วงหน้าที่ล้าสมัย ใน Android 10 เปิดตัวเครื่องมือตรวจสอบการใช้งาน ABI ที่ใช้สัญลักษณ์ เครื่องมือตรวจสอบสามารถตรวจหาไบนารีที่สร้างไว้ล่วงหน้าที่ล้าสมัยในเวลาที่บิลด์ นักพัฒนาซอฟต์แวร์ไลบรารีสามารถทราบว่าไบนารีที่สร้างไว้ล่วงหน้าใดอาจถูกหักจาก เปลี่ยนแปลง และไบนารีที่สร้างไว้ล่วงหน้าใดที่ควรสร้างขึ้นใหม่
เครื่องมือตรวจสอบการใช้งาน ABI ที่ใช้สัญลักษณ์
เครื่องมือตรวจสอบการใช้งาน ABI ที่อิงตามสัญลักษณ์จะจำลอง Linker แบบไดนามิกของ 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
เรียกใช้เครื่องมือตรวจสอบ
หากต้องการเรียกใช้เครื่องมือตรวจสอบ ให้ตั้งค่าตัวแปรสภาพแวดล้อม
CHECK_ELF_FILES
ไปยัง true
และเรียกใช้
make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
หากต้องการเปิดใช้เครื่องมือตรวจสอบโดยค่าเริ่มต้น ให้เพิ่ม PRODUCT_CHECK_ELF_FILES
ถึง BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
สิ่งที่สร้างไว้ล่วงหน้าจะได้รับการตรวจสอบโดยอัตโนมัติระหว่างขั้นตอนการสร้าง Android
make