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

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