สร้างมาเพื่อสถาปัตยกรรม 32 บิตและ 64 บิต

ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมาย 2 รายการ ได้แก่ 32 บิตและ 64 บิต ในบิลด์เดียวกัน บิลด์แบบ 2 เป้าหมายนี้เรียกว่าบิลด์ Multilib

สำหรับไลบรารีแบบคงที่และไลบรารีที่ใช้ร่วมกันในตัว ระบบการบิลด์จะตั้งค่ากฎเพื่อสร้างไบนารีสำหรับทั้ง 2 สถาปัตยกรรม การกําหนดค่าผลิตภัณฑ์ (PRODUCT_PACKAGES) ร่วมกับกราฟ Dependency จะกําหนดว่าไฟล์ไบนารีใดจะสร้างขึ้นและติดตั้งลงในอิมเมจระบบ

สำหรับไฟล์ปฏิบัติการและแอป ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 64 บิตโดยค่าเริ่มต้น แต่คุณสามารถลบล้างการตั้งค่านี้ได้ด้วยตัวแปร BoardConfig.mk ระดับส่วนกลางหรือตัวแปรระดับโมดูล

ระบุสถาปัตยกรรมและ ABI ของ CPU รายการที่ 2

BoardConfig.mk มีตัวแปรต่อไปนี้เพื่อกำหนดค่าสถาปัตยกรรม CPU และอินเทอร์เฟซแบบไบนารีของแอปพลิเคชัน (ABI) ตัวที่ 2

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

ดูตัวอย่างไฟล์ Make ที่ใช้ตัวแปรเหล่านี้ได้ที่ build/make/target/board/generic_arm64/BoardConfig.mk

ในบิลด์แบบ Multilib ชื่อโมดูลใน PRODUCT_PACKAGES จะครอบคลุมทั้งไบนารี 32 บิตและ 64 บิต ตราบใดที่ระบบบิลด์กำหนดไว้ สำหรับไลบรารีที่รวมตามทรัพยากร Dependency จะติดตั้งไลบรารี 32 บิตหรือ 64 บิตเฉพาะในกรณีที่จำเป็นสำหรับไลบรารี 32 บิตหรือ 64 บิตอื่นหรือไฟล์ปฏิบัติการ

อย่างไรก็ตาม ชื่อโมดูลในบรรทัดคำสั่ง make จะครอบคลุมเฉพาะเวอร์ชัน 64 บิตเท่านั้น เช่น หลังจากเรียกใช้ lunch aosp_arm64-eng แล้ว make libc จะสร้างเฉพาะ libc แบบ 64 บิต หากต้องการรวบรวม libc แบบ 32 บิต คุณต้องเรียกใช้ make libc_32

กำหนดสถาปัตยกรรมของโมดูลใน Android.mk

คุณสามารถใช้ตัวแปร LOCAL_MULTILIB เพื่อกําหนดค่าบิลด์สําหรับ 32 บิตและ 64 บิต และลบล้างตัวแปร TARGET_PREFER_32_BIT ระดับส่วนกลางได้

หากต้องการลบล้าง TARGET_PREFER_32_BIT ให้ตั้งค่า LOCAL_MULTILIB เป็นค่าใดค่าหนึ่งต่อไปนี้

  • both สามารถสร้างทั้ง 32 บิตและ 64 บิต
  • 32 บิลด์ 32 บิตเท่านั้น
  • 64 บิลด์ 64 บิตเท่านั้น
  • first จะคอมไพล์สำหรับสถาปัตยกรรมแรกเท่านั้น (32 บิตในอุปกรณ์ 32 บิต และ 64 บิตในอุปกรณ์ 64 บิต)

โดยค่าเริ่มต้น ระบบจะไม่ตั้งค่า LOCAL_MULTILIB และระบบบิลด์จะตัดสินใจว่าจะใช้สถาปัตยกรรมใดในการสร้างโดยอิงตามคลาสโมดูลและตัวแปร LOCAL_* อื่นๆ เช่น LOCAL_MODULE_TARGET_ARCH และ LOCAL_32_BIT_ONLY

หากต้องการสร้างโมดูลสำหรับสถาปัตยกรรมที่เฉพาะเจาะจง ให้ใช้ตัวแปรต่อไปนี้

  • LOCAL_MODULE_TARGET_ARCH - ตั้งค่าตัวแปรนี้เป็นรายการสถาปัตยกรรม เช่น arm x86 arm64 หากสถาปัตยกรรมที่สร้างอยู่ในรายการดังกล่าว ระบบจะรวมโมดูลปัจจุบันไว้ในบิลด์

  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH - ตัวแปรนี้ตรงข้ามกับ LOCAL_MODULE_TARGET_ARCH หากสถาปัตยกรรมที่กำลังสร้างคือ not ในรายการดังกล่าว แสดงว่าระบบบิลด์ได้รวมโมดูลปัจจุบันไว้

ตัวแปรทั้ง 2 ตัวมีตัวแปรย่อยๆ ต่อไปนี้

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

ระบบบิลด์จะเตือนหากข้ามข้อบังคับปัจจุบันเนื่องจากสถาปัตยกรรมที่ระบุไว้

หากต้องการตั้งค่า Flag การสร้างสําหรับสถาปัตยกรรมหนึ่งๆ ให้ใช้ตัวแปร LOCAL_* ที่เจาะจงสถาปัตยกรรม โดยที่ * คือส่วนต่อท้ายที่เจาะจงสถาปัตยกรรม เช่น

  • LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,
  • LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,
  • LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,

