กำหนดค่า ART

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

โปรดดู ART และ Dalvik และรูปแบบปฏิบัติการ Dalvik เพื่อทำงานกับ ART ดูการยืนยัน พฤติกรรมของแอปใน Android Runtime (ART) เพื่อดูแลให้แอปทำงานได้ อย่างเหมาะสม

วิธีการทำงานของ ART

ART ใช้การรวบรวมล่วงหน้า (AOT) และเริ่มตั้งแต่ Android 7 ใช้การผสมผสานระหว่างการรวบรวม AOT, การคอมไพล์แบบ Just-In-Time (JIT) และการตีความ และการรวบรวม AOT สามารถ ใช้อ้างอิงโปรไฟล์ได้ โหมดการดำเนินการทั้งหมดนี้รวมกันคือ กำหนดค่าได้ซึ่งจะอธิบายในส่วนนี้ เช่น อุปกรณ์ Pixel ได้รับการกำหนดค่าให้ จะทำงานในขั้นตอนต่อไปนี้

  1. ตอนแรกมีการติดตั้งแอปพลิเคชันด้วยไฟล์ข้อมูลเมตา dex (.dm) ที่เผยแพร่โดย Play Store ซึ่งมีโปรไฟล์ระบบคลาวด์ ART AOT รวบรวมวิธีการที่แสดงอยู่ในระบบคลาวด์ โปรไฟล์ หรือหากติดตั้งแอปพลิเคชันโดยไม่มีไฟล์ข้อมูลเมตา dex จะไม่มีการคอมไพล์ AOT ที่ได้รับ
  2. เมื่อแอปพลิเคชันทำงาน 2-3 ครั้งแรก ระบบจะตีความเมธอดที่ไม่ได้คอมไพล์ AOT สำหรับวิธีการที่ตีความแล้ว วิธีที่ระบบดำเนินการบ่อยครั้งจะทำการคอมไพล์ JIT ศิลปะ จะสร้างโปรไฟล์ในเครื่องตามการดำเนินการและรวมกับโปรไฟล์ในระบบคลาวด์ (หากมี อยู่แล้ว)
  3. เมื่อไม่มีการใช้งานอุปกรณ์และกำลังชาร์จ Daemon ของคอมไพล์จะทำงานเพื่อคอมไพล์แอปพลิเคชันอีกครั้ง โดยอิงจากโปรไฟล์แบบรวมที่สร้างขึ้นระหว่างการเรียกใช้ 2-3 ครั้งแรก
  4. ในการเรียกใช้แอปพลิเคชันครั้งต่อๆ ไป ART จะใช้อาร์ติแฟกต์ที่สร้างขึ้นโดยการคอมไพล์ Daemon ซึ่งมีโค้ดที่คอมไพล์ AOT มากกว่าเมื่อเทียบกับโค้ดที่สร้างขึ้นระหว่าง วิธีการที่ไม่ได้คอมไพล์ AOT ยังคงได้รับการตีความหรือคอมไพล์ JIT อยู่ ART อัปเดตโปรไฟล์ จากการทำงานและโปรไฟล์ จะถูกนำมาใช้ในการเรียกใช้ครั้งต่อๆ ไปของ Daemon ในการคอมไพล์

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

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

ตัวเลือกการคอมไพล์

ตัวเลือกการคอมไพล์สำหรับ ART มีอยู่ 2 หมวดหมู่ ได้แก่

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

ตัวกรองคอมไพเลอร์

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

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

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

ไลบรารีและแอปที่ติดตั้งไว้ล่วงหน้าจะได้รับการคอมไพล์ AOT เมื่อสร้างอิมเมจระบบ ช่วงเวลานี้ กระบวนการนี้เรียกว่า dexpreopt ไฟล์ที่คอมไพล์ดังกล่าวจะใช้งานได้ตราบใดที่ทรัพยากร Dependency ทั้งหมด จะไม่มีการเปลี่ยนแปลง โดยเฉพาะการบูต Classpath

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

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

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

    กําหนดค่าได้จนถึง PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (ดูภายหลังใน )

