ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมาย 2 รายการ ได้แก่ 32 บิตและ 64 บิต ในบิลด์เดียวกัน บิลด์แบบ 2 เป้าหมายนี้เรียกว่าบิลด์ Multilib
สำหรับไลบรารีแบบคงที่และไลบรารีที่ใช้ร่วมกันในตัว ระบบการบิลด์จะตั้งค่ากฎเพื่อสร้างไบนารีสำหรับทั้ง 2 สถาปัตยกรรม การกําหนดค่าผลิตภัณฑ์ (PRODUCT_PACKAGES
) ร่วมกับกราฟ Dependency จะกําหนดว่าไฟล์ไบนารีใดจะสร้างขึ้นและติดตั้งลงในอิมเมจระบบ
สำหรับไฟล์ปฏิบัติการและแอป ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 64 บิตโดยค่าเริ่มต้น แต่คุณสามารถลบล้างการตั้งค่านี้ได้ด้วยตัวแปร BoardConfig.mk
ระดับส่วนกลางหรือตัวแปรระดับโมดูล
ระบุสถาปัตยกรรมและ ABI ของ CPU รายการที่ 2
BoardConfig.mk
มีตัวแปรต่อไปนี้เพื่อกำหนดค่าสถาปัตยกรรม CPU และอินเทอร์เฟซแบบไบนารีของแอปพลิเคชัน (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 บิต ตราบใดที่ระบบบิลด์กำหนดไว้ สำหรับไลบรารีที่รวมอยู่ในการพึ่งพา ระบบจะติดตั้งไลบรารี 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_*
instead
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 บิต หากแอปมีไลบรารี JNI 32 บิตหรือ 64 บิต FLAG ดังกล่าวจะบอกให้ระบบบิลด์รวมไลบรารีเหล่านั้นด้วย