ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมายสองตัว 32 บิตและ 64 บิตในบิลด์เดียวกัน โครงสร้างแบบสองเป้าหมายนี้เรียกว่า multilib build
สำหรับไลบรารีแบบคงที่ในตัวและไลบรารีแบบแบ่งใช้ ระบบบิลด์จะตั้งค่ากฎเพื่อสร้างไบนารีสำหรับสถาปัตยกรรมทั้งสอง การกำหนดค่าผลิตภัณฑ์ ( PRODUCT_PACKAGES
) ร่วมกับกราฟอ้างอิง จะกำหนดว่าไบนารีใดที่สร้างและติดตั้งให้กับอิมเมจระบบ
สำหรับโปรแกรมปฏิบัติการและแอพ ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 64 บิตตามค่าเริ่มต้น แต่คุณสามารถแทนที่การตั้งค่านี้ด้วยตัวแปร BoardConfig.mk
ส่วนกลางหรือตัวแปรที่กำหนดขอบเขตโมดูลได้
ระบุสถาปัตยกรรม CPU ตัวที่สองและ ABI
BoardConfig.mk
มีตัวแปรต่อไปนี้เพื่อกำหนดค่าสถาปัตยกรรม CPU ตัวที่สองและ application binary interface (ABI):
-
TARGET_2ND_ARCH
-
TARGET_2ND_ARCH_VARIANT
-
TARGET_2ND_CPU_VARIANT
-
TARGET_2ND_CPU_ABI
-
TARGET_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
อยู่ในรายการนั้น โมดูลปัจจุบันจะถูกรวมไว้ในระบบการสร้าง
มีตัวแปรรองของตัวแปรทั้งสองนี้:
-
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,
ตัวแปรเหล่านี้จะถูกนำมาใช้เฉพาะเมื่อมีการสร้างไบนารีสำหรับสถาปัตยกรรมนั้นเท่านั้น
บางครั้งการตั้งค่าสถานะจะง่ายกว่าโดยพิจารณาว่าไบนารี่ถูกสร้างขึ้นสำหรับ 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)
ชี้ไปที่ไดเร็กทอรีระดับกลางเพียง 1 ใน 2 ไดเร็กทอรีเท่านั้น
ระบบบิลด์จัดเตรียมไดเร็กทอรีระดับกลางที่เป็นมิตรกับหลายไลบรารีโดยเฉพาะสำหรับการสร้างซอร์ส หากต้องการดึงข้อมูลเส้นทางของไดเรกทอรีระดับกลาง ให้ใช้มาโคร $(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 บิตที่เกี่ยวข้องได้ แม้ว่าจะทำงานบนบิลด์ 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 บิต แฟล็กนั้นจะบอกให้ระบบบิลด์รวมไลบรารีเหล่านั้นด้วย