การกำหนดค่า ART

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

หน้านี้อธิบายวิธีกำหนดค่า ART และตัวเลือกการรวบรวม หัวข้อที่กล่าวถึงในที่นี้รวมถึงการกำหนดค่าการคอมไพล์ล่วงหน้าของอิมเมจระบบ ตัวเลือกการคอมไพล์ dex2oat และวิธีแลกเปลี่ยนพื้นที่พาร์ติชั่นระบบ พื้นที่พาร์ติชั่นข้อมูล และประสิทธิภาพ

ดู ART และ Dalvik รูปแบบ Dalvik Executable และหน้าที่เหลือบน source.android.com เพื่อทำงานกับ ART ดู การตรวจสอบการทำงานของแอปบนรันไทม์ Android (ART) เพื่อให้แน่ใจว่าแอปของคุณทำงานอย่างถูกต้อง

ART ทำงานอย่างไร

ART ใช้การคอมไพล์ล่วงหน้า (AOT) และเริ่มต้นใน Android 7.0 (Nougat หรือ N) จะใช้การผสมผสานแบบไฮบริดของ AOT การคอมไพล์แบบทันเวลาพอดี (JIT) และการรวบรวมโปรไฟล์ที่แนะนำ การรวมกันของโหมดการคอมไพล์เหล่านี้สามารถกำหนดค่าได้ และจะกล่าวถึงในส่วนนี้ ตัวอย่างเช่น อุปกรณ์ Pixel ได้รับการกำหนดค่าด้วยโฟลว์การรวบรวมต่อไปนี้:

  1. เริ่มการติดตั้งแอปพลิเคชันโดยไม่มีการคอมไพล์ AOT ใดๆ สองสามครั้งแรกที่แอปพลิเคชันรัน แอปพลิเคชันจะถูกตีความ และเมธอดที่เรียกใช้งานบ่อย ๆ จะถูกคอมไพล์ด้วย JIT
  2. เมื่ออุปกรณ์ไม่ได้ใช้งานและกำลังชาร์จ daemon การคอมไพล์จะรันไปยังโค้ดที่ใช้บ่อยของ AOT ที่คอมไพล์ตามโปรไฟล์ที่สร้างขึ้นระหว่างการรันครั้งแรก
  3. การรีสตาร์ทแอปพลิเคชันครั้งถัดไปจะใช้โค้ดที่แนะนำสำหรับโปรไฟล์และหลีกเลี่ยงการคอมไพล์ JIT ที่รันไทม์สำหรับวิธีการที่คอมไพล์แล้ว เมธอดที่ได้รับการคอมไพล์ JIT ระหว่างการรันใหม่จะถูกเพิ่มในโปรไฟล์ ซึ่งจะถูกเลือกโดย daemon การคอมไพล์

ART ประกอบด้วยคอมไพเลอร์ (เครื่องมือ dex2oat ) และรันไทม์ ( libart.so ) ที่โหลดสำหรับการเริ่มต้นไซโกต เครื่องมือ dex2oat ใช้ไฟล์ APK และสร้างไฟล์อาร์ติแฟกต์การคอมไพล์ตั้งแต่หนึ่งไฟล์ขึ้นไปที่รันไทม์โหลด จำนวนไฟล์ นามสกุล และชื่อสามารถเปลี่ยนแปลงได้ในทุกรุ่น แต่ในรุ่น Android 8 ไฟล์ที่สร้างขึ้นมีดังนี้:

  • .vdex : มีโค้ด DEX ที่ไม่บีบอัดของ APK พร้อมด้วยข้อมูลเมตาเพิ่มเติมเพื่อเพิ่มความเร็วในการตรวจสอบ
  • .odex : มีโค้ด AOT ที่คอมไพล์แล้วสำหรับเมธอดใน APK
  • .art (optional) : มีการแสดงแทนภายใน ART ของสตริงและคลาสบางรายการที่ระบุไว้ใน APK ซึ่งใช้เพื่อเพิ่มความเร็วในการเริ่มต้นแอปพลิเคชัน

ตัวเลือกการรวบรวม

ตัวเลือกการรวบรวมสำหรับ ART มีสองประเภท:

  1. การกำหนดค่า ROM ของระบบ: รหัสใดที่ได้รับการคอมไพล์ AOT เมื่อสร้างอิมเมจระบบ
  2. การกำหนดค่ารันไทม์: วิธีที่ ART รวบรวมและเรียกใช้แอปพลิเคชันบนอุปกรณ์

