ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมาย 2 รายการ ได้แก่ 32 บิตและ 64 บิต ในบิลด์เดียวกัน บิลด์ 2 เป้าหมายนี้เรียกว่า บิลด์แบบหลายไลบรารี
สำหรับไลบรารีแบบคงที่และไลบรารีที่แชร์ในตัว ระบบบิลด์จะตั้งค่ากฎเพื่อสร้างไบนารีสำหรับสถาปัตยกรรมทั้ง 2 รายการ การกำหนดค่าผลิตภัณฑ์ (PRODUCT_PACKAGES) ร่วมกับกราฟทรัพยากร Dependency จะกำหนดว่าระบบจะสร้างและติดตั้งไบนารีใดลงในอิมเมจระบบ
สำหรับไฟล์ที่เรียกใช้งานได้และแอป ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 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
ในบิลด์แบบหลายไลบรารี ชื่อโมดูลใน 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_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,
ตั้งค่าเส้นทางการติดตั้งไลบรารี
สำหรับบิลด์ที่ไม่ใช่แบบหลายไลบรารี คุณสามารถใช้ 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- ระบุเส้นทางการติดตั้ง
รับไดเรกทอรีระดับกลางสำหรับไฟล์ต้นฉบับ
ในบิลด์แบบหลายไลบรารี หากคุณสร้างไฟล์ต้นฉบับไปยัง $(local-intermediates-dir) (หรือ $(intermediates-dir-for) ที่มีตัวแปรที่ชัดเจน) การดำเนินการนี้อาจไม่เสถียร เนื่องจากบิลด์ทั้ง 32 บิตและ 64 บิตต้องใช้แหล่งที่มาที่สร้างขึ้นระดับกลาง แต่ $(local-intermediates-dir) จะชี้ไปยังไดเรกทอรีระดับกลางเพียง 1 ใน 2 ไดเรกทอรี
ระบบบิลด์มีไดเรกทอรีระดับกลางที่เฉพาะเจาะจงและใช้งานได้กับหลายไลบรารีสำหรับการสร้างแหล่งที่มา หากต้องการดึงเส้นทางของไดเรกทอรีระดับกลาง ให้ใช้มาโคร $(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 บิตที่เกี่ยวข้องได้ แม้ว่าจะทำงานในบิลด์แบบหลายไลบรารี 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 บิต แฟล็กดังกล่าวจะบอกให้ระบบบิลด์รวมไลบรารีเหล่านั้นไว้ด้วย