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

ไลบรารีที่แชร์ของ 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 ที่บันทึกไว้ในไบนารีที่สร้างไว้ล่วงหน้า หากไม่ตรงกัน ระบบจะแสดงข้อความแสดงข้อผิดพลาด

ประการที่สี่คือโปรแกรมตรวจสอบจะแก้ไขสัญลักษณ์ที่ไม่รู้จักในไบนารีที่สร้างไว้ล่วงหน้า สัญลักษณ์ที่ไม่ระบุเหล่านั้นต้องกำหนดไว้ใน 1 ใน Dependency และการกำหนดสัญลักษณ์ต้องเป็น 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

เรียกใช้โปรแกรมตรวจสอบ

หากต้องการเรียกใช้โปรแกรมตรวจสอบ ให้ตั้งค่าตัวแปรสภาพแวดล้อม 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