หนึ่งตัวเลือก ART หลักในการกำหนดค่าสองหมวดหมู่นี้คือ ตัวกรองคอมไพเลอร์ ตัวกรองคอมไพเลอร์ขับเคลื่อนวิธีที่ ART รวบรวมโค้ด DEX และเป็นตัวเลือกที่ส่งผ่านไปยังเครื่องมือ dex2oat เริ่มต้นใน Android 8 มีตัวกรองที่รองรับอย่างเป็นทางการสี่ตัว:

  • verify : เรียกใช้การตรวจสอบรหัส DEX เท่านั้น
  • quicken : (ลบออกตั้งแต่ Android 12) เรียกใช้การตรวจสอบรหัส DEX และปรับคำแนะนำ DEX ให้เหมาะสมเพื่อให้ได้ประสิทธิภาพล่ามที่ดีขึ้น
  • speed : เรียกใช้การตรวจสอบรหัส DEX และรวบรวมวิธีการทั้งหมด AOT
  • speed-profile : เรียกใช้การตรวจสอบโค้ด DEX และวิธีคอมไพล์ AOT ที่ระบุไว้ในไฟล์โปรไฟล์

การกำหนดค่า ROM ระบบ

มีตัวเลือกบิลด์ ART มากมายสำหรับการกำหนดค่า ROM ของระบบ วิธีกำหนดค่าตัวเลือกเหล่านี้ขึ้นอยู่กับพื้นที่จัดเก็บที่พร้อมใช้งานสำหรับอิมเมจระบบและจำนวนแอปพลิเคชันที่ติดตั้งไว้ล่วงหน้า JAR/APK ที่คอมไพล์เป็น ROM ของระบบสามารถแบ่งออกเป็นสี่ประเภท:

  • รหัสบูตคลาสพาธ: คอมไพล์ด้วยตัวกรองคอมไพเลอร์ speed-profile โดยค่าเริ่มต้น
  • รหัสเซิร์ฟเวอร์ระบบ (โปรดดู PRODUCT_SYSTEM_SERVER_JARS , PRODUCT_APEX_SYSTEM_SERVER_JARS , PRODUCT_STANDALONE_SYSTEM_SERVER_JARS , PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS ภายหลังในเอกสารนี้):
    • (ตั้งแต่ Android 14 (รุ่นทดลอง AOSP)) ที่คอมไพล์ด้วยตัวกรองคอมไพเลอร์ speed-profile โดยค่าเริ่มต้น หรือคอมไพล์ด้วยตัวกรองคอมไพเลอร์ speed หากไม่มีโปรไฟล์
    • (จนถึง Android 13) ที่คอมไพล์ด้วยตัวกรอง speed คอมไพเลอร์โดยค่าเริ่มต้น
    กำหนดค่าได้ผ่าน PRODUCT_SYSTEM_SERVER_COMPILER_FILTER (ดูภายหลังในเอกสารนี้)
  • แอปพลิเคชันหลักเฉพาะผลิตภัณฑ์ (โปรดดู PRODUCT_DEXPREOPT_SPEED_APPS ภายหลังในเอกสารนี้): คอมไพล์ด้วยตัวกรอง speed คอมไพเลอร์โดยค่าเริ่มต้น
  • แอปพลิเคชันอื่นๆ ทั้งหมด: คอมไพล์ด้วยตัวกรองคอมไพเลอร์ speed-profile โดยค่าเริ่มต้น หรือคอมไพล์ด้วยตัวกรอง verify คอมไพเลอร์หากไม่มีโปรไฟล์

    กำหนดค่าได้ผ่าน PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (ดูภายหลังในเอกสารนี้)

