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

ไลบรารีที่ใช้ร่วมกันของ 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