ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมายสองตัว (64 บิตและ 32 บิต) ในบิลด์เดียวกัน สิ่งนี้เรียกว่า multilib build
สำหรับไลบรารีสแตติกดั้งเดิมและไลบรารีที่ใช้ร่วมกัน ระบบบิลด์จะตั้งค่ากฎเพื่อสร้างไบนารีสำหรับสถาปัตยกรรมทั้งสอง การกำหนดค่าผลิตภัณฑ์ ( PRODUCT_PACKAGES
) ร่วมกับกราฟการพึ่งพา จะกำหนดไบนารีที่สร้างและติดตั้งลงในอิมเมจระบบ
สำหรับไฟล์เรียกทำงานและแอป ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 64 บิตตามค่าเริ่มต้น แต่คุณสามารถแทนที่การตั้งค่านี้ด้วยตัวแปร BoardConfig.mk
ส่วนกลางหรือตัวแปรที่มีขอบเขตของโมดูล
การกำหนดค่าผลิตภัณฑ์
BoardConfig.mk
มีตัวแปรต่อไปนี้เพื่อกำหนดค่าสถาปัตยกรรม CPU ที่สองและ ABI:
-
TARGET_2ND_ARCH
-
TARGET_2ND_ARCH_VARIANT
-
TARGET_2ND_CPU_VARIANT
-
TARGET_2ND_CPU_ABI
-
TARGET_2ND_CPU_ABI2
คุณสามารถดูตัวอย่างได้ใน build/target/board/generic_arm64/BoardConfig.mk
ในบิลด์ multilib ชื่อโมดูลใน PRODUCT_PACKAGES
ครอบคลุมทั้งไบนารี 32 บิตและ 64 บิต ตราบใดที่ระบบสร้างกำหนดไว้ สำหรับไลบรารีที่ดึงมาจากการพึ่งพา ไลบรารี 32 บิตจะถูกติดตั้งเฉพาะเมื่อไลบรารี 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
ส่วนกลาง
ตั้งค่า LOCAL_MULTILIB
เป็นค่าใดค่าหนึ่งต่อไปนี้:
-
"both"
สร้างทั้ง 32 บิตและ 64 บิต -
"32"
สร้างเพียง 32 บิต -
"64"
สร้างเพียง 64 บิต -
"first"
สร้างขึ้นสำหรับสถาปัตยกรรมแรกเท่านั้น (32 บิตในอุปกรณ์ 32 บิตและ 64 บิตในอุปกรณ์ 64 บิต) -
""
เป็นค่าเริ่มต้น ระบบบิลด์ตัดสินใจว่าจะสร้างสถาปัตยกรรมใดตามคลาสโมดูลและตัวแปร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
หากสถาปัตยกรรมที่ถูกสร้างขึ้น ไม่ อยู่ในรายการนั้น โมดูลปัจจุบันจะถูกรวมโดยระบบการสร้าง
มีตัวแปรย่อยของตัวแปรทั้งสองนี้:
-
LOCAL_MODULE_TARGET_ARCH_WARN
-
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN
ระบบบิลด์เตือนหากโมดูลปัจจุบันถูกข้ามเนื่องจากสถาปัตยกรรมที่แสดง
ในการตั้งค่าสถานะการสร้างสำหรับสถาปัตยกรรมเฉพาะ ให้ใช้ตัวแปร LOCAL_
เฉพาะสถาปัตยกรรม ตัวแปร LOCAL_
เฉพาะสถาปัตยกรรมคือตัวแปร 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
ในบิลด์ 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_2ND_ARCH
) เพื่อบอกระบบบิลด์ว่าสถาปัตยกรรมเป้าหมายไบนารีที่สร้างไว้ล่วงหน้าเป็นสถาปัตยกรรมใด ให้ใช้ตัวแปร LOCAL_
LOCAL_MODULE_TARGET_ARCH
หรือ LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
แทน
ด้วยตัวแปรเหล่านี้ ระบบบิลด์สามารถเลือกไบนารีที่สร้างไว้ล่วงหน้าแบบ 32 บิตที่สอดคล้องกัน แม้ว่าจะทำงานบนบิลด์ multilib 64 บิตก็ตาม
หากคุณต้องการใช้สถาปัตยกรรมที่เลือกในการคำนวณพาธต้นทางสำหรับไบนารีที่สร้างไว้ล่วงหน้า ให้เรียก $(get-prebuilt-src-arch)
การสร้างไฟล์ ODEX
สำหรับอุปกรณ์ 64 บิต โดยค่าเริ่มต้น เราจะสร้างไฟล์ ODEX ทั้งแบบ 32 บิตและ 64 บิตสำหรับอิมเมจสำหรับบูตและไลบรารี Java ใดๆ สำหรับ APK โดยค่าเริ่มต้น เราจะสร้าง ODEX สำหรับสถาปัตยกรรม 64 บิตหลักเท่านั้น หากแอปจะเปิดตัวในกระบวนการทั้งแบบ 32 บิตและ 64 บิต ให้ใช้ LOCAL_MULTILIB := both
เพื่อให้แน่ใจว่ามีการสร้างไฟล์ ODEX ทั้งแบบ 32 บิตและ 64 บิต หากแอปมีไลบรารี JNI แบบ 32 บิตหรือ 64 บิต แฟล็กนั้นจะบอกให้ระบบบิลด์รวมไว้ด้วย