Makefile ตัวเลือก

  • WITH_DEXPREOPT
  • กำหนดว่า dex2oat ถูกเรียกใช้บนโค้ด DEX ที่ติดตั้งบนอิมเมจระบบหรือไม่ เปิดใช้งานโดยค่าเริ่มต้น

  • DONT_DEXPREOPT_PREBUILTS (ตั้งแต่ Android 5)
  • การเปิดใช้งาน DONT_DEXPREOPT_PREBUILTS จะป้องกันการสร้างล่วงหน้าจากการเพิ่มประสิทธิภาพล่วงหน้า นี่คือแอปที่มี include $(BUILD_PREBUILT) ระบุไว้ใน Android.mk การข้ามการปรับแต่งล่วงหน้าของแอปที่สร้างไว้ล่วงหน้าซึ่งมีแนวโน้มว่าจะอัปเดตผ่าน Google Play ช่วยประหยัดพื้นที่ในอิมเมจระบบ แต่จะเพิ่มเวลาในการบู๊ตครั้งแรก โปรดทราบว่าตัวเลือกนี้ไม่มีผลกับแอปที่สร้างไว้ล่วงหน้าที่กำหนดไว้ใน Android.bp

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (ตั้งแต่ Android 9)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER ระบุตัวกรองคอมไพเลอร์เริ่มต้นสำหรับแอปพลิเคชันที่ปรับให้เหมาะสมล่วงหน้า แอพเหล่านี้ถูกกำหนดใน Android.bp หรือ include $(BUILD_PREBUILT) ที่ระบุใน Android.mk หากไม่ระบุ ค่าเริ่มต้นคือ speed-profile หรือ verify ว่าไม่มีการระบุค่าและไม่ได้ระบุโปรไฟล์

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (ใหม่ใน Android 8 MR1)
  • การเปิดใช้งาน WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY จะปรับให้เหมาะสมล่วงหน้าเฉพาะ boot classpath และ jars ของเซิร์ฟเวอร์ระบบ

  • LOCAL_DEX_PREOPT
  • นอกจากนี้ยังสามารถเปิดหรือปิดใช้งานการปรับให้เหมาะสมล่วงหน้าในแต่ละแอพโดยระบุตัวเลือก LOCAL_DEX_PREOPT ในคำจำกัดความของโมดูล ซึ่งจะมีประโยชน์สำหรับการปิดใช้งานการเพิ่มประสิทธิภาพล่วงหน้าของแอปที่อาจได้รับการอัปเดตจาก Google Play ทันที เนื่องจากการอัปเดตจะทำให้โค้ดที่ปรับให้เหมาะสมล่วงหน้าในอิมเมจระบบล้าสมัย สิ่งนี้ยังมีประโยชน์ในการประหยัดพื้นที่ในการอัพเกรด OTA เวอร์ชันหลัก เนื่องจากผู้ใช้อาจมีแอปเวอร์ชันใหม่กว่าในพาร์ติชั่นข้อมูลอยู่แล้ว

    LOCAL_DEX_PREOPT รองรับค่า 'จริง' หรือ 'เท็จ' เพื่อเปิดใช้งานหรือปิดใช้งานการปรับให้เหมาะสมล่วงหน้าตามลำดับ นอกจากนี้ ยังสามารถระบุ 'nostripping' ได้หากการเพิ่มประสิทธิภาพล่วงหน้าไม่ควรดึงไฟล์ classes.dex ออกจากไฟล์ APK หรือ JAR โดยปกติ ไฟล์นี้จะถูกถอดออกเนื่องจากไม่จำเป็นต้องใช้อีกต่อไปหลังจากการเพิ่มประสิทธิภาพล่วงหน้า แต่ตัวเลือกสุดท้ายนี้จำเป็นต่อการอนุญาตให้ลายเซ็น APK ของบุคคลที่สามยังคงใช้ได้

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • ส่งผ่านตัวเลือกไปยัง dex2oat เพื่อควบคุมวิธีการคอมไพล์อิมเมจสำหรับบูต สามารถใช้เพื่อระบุรายการคลาสรูปภาพที่กำหนดเอง รายการคลาสที่คอมไพล์ และตัวกรองคอมไพเลอร์

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • ส่งผ่านตัวเลือกไปยัง dex2oat เพื่อควบคุมวิธีการคอมไพล์ทุกอย่างนอกเหนือจากบูตอิมเมจ

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • ให้ความสามารถในการส่งผ่านตัวเลือก dex2oat สำหรับโมดูลเฉพาะและการกำหนดค่าผลิตภัณฑ์ มันถูกตั้งค่าในไฟล์ device.mk ของผลิตภัณฑ์โดย $(call add-product-dex-preopt-module-config,<modules>,<option>) โดยที่ <modules> คือรายชื่อ LOCAL_MODULE และ LOCAL_PACKAGE สำหรับ JAR และ APK ไฟล์ ตามลำดับ

  • PRODUCT_DEXPREOPT_SPEED_APPS (New in Android 8)
  • รายการแอปพลิเคชันที่ได้รับการระบุว่าเป็นแกนหลักของผลิตภัณฑ์และควรคอมไพล์ด้วยตัวกรอง speed คอมไพเลอร์ ตัวอย่างเช่น แอปแบบถาวร เช่น SystemUI จะได้รับโอกาสในการใช้การคอมไพล์แบบแนะนำโปรไฟล์ในการรีบูตครั้งถัดไปเท่านั้น ดังนั้นผลิตภัณฑ์อาจมีการคอมไพล์แอปเหล่านี้โดย AOT เสมอ

  • PRODUCT_SYSTEM_SERVER_APPS (New in Android 8)
  • รายการแอปพลิเคชันที่โหลดโดยเซิร์ฟเวอร์ระบบ แอปพลิเคชันเหล่านี้ถูกคอมไพล์ตามค่าเริ่มต้นด้วยตัวกรองคอมไพเลอร์ speed

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Post Android 8)
  • จะรวม ART เวอร์ชันดีบักบนอุปกรณ์หรือไม่ โดยค่าเริ่มต้น สิ่งนี้จะเปิดใช้งานสำหรับ userdebug และ eng builds ลักษณะการทำงานสามารถถูกแทนที่โดยการตั้งค่าตัวเลือก true หรือ false อย่างชัดเจน

    โดยค่าเริ่มต้น อุปกรณ์จะใช้เวอร์ชันที่ไม่มีการแก้ไขข้อบกพร่อง ( libart.so ) หากต้องการสลับ ให้ตั้งค่าคุณสมบัติของระบบ libartd.so เป็น persist.sys.dalvik.vm.lib.2

  • WITH_DEXPREOPT_PIC (Removed in Android 8)
  • ใน Android 5.1.0 ถึง Android 6.0.1 สามารถระบุ WITH_DEXPREOPT_PIC เพื่อเปิดใช้งานโค้ดที่ไม่ขึ้นกับตำแหน่ง (PIC) ด้วยเหตุนี้ โค้ดที่คอมไพล์จากอิมเมจจึงไม่จำเป็นต้องย้ายจาก /system ไปที่ /data/dalvik-cache ซึ่งช่วยประหยัดพื้นที่ในพาร์ติชั่นข้อมูล อย่างไรก็ตาม มีผลกระทบรันไทม์เล็กน้อยเนื่องจากปิดใช้งานการปรับให้เหมาะสมที่ใช้ประโยชน์จากโค้ดที่ขึ้นกับตำแหน่ง โดยทั่วไป อุปกรณ์ที่ต้องการประหยัดพื้นที่ใน /data ควรเปิดใช้งานการรวบรวม PIC

    ใน Android 7.0 การรวบรวม PIC ถูกเปิดใช้งานโดยค่าเริ่มต้น

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (ถูกลบใน Android 8 MR1)
  • อ็อพชันนี้ถูกแทนที่ด้วย WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY ที่ preopt เซิร์ฟเวอร์ระบบ jars

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • ตัวเลือกนี้ระบุตัวกรองคอมไพเลอร์สำหรับเซิร์ฟเวอร์ระบบ

    • (ตั้งแต่ Android 14 (รุ่นทดลอง AOSP)) หากไม่ระบุ ระบบจะใช้ตัวกรองคอมไพเลอร์ speed-profile speed หรือใช้ตัวกรองคอมไพเลอร์ความเร็วหากไม่มีโปรไฟล์
    • (จนถึง Android 13) หากไม่ระบุ จะใช้ตัวกรอง speed คอมไพเลอร์
    • หากตั้งค่าเป็น speed จะใช้ตัวกรองคอมไพเลอร์ speed
    • หากตั้งค่าเป็น speed-profile speed-profile หรือใช้ตัวกรอง verify คอมไพเลอร์หากไม่มีโปรไฟล์
    • หากตั้งค่าเป็น Verify จะใช้ตัวกรอง verify verify คอมไพเลอร์

  • PRODUCT_SYSTEM_SERVER_JARS , PRODUCT_APEX_SYSTEM_SERVER_JARS , PRODUCT_STANDALONE_SYSTEM_SERVER_JARS , PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
  • ต่อไปนี้คือรายการของ jar ที่โหลดโดยเซิร์ฟเวอร์ระบบ jars ถูกคอมไพล์ด้วยตัวกรองคอมไพเลอร์ที่ระบุโดย PRODUCT_SYSTEM_SERVER_COMPILER_FILTER

    • (จำเป็น) PRODUCT_SYSTEM_SERVER_JARS : รายการ jars classpath ของเซิร์ฟเวอร์ระบบบนแพลตฟอร์ม (เช่น เป็นส่วนหนึ่งของ SYSTEMSERVERCLASSPATH ) จำเป็นต้องเพิ่ม jars classpath ของเซิร์ฟเวอร์ระบบลงในรายการนี้ ความล้มเหลวในการเพิ่ม classpath jars ของเซิร์ฟเวอร์ระบบไปยังรายการส่งผลให้ jars เหล่านั้นไม่ถูกโหลด
    • (จำเป็น) PRODUCT_APEX_SYSTEM_SERVER_JARS : รายการ jars classpath ของเซิร์ฟเวอร์ระบบที่ส่งผ่าน apex (เช่น เป็นส่วนหนึ่งของ SYSTEMSERVERCLASSPATH ) รูปแบบคือ <apex name>:<jar name> จำเป็นต้องเพิ่ม jars คลาสพาธของเซิร์ฟเวอร์ระบบ apex ลงในรายการนี้ ความล้มเหลวในการเพิ่ม jars คลาสพาธของเซิร์ฟเวอร์ระบบ apex ลงในรายการนี้ส่งผลให้ jar เหล่านั้นไม่ถูกโหลด
    • (เป็นทางเลือก ตั้งแต่ Android 13) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS : รายการ jars ที่เซิร์ฟเวอร์ระบบโหลดแบบไดนามิกโดยใช้ classloaders แยกกัน (ผ่าน SystemServiceManager.startServiceFromJar ) ไม่จำเป็นต้องเพิ่ม jars เซิร์ฟเวอร์ระบบแบบสแตนด์อโลนในรายการนี้ แต่ ขอ แนะนำอย่างยิ่ง เนื่องจากจะทำให้ jars ถูกคอมไพล์และดังนั้นจึงมีประสิทธิภาพรันไทม์ที่ดี
    • (จำเป็นตั้งแต่ Android 13) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS : รายการ jar ที่ส่งผ่าน apex ที่เซิร์ฟเวอร์ระบบโหลดแบบไดนามิกโดยใช้ classloaders แยกกัน (เช่น ผ่าน SystemServiceManager.startServiceFromJar หรือประกาศเป็น <apex-system-service> ) รูปแบบคือ <apex name>:<jar name> จำเป็นต้องเพิ่ม jars เซิร์ฟเวอร์ระบบ apex แบบสแตนด์อโลนในรายการนี้ ความล้มเหลวในการเพิ่ม jars เซิร์ฟเวอร์ระบบ apex แบบสแตนด์อโลนในรายการนี้ส่งผลให้บูตล้มเหลว

    การกำหนดค่าบูตคลาสพาธ

    • รายการชั้นเรียนที่โหลดไว้ล่วงหน้า
    • รายการคลาสที่โหลดไว้ล่วงหน้าเป็นรายการของคลาสที่ไซโกตเริ่มต้นเมื่อเริ่มทำงาน วิธีนี้จะช่วยประหยัดไม่ให้แต่ละแอปต้องเรียกใช้ตัวเริ่มต้นคลาสเหล่านี้แยกกัน ช่วยให้เริ่มต้นได้เร็วขึ้นและแชร์หน้าในหน่วยความจำ ไฟล์รายการคลาสที่โหลดไว้ล่วงหน้าจะอยู่ที่ frameworks/base/config/preloaded-classes โดยค่าเริ่มต้น และมีรายการที่ปรับแต่งสำหรับการใช้งานโทรศัพท์ทั่วไป อาจแตกต่างกันไปสำหรับอุปกรณ์อื่นๆ เช่น อุปกรณ์สวมใส่ และต้องได้รับการปรับแต่งตามนั้น ระวังเมื่อปรับแต่งสิ่งนี้ การเพิ่มคลาสมากเกินไปทำให้สูญเสียหน่วยความจำเมื่อโหลดคลาสที่ไม่ได้ใช้ การเพิ่มคลาสน้อยเกินไปทำให้แต่ละแอปต้องมีสำเนาของตัวเอง ซึ่งทำให้สูญเสียหน่วยความจำอีกครั้ง

      ตัวอย่างการใช้งาน (ใน device.mk ของผลิตภัณฑ์):

      PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
      

      หมายเหตุ: ต้องวางบรรทัดนี้ก่อนที่จะสืบทอด makefile การกำหนดค่าผลิตภัณฑ์ใดๆ ที่ได้รับค่าดีฟอลต์จาก: build/target/product/base.mk

    การกำหนดค่ารันไทม์

    จิตตัวเลือก

    ตัวเลือกต่อไปนี้มีผลกับรุ่น Android ที่มีคอมไพเลอร์ ART JIT เท่านั้น

    • dalvik.vm.usejit: เปิดใช้งาน JIT หรือไม่
    • dalvik.vm.jitinitialsize (ค่าเริ่มต้น 64K): ความจุเริ่มต้นของรหัสแคช แคชรหัสจะ GC เป็นประจำและเพิ่มขึ้นหากจำเป็น
    • dalvik.vm.jitmaxsize (ค่าเริ่มต้น 64M): ความจุสูงสุดของรหัสแคช
    • dalvik.vm.jitthreshold: (ค่าเริ่มต้น 10000) - นี่คือขีดจำกัดที่ตัวนับ "ความฮอต" ของเมธอดต้องผ่านเพื่อให้เมธอดถูกคอมไพล์ JIT ตัวนับ "hotness" เป็นเมตริกภายในรันไทม์ รวมถึงจำนวนการโทร สาขาย้อนหลัง และปัจจัยอื่นๆ
    • dalvik.vm.usejitprofiles: เปิดใช้งานโปรไฟล์ JIT หรือไม่ อาจใช้แม้ว่า dalvik.vm.usejit จะเป็นเท็จ โปรดทราบว่าหากเป็นเท็จ คอมไพเลอร์ฟิลเตอร์ speed-profile จะไม่คอมไพล์วิธีการใดๆ ของ AOT และเทียบเท่ากับการ verify .
    • dalvik.vm.jitprithreadweight (ค่าเริ่มต้นเป็น dalvik.vm.jitthreshold / 20) - น้ำหนักของ "ตัวอย่าง" ของ JIT (ดู jitthreshold) สำหรับเธรด UI ของแอปพลิเคชัน ใช้เพื่อเพิ่มความเร็วในการรวบรวมวิธีการที่ส่งผลโดยตรงต่อประสบการณ์ของผู้ใช้เมื่อโต้ตอบกับแอป
    • dalvik.vm.jittransitionweight: (ค่าเริ่มต้นเป็น dalvik.vm.jitthreshold / 10) น้ำหนักของการเรียกใช้เมธอดที่เปลี่ยนระหว่างคอมไพล์โค้ดและล่าม วิธีนี้ช่วยให้แน่ใจว่ามีการรวบรวมวิธีการที่เกี่ยวข้องเพื่อลดช่วงการเปลี่ยนภาพให้เหลือน้อยที่สุด (ซึ่งมีราคาแพง)

    ตัวเลือกตัวจัดการแพ็คเกจ

    ตั้งแต่ Android 7.0 เป็นต้นไป มีวิธีทั่วไปในการระบุระดับการรวบรวม/การตรวจสอบที่เกิดขึ้นในขั้นตอนต่างๆ ระดับการคอมไพล์สามารถกำหนดคอนฟิกได้ผ่านคุณสมบัติของระบบโดยค่าเริ่มต้นคือ:

    • pm.dexopt.install=speed-profile
    • นี่คือตัวกรองการรวบรวมที่ใช้เมื่อติดตั้งแอปพลิเคชันผ่าน Google Play เราขอแนะนำให้ตั้งค่าตัวกรองการติดตั้งเป็นโปรไฟล์ความเร็วเพื่อเปิดใช้งานการใช้โปรไฟล์จากไฟล์ข้อมูลเมตาของ dex โปรดทราบว่าหากไม่มีการระบุโปรไฟล์หรือไม่มีโปรไฟล์ความเร็วที่ว่างเปล่าจะเทียบเท่ากับการยืนยัน

    • pm.dexopt.bg-dexopt=speed-profile
    • นี่คือตัวกรองการรวบรวมที่ใช้เมื่อไม่ได้ใช้งานอุปกรณ์ กำลังชาร์จและชาร์จเต็ม ลองใช้ตัวกรองคอมไพเลอร์ speed-profile เพื่อใช้ประโยชน์จากการรวบรวมโปรไฟล์ที่แนะนำและประหยัดพื้นที่จัดเก็บ

    • pm.dexopt.boot-after-ota=verify
    • ตัวกรองการรวบรวมที่ใช้หลังจากการอัพเดตแบบ over-the-air เรา ขอ แนะนำอย่างยิ่งให้ verify ตัวกรองคอมไพเลอร์สำหรับตัวเลือกนี้เพื่อหลีกเลี่ยงเวลาในการบู๊ตที่นานมาก

    • pm.dexopt.first-boot=verify
    • ตัวกรองการรวบรวมเป็นครั้งแรกที่อุปกรณ์บู๊ต ตัวกรองที่ใช้ในที่นี้มีผลกับเวลาบูตหลังจากโรงงานเท่านั้น เราขอแนะนำให้ verify ตัวกรองเพื่อหลีกเลี่ยงเวลานานก่อนที่ผู้ใช้จะได้ใช้โทรศัพท์เป็นครั้งแรก โปรดทราบว่าหากแอปพลิเคชันทั้งหมดในอิมเมจระบบถูกคอมไพล์ด้วย verify , speed-profile หรือ speed ด้วยบริบทตัวโหลดคลาสที่ถูกต้อง pm.dexopt.first-boot จะไม่มีผลใดๆ

    ตัวเลือก Dex2oat

    โปรดทราบว่าตัวเลือกเหล่านี้ส่งผลต่อ dex2oat ในระหว่างการคอมไพล์บนอุปกรณ์และในระหว่างการปรับให้เหมาะสมล่วงหน้า ในขณะที่ตัวเลือกส่วนใหญ่ที่กล่าวถึงข้างต้นจะมีผลกับการปรับให้เหมาะสมล่วงหน้าเท่านั้น

    วิธีควบคุม dex2oat ขณะคอมไพล์อิมเมจสำหรับบูต:

    • dalvik.vm.image-dex2oat-Xms: ขนาดฮีปเริ่มต้น
    • dalvik.vm.image-dex2oat-Xmx: ขนาดฮีปสูงสุด
    • dalvik.vm.image-dex2oat-filter: ตัวเลือกตัวกรองคอมไพเลอร์
    • dalvik.vm.image-dex2oat-threads: จำนวนเธรดที่จะใช้

    วิธีควบคุม dex2oat ในขณะที่รวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

    • dalvik.vm.dex2oat-Xms: ขนาดฮีปเริ่มต้น
    • dalvik.vm.dex2oat-Xmx: ขนาดฮีปสูงสุด
    • dalvik.vm.dex2oat-filter: ตัวเลือกตัวกรองคอมไพเลอร์

    ในการเผยแพร่ผ่าน Android 6.0 มีตัวเลือกเพิ่มเติมหนึ่งตัวเลือกสำหรับการรวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

    • dalvik.vm.dex2oat-threads: จำนวนเธรดที่จะใช้

    เริ่มต้นด้วย Android 6.1 สิ่งนี้กลายเป็นสองตัวเลือกเพิ่มเติมสำหรับการรวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

    • dalvik.vm.boot-dex2oat-threads: จำนวนเธรดที่จะใช้ในช่วงเวลาบูต
    • dalvik.vm.dex2oat-threads: จำนวนเธรดที่จะใช้หลังจากเวลาบูต

    เริ่มต้นด้วย Android 7.1 มีสองตัวเลือกสำหรับควบคุมวิธีการใช้หน่วยความจำเมื่อรวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

    • dalvik.vm.dex2oat-very-large: ขนาดไฟล์ dex รวมขั้นต่ำเป็นไบต์เพื่อปิดใช้งานการคอมไพล์ AOT
    • dalvik.vm.dex2oat-swap: ใช้ไฟล์สลับ dex2oat (สำหรับอุปกรณ์หน่วยความจำต่ำ)

    อ็อพชันที่ควบคุมขนาดเริ่มต้นและขนาดฮีปสูงสุดสำหรับ dex2oat ไม่ควรลดลง เนื่องจากอาจจำกัดแอปพลิเคชันที่สามารถคอมไพล์ได้

    เริ่มต้นด้วย Android 11 มีตัวเลือกความสัมพันธ์ของ CPU สามตัวเพื่ออนุญาตให้เธรดของคอมไพเลอร์ถูกจำกัดเฉพาะกลุ่มของ CPU เฉพาะ:

    • dalvik.vm.boot-dex2oat-cpu-set: CPU ที่รันเธรด dex2oat ระหว่างเวลาบูต
    • dalvik.vm.image-dex2oat-cpu-set: CPU ที่รัน dex2oat ขณะคอมไพล์บูตอิมเมจ
    • dalvik.vm.dex2oat-cpu-set: CPU ที่รันเธรด dex2oat หลังจากเวลาบูต

    ควรระบุ CPU เป็นรายการรหัส CPU ที่คั่นด้วยเครื่องหมายจุลภาค ตัวอย่างเช่นหากต้องการรันบน dex2oat บน CPU 0-3 ให้ตั้งค่า:

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    

    เมื่อตั้งค่าคุณสมบัติความสัมพันธ์ของ CPU เราแนะนำให้จับคู่คุณสมบัติที่สอดคล้องกันสำหรับจำนวนของเธรด dex2oat เพื่อให้ตรงกับจำนวน CPU ที่เลือกเพื่อหลีกเลี่ยงหน่วยความจำที่ไม่จำเป็นและความขัดแย้งของ I/O:

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    dalvik.vm.dex2oat-threads=4
    

    เริ่มตั้งแต่ Android 12 เป็นต้นไป ตัวเลือกต่อไปนี้ถูกเพิ่มเข้ามา:

    • dalvik.vm.ps-min-first-save-ms: เวลาที่ต้องรอรันไทม์เพื่อสร้างโปรไฟล์ของแอปพลิเคชัน ในครั้งแรกที่แอปพลิเคชันเปิดตัว
    • dalvik.vm.ps-min-save-period-ms: เวลาต่ำสุดที่ต้องรอก่อนอัปเดตโปรไฟล์ของแอป
    • dalvik.vm.systemservercompilerfilter: ตัวกรองคอมไพเลอร์ที่อุปกรณ์ใช้เมื่อทำการคอมไพล์เซิร์ฟเวอร์ระบบใหม่

    การกำหนดค่าเฉพาะ A/B

    การกำหนดค่า ROM

    เริ่มต้นใน Android 7.0 อุปกรณ์อาจใช้พาร์ติชันระบบสองพาร์ติชันเพื่อเปิดใช้ งานการอัปเดตระบบ A/B หากต้องการบันทึกขนาดพาร์ติชั่นระบบ ไฟล์ที่เลือกไว้ล่วงหน้าสามารถติดตั้งในพาร์ติชั่นระบบที่สองที่ไม่ได้ใช้ จากนั้นจะถูกคัดลอกไปยังพาร์ติชั่นข้อมูลในการบู๊ตครั้งแรก

    ตัวอย่างการใช้งาน (ใน device-common.mk ):

    PRODUCT_PACKAGES += \
         cppreopts.sh
    PRODUCT_PROPERTY_OVERRIDES += \
         ro.cp_system_other_odex=1
    

    และใน BoardConfig.mk ของอุปกรณ์:

    BOARD_USES_SYSTEM_OTHER_ODEX := true
    

    โปรดทราบว่ารหัสบูตคลาสพาธ รหัสเซิร์ฟเวอร์ระบบ และแอปพลิเคชันหลักเฉพาะผลิตภัณฑ์จะคอมไพล์ไปยังพาร์ติชันระบบเสมอ โดยค่าเริ่มต้น แอปพลิเคชันอื่นๆ ทั้งหมดจะได้รับการคอมไพล์ไปยังพาร์ติชันระบบที่สองที่ไม่ได้ใช้ สามารถควบคุมได้ด้วย SYSTEM_OTHER_ODEX_FILTER ซึ่งมีค่าเป็นค่าเริ่มต้น:

    SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
    

    พื้นหลัง dexopt OTA

    ด้วยอุปกรณ์ที่เปิดใช้งาน A/B แอปพลิเคชันสามารถคอมไพล์ในพื้นหลังเพื่ออัปเดตเป็นอิมเมจระบบใหม่ ดู การคอมไพล์แอปในพื้นหลัง เพื่อเลือกรวมสคริปต์การคอมไพล์และไบนารีในอิมเมจระบบ ตัวกรองการคอมไพล์ที่ใช้สำหรับการคอมไพล์นี้ถูกควบคุมด้วย:

    pm.dexopt.ab-ota=speed-profile
    

    เราขอแนะนำให้ใช้ speed-profile เพื่อใช้ประโยชน์จากการรวบรวมโปรไฟล์ที่แนะนำและประหยัดพื้นที่จัดเก็บ