ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมาย 2 รายการ 32 บิตและ 64 บิต ในบิลด์เดียวกัน การสร้างที่มี 2 เป้าหมายนี้เรียกว่าการสร้างแบบ Multilib
สำหรับไลบรารีแบบคงที่และไลบรารีที่ใช้ร่วมกันในตัว ระบบบิลด์จะตั้งค่า
กฎเพื่อสร้างไบนารีสำหรับทั้ง 2 สถาปัตยกรรม การกำหนดค่าผลิตภัณฑ์
(PRODUCT_PACKAGES) พร้อมกับกราฟการขึ้นต่อกันจะเป็นตัวกำหนดว่า
ไบนารีใดที่จะสร้างและติดตั้งในอิมเมจระบบ
สำหรับไฟล์ที่เรียกใช้งานได้และแอป ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 64 บิตโดยค่าเริ่มต้น แต่คุณสามารถลบล้างการตั้งค่านี้ได้ด้วยตัวแปรส่วนกลาง BoardConfig.mk หรือตัวแปรที่กำหนดขอบเขตของโมดูล
ระบุสถาปัตยกรรม CPU และ ABI ที่ 2
BoardConfig.mk มีตัวแปรต่อไปนี้เพื่อกำหนดค่าสถาปัตยกรรม CPU ที่ 2 และอินเทอร์เฟซแบบไบนารีของแอปพลิเคชัน (ABI)
TARGET_2ND_ARCHTARGET_2ND_ARCH_VARIANTTARGET_2ND_CPU_VARIANTTARGET_2ND_CPU_ABITARGET_2ND_CPU_ABI2
ดูตัวอย่าง Makefile ที่ใช้ตัวแปรเหล่านี้ได้ที่
build/make/target/board/generic_arm64/BoardConfig.mk
ในการสร้างแบบ Multilib ชื่อโมดูลใน PRODUCT_PACKAGES จะครอบคลุมทั้งไบนารี 32 บิตและ 64 บิต ตราบใดที่ระบบบิลด์กำหนดไว้ สำหรับไลบรารีที่รวมไว้โดยการอ้างอิง ระบบจะติดตั้งไลบรารี 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_WARNLOCAL_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,
ตัวแปรเหล่านี้จะมีผลก็ต่อเมื่อมีการสร้างไบนารีสำหรับสถาปัตยกรรมนั้น
บางครั้งการตั้งค่าสถานะจะง่ายกว่าหากพิจารณาว่าไบนารี
สร้างขึ้นสำหรับ 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
อย่างไรก็ตาม ในการสร้างแบบมัลติลิบ ให้ใช้ 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) จะชี้ไปยังไดเรกทอรีชั่วคราวเพียง 1 ใน 2 ไดเรกทอรี
ระบบบิลด์มีไดเรกทอรีกลางเฉพาะที่รองรับ Multilib
สำหรับการสร้างแหล่งที่มา หากต้องการดึงเส้นทางของไดเรกทอรี
กลาง ให้ใช้มาโคร
$(local-generated-sources-dir) หรือ
$(generated-sources-dir-for) การใช้มาโครเหล่านี้คล้ายกับ
$(local-intermediates-dir) และ $(intermediates-dir-for)
หากสร้างไฟล์ต้นฉบับไปยังไดเรกทอรีเฉพาะนี้และLOCAL_GENERATED_SOURCESเลือกไฟล์ดังกล่าว ระบบจะสร้างไฟล์สำหรับทั้ง 32 บิตและ 64 บิต
ในการสร้างแบบ 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 บิต แฟล็กดังกล่าวจะบอกให้ระบบบิลด์รวมไลบรารีเหล่านั้นด้วย