ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมาย 2 แบบ 32 บิตและ 64 บิตอยู่ในบิลด์เดียวกัน บิลด์แบบ 2 เป้าหมายนี้เรียกว่าบิลด์ Multilib
สำหรับไลบรารีแบบคงที่และไลบรารีที่ใช้ร่วมกันในตัว ระบบการบิลด์จะตั้งค่ากฎเพื่อสร้างไบนารีสำหรับทั้ง 2 สถาปัตยกรรม การกําหนดค่าผลิตภัณฑ์ (PRODUCT_PACKAGES
) ร่วมกับกราฟ Dependency จะกําหนดว่าไฟล์ไบนารีใดจะสร้างขึ้นและติดตั้งลงในอิมเมจระบบ
สำหรับไฟล์สั่งการและแอป ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 64 บิตโดย
ค่าเริ่มต้น แต่คุณสามารถลบล้างการตั้งค่านี้ด้วย
BoardConfig.mk
ตัวแปรหรือตัวแปรระดับโมดูล
ระบุสถาปัตยกรรมและ ABI ของ CPU รายการที่ 2
BoardConfig.mk
มีตัวแปรต่อไปนี้เพื่อกำหนดค่า CPU ตัวที่ 2
อินเทอร์เฟซแบบไบนารีของแอปพลิเคชัน (ABI):
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
ระบบบิลด์จะเตือนหากโมดูลปัจจุบันถูกข้ามเนื่องจาก สถาปัตยกรรมที่ระบุไว้
ในการตั้งค่าแฟล็กบิลด์สำหรับสถาปัตยกรรมหนึ่งๆ ให้ใช้
ตัวแปร 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,
กำหนดเส้นทางการติดตั้งไลบรารี
สำหรับบิลด์ที่ไม่ใช่มัลติลิบ คุณใช้ 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
- ระบุเส้นทางการติดตั้ง
รับไดเรกทอรีกลางสำหรับไฟล์ต้นทาง
ในบิลด์มัลติลิบ หากคุณสร้างไฟล์ต้นฉบับเพื่อ
$(local-intermediates-dir)
(หรือ $(intermediates-dir-for)
ด้วยตัวแปรที่ชัดเจน) ฟังก์ชันดังกล่าวจะทำงานไม่เสถียร นั่นเป็นเพราะทั้งบิลด์ 32 บิตและ 64 บิตต้องใช้แหล่งที่มาที่สร้างขึ้นระหว่างกลาง แต่ $(local-intermediates-dir)
ชี้ไปยังไดเรกทอรีกลางเพียงแห่งเดียว
ระบบการสร้างนี้มอบโซลูชันแบบเฉพาะตัว
ไดเรกทอรีกลางสำหรับสร้างแหล่งที่มา วิธีดึงข้อมูลตัวกลาง
ให้ใช้
$(local-generated-sources-dir)
หรือ
$(generated-sources-dir-for)
การใช้งานมาโครเหล่านี้คล้ายกับ
$(local-intermediates-dir)
และ $(intermediates-dir-for)
หากมีการสร้างไฟล์ต้นฉบับให้กับไดเรกทอรีเฉพาะนี้และเลือก
โดย LOCAL_GENERATED_SOURCES
ผลิตภัณฑ์นี้สร้างขึ้นสำหรับทั้ง 32 บิตและ 64 บิต
ในบิลด์มัลติลิบ
ระบุสถาปัตยกรรมระบบของเป้าหมายไบนารีที่สร้างไว้ล่วงหน้า
ในบิลด์แบบหลายลิบ คุณไม่สามารถใช้ TARGET_ARCH
หรือ TARGET_ARCH
ร่วมกับ
TARGET_2ND_ARCH
เพื่อบ่งบอกสถาปัตยกรรมของระบบที่สร้างไว้ล่วงหน้า
เป้าหมายแบบไบนารี แต่ให้ใช้ตัวแปร LOCAL_*
แทน
LOCAL_MODULE_TARGET_ARCH
หรือ
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
เมื่อใช้ตัวแปรเหล่านี้ ระบบการสร้างจะเลือกไบนารีแบบ 32 บิตที่สร้างไว้ล่วงหน้าที่เกี่ยวข้องได้ แม้ว่าจะทำงานกับบิลด์แบบ Multilib 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 บิต หากแอปใช้เวอร์ชัน 32 บิต
หรือไลบรารี JNI 64 บิต Flag ดังกล่าวจะบอกให้ระบบบิลด์รวมไลบรารีดังกล่าวด้วย