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

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

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

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

ระบุสถาปัตยกรรมและ ABI ของ CPU รายการที่ 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

ดูตัวอย่างไฟล์ Make ที่ใช้ตัวแปรเหล่านี้ได้ที่ build/make/target/board/generic_arm64/BoardConfig.mk

ในบิลด์แบบ Multilib ชื่อโมดูลใน 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_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,

ระบบจะใช้ตัวแปรเหล่านี้เมื่อมีการสร้างไบนารีสำหรับสิ่งนั้นเท่านั้น สถาปัตยกรรม

บางครั้งการตั้งค่า 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,

กำหนดเส้นทางการติดตั้งไลบรารี

สำหรับบิลด์ที่ไม่ใช่มัลติลิบ คุณใช้ 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 - ระบุเส้นทางการติดตั้ง

รับไดเรกทอรีกลางสำหรับไฟล์ต้นทาง

ในบิลด์มัลติลิบ หากคุณสร้างไฟล์ต้นฉบับเพื่อ $(local-intermediates-dir) (หรือ $(intermediates-dir-for) ด้วยตัวแปรที่ชัดเจน) ฟังก์ชันดังกล่าวจะทำงานไม่เสถียร นั่นเป็นเพราะทั้งบิลด์ 32 บิตและ 64 บิตต้องใช้แหล่งที่มาที่สร้างขึ้นระหว่างกลาง แต่ $(local-intermediates-dir) ชี้ไปยังไดเรกทอรีกลางเพียงแห่งเดียว

ระบบการสร้างนี้มอบโซลูชันแบบเฉพาะตัว ไดเรกทอรีกลางสำหรับสร้างแหล่งที่มา วิธีดึงข้อมูลตัวกลาง ให้ใช้ $(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 บิตที่สร้างไว้ล่วงหน้าที่เกี่ยวข้องได้ แม้ว่าจะทำงานกับบิลด์แบบ 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 บิต หากแอปใช้เวอร์ชัน 32 บิต หรือไลบรารี JNI 64 บิต Flag ดังกล่าวจะบอกให้ระบบบิลด์รวมไลบรารีดังกล่าวด้วย