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

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