ตัวแปรเหล่านี้จะมีผลก็ต่อเมื่อมีการสร้างไบนารีสําหรับสถาปัตยกรรมนั้นเท่านั้น

บางครั้งการตั้งค่า Flag นั้นง่ายกว่าในการพิจารณาว่าไบนารีนั้นสร้างมาสำหรับ 32 บิตหรือ 64 บิต ใช้ตัวแปร LOCAL_* ที่มีส่วนต่อท้าย _32 หรือ _64 เช่น

  • LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
  • LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
  • LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,

กำหนดเส้นทางการติดตั้งไลบรารี

สำหรับบิลด์ที่ไม่ใช่ Multilib คุณสามารถใช้ LOCAL_MODULE_PATH เพื่อติดตั้งไลบรารีในที่ที่ไม่ใช่ตำแหน่งเริ่มต้นได้ เช่น LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

อย่างไรก็ตาม ในบิลด์แบบ Multilib ให้ใช้ LOCAL_MODULE_RELATIVE_PATH แทน

LOCAL_MODULE_RELATIVE_PATH := hw

รูปแบบนี้จะติดตั้งทั้งไลบรารี 64 บิตและ 32 บิตไว้ในตำแหน่งที่ถูกต้อง

หากคุณสร้างไฟล์ปฏิบัติการเป็นทั้ง 32 บิตและ 64 บิต ให้ใช้ตัวแปรตัวใดตัวหนึ่งต่อไปนี้เพื่อแยกเส้นทางการติดตั้ง

  • LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64 - ระบุชื่อไฟล์ที่ติดตั้ง
  • LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64 - ระบุเส้นทางการติดตั้ง

รับไดเรกทอรีกลางสำหรับไฟล์ต้นทาง

ในบิลด์แบบ Multilib หากคุณสร้างไฟล์ต้นฉบับเป็น $(local-intermediates-dir) (หรือ $(intermediates-dir-for) ที่มีตัวแปรที่ชัดเจน) ไฟล์ดังกล่าวจะทำงานอย่างไม่เสถียร นั่นเป็นเพราะทั้งบิลด์ 32 บิตและ 64 บิตต้องใช้แหล่งที่มาที่สร้างขึ้นระหว่างกลาง แต่ $(local-intermediates-dir) ชี้ไปยังไดเรกทอรีกลางเพียงแห่งเดียว

ระบบบิลด์มีไดเรกทอรีกลางที่รองรับ Multilib โดยเฉพาะสำหรับการสร้างแหล่งที่มา หากต้องการดึงข้อมูลเส้นทางของไดเรกทอรีกลาง ให้ใช้มาโคร $(local-generated-sources-dir) หรือ $(generated-sources-dir-for) การใช้มาโครเหล่านี้คล้ายกับ $(local-intermediates-dir) และ $(intermediates-dir-for)

หากมีการสร้างไฟล์ต้นฉบับไปยังไดเรกทอรีเฉพาะนี้และLOCAL_GENERATED_SOURCESเลือกไฟล์นั้น ไฟล์ดังกล่าวจะสร้างขึ้นสำหรับทั้ง 32 บิตและ 64 บิตในบิลด์ Multilib

ระบุสถาปัตยกรรมของระบบเป้าหมายไบนารีที่สร้างไว้ล่วงหน้า

ในบิลด์แบบ Multilib คุณจะใช้ TARGET_ARCH หรือ TARGET_ARCH รวมกับ TARGET_2ND_ARCH เพื่อระบุสถาปัตยกรรมของระบบสำหรับเป้าหมายไบนารีที่สร้างไว้ล่วงหน้าไม่ได้ โปรดใช้ตัวแปร LOCAL_* LOCAL_MODULE_TARGET_ARCH หรือ LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH แทน

ด้วยตัวแปรเหล่านี้ ระบบบิลด์จะสามารถเลือกไบนารีที่สร้างไว้ล่วงหน้า 32 บิตที่สอดคล้องกัน แม้จะทำงานกับบิลด์แบบหลายลิบ 64 บิตก็ตาม

หากต้องการใช้สถาปัตยกรรมที่เลือกเพื่อคํานวณเส้นทางแหล่งที่มาสําหรับไบนารีที่สร้างไว้ล่วงหน้า ให้เรียกใช้ $(get-prebuilt-src-arch)

ตรวจสอบการสร้างไฟล์ ODEX 32 บิตและ 64 บิต

สําหรับอุปกรณ์ 64 บิต Google จะสร้างไฟล์ ODEX ทั้งแบบ 32 บิตและ 64 บิตโดยค่าเริ่มต้นสําหรับอิมเมจการบูตและไลบรารี Java สำหรับ APK โดยค่าเริ่มต้น Google จะสร้าง ODEX สำหรับสถาปัตยกรรมหลักแบบ 64 บิตเท่านั้น หากเปิดแอปทั้งในกระบวนการ 32 บิตและ 64 บิต ให้ใช้ LOCAL_MULTILIB := both เพื่อตรวจสอบว่ามีการสร้างไฟล์ ODEX ทั้ง 32 บิตและ 64 บิต หากแอปมีไลบรารี JNI แบบ 32 บิตหรือ 64 บิต Flag ดังกล่าวจะบอกให้ระบบบิลด์รวมไลบรารีดังกล่าวด้วย