ตัวเลือก Makefile

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

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

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (Android 9 และสูงกว่า)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER ระบุตัวกรองคอมไพเลอร์เริ่มต้น สำหรับแอปพลิเคชันแบบ dexpreopted แอปเหล่านี้กำหนดไว้ใน 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 dexpreopt เฉพาะ บูตคลาสพาธและ Jars ของเซิร์ฟเวอร์ระบบ

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

    LOCAL_DEX_PREOPT รองรับค่า true หรือ false เพื่อ เปิดใช้หรือปิดใช้ dexpreopt ตามลำดับ นอกจากนี้ nostripping ยัง ระบุหาก dexpreopt ไม่ควรตัด classes.dex จากไฟล์ APK หรือ JAR โดยปกติแล้วไฟล์นี้จะถูกนําออกเนื่องจากไม่ใช่ ที่ต้องใช้อีกต่อไปหลังจาก dexpreopt แต่ตัวเลือกสุดท้ายนี้จำเป็นต่อ อนุญาตให้ลายเซ็น 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 (ตั้งแต่ Android 8)
  • รายการแอปที่ได้รับการระบุว่าเป็นหัวใจของผลิตภัณฑ์และ ที่ต้องการคอมไพล์ด้วยตัวกรองคอมไพเลอร์ speed สำหรับ ตัวอย่างเช่น SystemUI มีโอกาสในการใช้ การคอมไพล์แบบมีคำแนะนำเฉพาะเมื่อรีบูตครั้งถัดไปเท่านั้น ดังนั้นอาจดีกว่าสำหรับ ทำให้แอปเหล่านี้มีการคอมไพล์ AOT เสมอ

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

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

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

  • WITH_DEXPREOPT_PIC (จนถึง Android 7)
  • ใน 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 7 MR1)
  • แทนที่ตัวเลือกนี้ด้วย WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY แล้ว ที่เปิดใช้ JAR ของเซิร์ฟเวอร์ระบบไว้ล่วงหน้าด้วย

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

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

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

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

    การกำหนดค่าคลาสพาธการเปิดเครื่อง

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

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

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

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

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

    ตัวเลือก JIT

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

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

    ตัวเลือก Dex2oat

    ตัวเลือกเหล่านี้จะมีผลต่อการคอมไพล์ในอุปกรณ์ (หรือ dexopt) และบางตัวเลือกก็ส่งผลต่อการคอมไพล์ในอุปกรณ์ dexpreopt ในขณะที่ตัวเลือกที่กล่าวถึงในส่วนการกำหนดค่า ROM ของระบบข้างต้นเท่านั้น ส่งผลต่อ dexpreopt

    ตัวเลือกในการควบคุมการใช้ทรัพยากร

    • dalvik.vm.image-dex2oat-cpu-set/dalvik.vm.image-dex2oat-threads (จนถึง Android 11): จำนวนเทรดและชุดแกน CPU (โปรดดู ด้านล่าง) เพื่อใช้กับอิมเมจเปิดเครื่อง
    • dalvik.vm.boot-dex2oat-threads/dalvik.vm.boot-dex2oat-cpu-set:
      • (จนถึง Android 11) จำนวนเทรดและชุดแกน CPU (ดูด้านล่าง) เพื่อใช้ระหว่างเปิดเครื่องสำหรับสิ่งอื่นๆ นอกเหนือจากอิมเมจเปิดเครื่อง
      • (ตั้งแต่ Android 12) จำนวนเทรดและชุดแกน CPU (ดูด้านล่าง) เพื่อใช้ในช่วงเปิดเครื่องสำหรับทุกอย่าง รวมถึงอิมเมจเปิดเครื่อง
        • โดยเฉพาะ Android 14 ซึ่งเป็นเวอร์ชันที่สอดคล้องกับ ลำดับความสำคัญ PRIORITY_BOOT ในบริการ ART
    • dalvik.vm.restore-dex2oat-threads/dalvik.vm.restore-dex2oat-cpu-set:
      • (ตั้งแต่ Android 11 จนถึง Android 13) จำนวนเทรดและชุดของแกน CPU (ดูด้านล่าง) ที่จะใช้เพื่อกู้คืนจากระบบคลาวด์ การสำรองข้อมูล
      • (ตั้งแต่ Android 14) จำนวนเทรดและชุดแกน CPU (ดูด้านล่าง) เพื่อใช้กับทุกอย่างที่ไวต่อเวลาในการตอบสนองมากกว่าปกติ รวมถึง การคืนค่าจากข้อมูลสำรองในระบบคลาวด์
        • โดยจะสอดคล้องกับคลาสลำดับความสำคัญ PRIORITY_INTERACTIVE_FAST ในบริการ ART
    • dalvik.vm.background-dex2oat-threads/ วันที่ dalvik.vm.background-dex2oat-cpu-set (ตั้งแต่ Android 14): จำนวนเทรดและชุดแกน CPU (ดู ด้านล่าง) ไว้ใช้งานในเบื้องหลัง
      • โดยเฉพาะอย่างยิ่งคลาสนี้สอดคล้องกับคลาสลำดับความสำคัญ PRIORITY_BACKGROUND ใน บริการ ART
    • dalvik.vm.dex2oat-threads/dalvik.vm.dex2oat-cpu-set: จำนวนเทรดและชุดแกน CPU ที่จะใช้กับส่วนอื่นๆ

    ควรระบุชุดแกน CPU เป็นรายการรหัส CPU ที่คั่นด้วยคอมมา เช่น เพื่อเรียกใช้ ใน dex2oat บน CPU Core 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
    

    นอกจากพร็อพเพอร์ตี้ของระบบข้างต้นแล้ว คุณยังสามารถใช้โปรไฟล์งานเพื่อควบคุม การใช้ทรัพยากรของ dex2oat (ดู Cgroup Abstraction Layer)

    โปรไฟล์งานที่รองรับมีดังนี้

    • Dex2OatBackground (ตั้งแต่ Android 14) (โดยค่าเริ่มต้น รับค่า Dex2OatBootComplete): ควบคุมทรัพยากรที่จะใช้ในเบื้องหลัง
      • โดยเฉพาะอย่างยิ่งคลาสนี้สอดคล้องกับคลาสลำดับความสำคัญ PRIORITY_BACKGROUND ใน บริการ ART
    • Dex2OatBootComplete:
      • (จนถึง Android 13) ควบคุมทรัพยากรที่จะใช้สำหรับทุกอย่าง หลังจากเปิดเครื่อง
      • (ตั้งแต่ Android 14) ควบคุมทรัพยากรเพื่อใช้กับทุกอย่าง หลังเปิดเครื่องและไม่อยู่ในเบื้องหลัง
        • โดยจะสอดคล้องกับคลาสลำดับความสำคัญ PRIORITY_INTERACTIVE_FAST และ PRIORITY_INTERACTIVE ใน ART บริการ

    เมื่อระบุทั้งคุณสมบัติของระบบและโปรไฟล์งาน ทั้ง 2 อย่างจะมีผล

    ตัวเลือกในการควบคุมขนาดฮีป

    • dalvik.vm.image-dex2oat-Xms: ขนาดฮีปเริ่มต้นสำหรับอิมเมจเปิดเครื่อง
    • dalvik.vm.image-dex2oat-Xmx: ขนาดสูงสุดของฮีปสำหรับอิมเมจเปิดเครื่อง
    • dalvik.vm.dex2oat-Xms: ขนาดฮีปเริ่มต้นสำหรับสิ่งอื่นๆ
    • dalvik.vm.dex2oat-Xmx: ขนาดฮีปสูงสุดสำหรับสิ่งอื่นๆ

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

    ตัวเลือกในการควบคุมตัวกรองคอมไพเลอร์

    • dalvik.vm.image-dex2oat-filter (จนถึง Android 11): ตัวกรองคอมไพเลอร์สำหรับอิมเมจเปิดเครื่อง นับตั้งแต่ Android 12 เป็นต้นมา ตัวกรองสำหรับอิมเมจเปิดเครื่องจะเป็น speed-profile เสมอ และจะเปลี่ยนแปลงไม่ได้
    • dalvik.vm.systemservercompilerfilter (ตั้งแต่ Android 13): ตัวกรองคอมไพเลอร์สำหรับเซิร์ฟเวอร์ระบบ โปรดดู PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
    • dalvik.vm.systemuicompilerfilter (ตั้งแต่ Android 13): ตัวกรองคอมไพเลอร์สำหรับแพ็กเกจ UI ของระบบ
    • dalvik.vm.dex2oat-filter (จนถึง Android 6): ตัวกรองคอมไพเลอร์สำหรับสิ่งอื่นๆ
    • pm.dexopt.<reason> (ตั้งแต่ Android 7): ตัวกรองคอมไพเลอร์สำหรับสิ่งอื่นๆ โปรดดู การกำหนดค่าบริการ ART สำหรับ Android 14 ปีขึ้นไป หรือ การกำหนดค่าเครื่องมือจัดการแพ็กเกจสำหรับ Android 13 และเก่ากว่า

    ตัวเลือกอื่นๆ ในการควบคุมการคอมไพล์ทุกอย่างนอกเหนือจากอิมเมจบูทมีดังนี้

    • dalvik.vm.dex2oat-very-large (ตั้งแต่ Android 7.1): ขนาดไฟล์ dex รวมขั้นต่ำใน ไบต์เพื่อปิดใช้การคอมไพล์ AOT
    • dalvik.vm.dex2oat-swap (ตั้งแต่ Android 7.1) (ค่าเริ่มต้น: true): อนุญาตให้ใช้การสลับ ของ dex2oat วิธีนี้จะช่วยหลีกเลี่ยงข้อขัดข้องที่มาจากหน่วยความจำไม่เพียงพอ โปรดทราบว่าแม้ว่าตัวเลือกนี้จะ dex2oat จะใช้ไฟล์สลับเฉพาะภายใต้เงื่อนไขบางอย่างเท่านั้น เช่น เมื่อหมายเลข ของไฟล์ dex มีขนาดใหญ่ และเงื่อนไขอาจมีการเปลี่ยนแปลง
    • dalvik.vm.ps-min-first-save-ms (ตั้งแต่ Android 12): เวลาขั้นต่ำในการรอก่อนที่รันไทม์จะสร้างโปรไฟล์ของแอปพลิเคชัน เปิดแอปพลิเคชันแล้ว
    • dalvik.vm.ps-min-save-period-ms (ตั้งแต่ Android 12): เวลาขั้นต่ำในการรอก่อนที่จะอัปเดตโปรไฟล์ของแอปพลิเคชัน
    • dalvik.vm.dex2oat64.enabled (ตั้งแต่ Android 11) (ค่าเริ่มต้น: เท็จ): จะใช้ dex2oat เวอร์ชัน 64 บิตหรือไม่
    • dalvik.vm.bgdexopt.new-classes-percent (ตั้งแต่ Android 12) (ค่าเริ่มต้น: 20): เปอร์เซ็นต์ขั้นต่ำระหว่าง 0 ถึง 100 ของคลาสใหม่ในโปรไฟล์เพื่อทริกเกอร์การคอมไพล์อีกครั้ง ใช้ได้กับการรวบรวมคลิปแนะนำโปรไฟล์ (speed-profile) เท่านั้น โดยทั่วไปจะอยู่ในช่วง dexopt พื้นหลัง โปรดทราบว่านอกจากนี้ ยังมีเกณฑ์ใหม่สำหรับชั้นเรียนใหม่อย่างน้อย 50 ชั้นเรียนนอกเหนือจาก เกณฑ์เปอร์เซ็นต์ และกำหนดค่าไม่ได้
    • dalvik.vm.bgdexopt.new-methods-percent (ตั้งแต่ Android 12) (ค่าเริ่มต้น: 20): เปอร์เซ็นต์ต่ำสุดระหว่าง 0 ถึง 100 ของเมธอดใหม่ในโปรไฟล์ที่ทริกเกอร์การคอมไพล์อีกครั้ง ใช้ได้กับการรวบรวมคลิปแนะนำโปรไฟล์ (speed-profile) เท่านั้น โดยทั่วไปจะอยู่ในช่วง dexopt พื้นหลัง โปรดทราบว่านอกจากนี้ ยังมีเกณฑ์ใหม่อย่างน้อย 100 วิธีเพิ่มเติม เกณฑ์เปอร์เซ็นต์ และกำหนดค่าไม่ได้
    • dalvik.vm.dex2oat-max-image-block-size (ตั้งแต่ Android 10) (ค่าเริ่มต้น: 524288) ขนาดบล็อกทึบสูงสุดสำหรับรูปภาพที่บีบอัด ภาพขนาดใหญ่ถูกแยกเป็นชุดภาพทึบ บล็อกที่ไม่มีขนาดใหญ่กว่าขนาดสูงสุด
    • dalvik.vm.dex2oat-resolve-startup-strings (ตั้งแต่ Android 10) (ค่าเริ่มต้น: true) หากเป็นจริง จะทำให้ dex2oat แก้ไขสตริง Const ทั้งหมดที่อ้างอิงจากเมธอดที่ทำเครื่องหมายเป็น "การเริ่มต้น" ในโปรไฟล์
    • debug.generate-debug-info (ค่าเริ่มต้น: เท็จ) สร้างข้อมูลการแก้ไขข้อบกพร่องสำหรับการแก้ไขข้อบกพร่องของระบบ เช่น การคลายสแต็กหรือไม่ สัญลักษณ์ ELF และส่วนของคนแคระ
    • dalvik.vm.dex2oat-minidebuginfo (ตั้งแต่ Android 9) (ค่าเริ่มต้น: true) ต้องการสร้างข้อมูลการแก้ไขข้อบกพร่องที่บีบอัดโดย LZMA ในจำนวนน้อยที่สุดที่จำเป็นต่อการดำเนินการหรือไม่ พิมพ์ Backtrace

    ตัวเลือกบริการ ART

    ตั้งแต่ Android 14 การคอมไพล์ AOT ในอุปกรณ์สำหรับแอป (หรือที่เรียกว่า dexopt) จัดการโดยบริการ ART สำหรับข้อมูลเกี่ยวกับการกำหนดค่า ART Service โปรดดู การกำหนดค่าบริการ ART

    ตัวเลือกผู้จัดการแพ็กเกจ

    ก่อน Android 14 การคอมไพล์ AOT ในอุปกรณ์สำหรับแอป (หรือที่เรียกว่า dexopt) คือ ที่จัดการโดยตัวจัดการแพ็กเกจ สำหรับข้อมูลเกี่ยวกับการกำหนดค่าตัวจัดการแพ็กเกจสำหรับ dexopt ดูการกำหนดค่าเครื่องมือจัดการแพ็กเกจ

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

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

    ตั้งแต่ Android 7.0 เป็นต้นไป อุปกรณ์อาจใช้พาร์ติชันระบบ 2 พาร์ติชันเพื่อเปิดใช้ การอัปเดตระบบ 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
    

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

    SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
    

    OTA Dexopt ในเบื้องหลัง

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

    pm.dexopt.ab-ota=speed-profile
    

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

    ตัวเลือก JDWP

    การสร้างเทรด Java Debug Wire Protocol (JDWP) ในบิลด์ userdebug จะควบคุมผ่าน พร็อพเพอร์ตี้ของระบบ persist.debug.dalvik.vm.jdwp.enabled รายการ โดยค่าเริ่มต้น พร็อพเพอร์ตี้นี้ ไม่ได้ตั้งค่าไว้ และจะสร้างชุดข้อความ JDWP สำหรับแอปที่แก้ไขข้อบกพร่องได้เท่านั้น วิธีเปิดใช้ชุดข้อความ JDWP สำหรับทั้ง 2 แบบ แอปที่แก้ไขข้อบกพร่องและแก้ไขข้อบกพร่องไม่ได้ ตั้งค่า persist.debug.dalvik.vm.jdwp.enabled ไปยัง 1 ต้องรีบูตอุปกรณ์เพื่อให้การเปลี่ยนแปลงพร็อพเพอร์ตี้มีผล

    หากต้องการแก้ไขข้อบกพร่องของแอปที่แก้ไขข้อบกพร่องไม่ได้ในบิลด์การแก้ไขข้อบกพร่องของผู้ใช้ ให้เปิดใช้ JDWP โดยการเรียกใช้โค้ดต่อไปนี้ คำสั่ง:

      adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
      adb reboot
      
    สำหรับอุปกรณ์ที่ใช้ Android 13 และต่ำกว่า รันไทม์จะสร้าง JDWP ชุดข้อความสำหรับแอปที่แก้ไขข้อบกพร่องได้และแก้ไขข้อบกพร่องไม่ได้ในบิลด์การแก้ไขข้อบกพร่องของผู้ใช้ ซึ่งหมายความว่าอาจเป็นไปได้ เพื่อแนบโปรแกรมแก้ไขข้อบกพร่องหรือสร้างโปรไฟล์แอปในบิลด์ userdebug