บิลด์สำหรับสถาปัตยกรรม 32 บิตและ 64 บิต

ระบบบิลด์รองรับการสร้างไบนารีสำหรับสถาปัตยกรรม CPU เป้าหมาย 2 รายการ 32 บิตและ 64 บิต ในบิลด์เดียวกัน การสร้างที่มี 2 เป้าหมายนี้เรียกว่าการสร้างแบบ Multilib

สำหรับไลบรารีแบบคงที่และไลบรารีที่ใช้ร่วมกันในตัว ระบบบิลด์จะตั้งค่า กฎเพื่อสร้างไบนารีสำหรับทั้ง 2 สถาปัตยกรรม การกำหนดค่าผลิตภัณฑ์ (PRODUCT_PACKAGES) พร้อมกับกราฟการขึ้นต่อกันจะเป็นตัวกำหนดว่า ไบนารีใดที่จะสร้างและติดตั้งในอิมเมจระบบ

สำหรับไฟล์ที่เรียกใช้งานได้และแอป ระบบบิลด์จะสร้างเฉพาะเวอร์ชัน 64 บิตโดยค่าเริ่มต้น แต่คุณสามารถลบล้างการตั้งค่านี้ได้ด้วยตัวแปรส่วนกลาง BoardConfig.mk หรือตัวแปรที่กำหนดขอบเขตของโมดูล

ระบุสถาปัตยกรรม CPU และ ABI ที่ 2

BoardConfig.mk มีตัวแปรต่อไปนี้เพื่อกำหนดค่าสถาปัตยกรรม CPU ที่ 2 และอินเทอร์เฟซแบบไบนารีของแอปพลิเคชัน (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 อยู่ในรายการนั้น ระบบบิลด์จะรวมโมดูลปัจจุบันไว้ด้วย

ตัวแปรทั้ง 2 นี้มีรูปแบบย่อยๆ ดังนี้

  • 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

อย่างไรก็ตาม ในการสร้างแบบมัลติลิบ ให้ใช้ 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 บิต แฟล็กดังกล่าวจะบอกให้ระบบบิลด์รวมไลบรารีเหล่านั้นด้วย