ทำความเข้าใจบิลด์ 64 บิต

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