กำหนดค่าศิลปะ

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

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

ศิลปะทำงานอย่างไร

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • รหัส Boot classpath: คอมไพล์ด้วยตัวกรองคอมไพเลอร์ 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 ภายหลังในเอกสารนี้): คอมไพล์ด้วยตัวกรองคอมไพเลอร์ speed ตามค่าเริ่มต้น
  • แอปอื่นๆ ทั้งหมด: คอมไพล์ด้วยตัวกรองคอมไพ speed-profile ตามค่าเริ่มต้น หรือคอมไพล์ด้วยตัวกรองคอมไพเลอร์ verify หากไม่มีโปรไฟล์

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

ตัวเลือก Makefile

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

  • DONT_DEXPREOPT_PREBUILTS (Android 5 และสูงกว่า)
  • การเปิดใช้งาน DONT_DEXPREOPT_PREBUILTS จะป้องกันไม่ให้สร้างล่วงหน้าจากการถูก dexpreopted แอพเหล่านี้คือแอพที่ include $(BUILD_PREBUILT) ระบุไว้ใน Android.mk การข้าม dexpreopt ของแอปที่สร้างไว้ล่วงหน้าซึ่งมีแนวโน้มที่จะอัปเดตผ่าน 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 dexpreopts เฉพาะคลาสพาธสำหรับบูตและ jars เซิร์ฟเวอร์ระบบ

  • LOCAL_DEX_PREOPT
  • Dexpreopt สามารถเปิดหรือปิดใช้งานได้ในแต่ละแอปโดยการระบุตัวเลือก LOCAL_DEX_PREOPT ในคำจำกัดความของโมดูล สิ่งนี้มีประโยชน์ในการปิดใช้ dexpreopt ของแอปที่อาจได้รับการอัปเดต Google Play ทันที เนื่องจากการอัปเดตจะทำให้โค้ด dexpreopted ในอิมเมจระบบล้าสมัย นอกจากนี้ยังมีประโยชน์ในการประหยัดพื้นที่บน 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 เวอร์ชันดีบักบนอุปกรณ์หรือไม่ ตามค่าเริ่มต้น สิ่งนี้จะเปิดใช้งานสำหรับ userdebug และ eng builds ลักษณะการทำงานสามารถถูกแทนที่ได้โดยการตั้งค่าตัวเลือกให้ true หรือ false อย่างชัดเจน

    ตามค่าเริ่มต้น อุปกรณ์จะใช้เวอร์ชัน nondebug ( 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 : รายการ JARs คลาสพาธของเซิร์ฟเวอร์ระบบบนแพลตฟอร์ม (นั่นคือ เป็นส่วนหนึ่งของ SYSTEMSERVERCLASSPATH ) จำเป็นต้องเพิ่ม classpath JARs ของเซิร์ฟเวอร์ระบบให้กับรายการนี้ การล้มเหลวในการเพิ่ม 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 ที่เซิร์ฟเวอร์ระบบโหลดแบบไดนามิกโดยใช้ classloaders แยกต่างหาก (ผ่าน SystemServiceManager.startServiceFromJar ) ไม่จำเป็นต้องเพิ่ม JAR เซิร์ฟเวอร์ระบบสแตนด์อโลนลงในรายการนี้ แต่ขอแนะนำ อย่างยิ่ง เนื่องจากจะทำให้ JAR คอมไพล์ได้ ดังนั้นจึงมีประสิทธิภาพรันไทม์ที่ดี
    • (จำเป็นตั้งแต่ Android 13) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS : รายการ JAR ที่มาพร้อมกับ APEX ที่เซิร์ฟเวอร์ระบบโหลดแบบไดนามิกโดยใช้ classloaders แยกต่างหาก (นั่นคือ ผ่าน 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
    

    หมายเหตุ: คุณต้องวางบรรทัดนี้ก่อนที่จะสืบทอด makefile คอนฟิกูเรชันผลิตภัณฑ์ใดๆ ที่ได้รับไฟล์ดีฟอลต์จาก 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): เกณฑ์ที่ตัวนับ "hotness" ของเมธอดต้องผ่านเพื่อที่จะคอมไพล์เมธอด 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

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

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

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

    ควรระบุชุดของแกน CPU เป็นรายการรหัส CPU ที่คั่นด้วยเครื่องหมายจุลภาค ตัวอย่างเช่น หากต้องการรันบน dex2oat บน CPU cores 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 Service
    • Dex2OatBootComplete :
      • (จนถึง Android 13) ควบคุมทรัพยากรที่จะใช้สำหรับทุกสิ่งหลังการบูต
      • (ตั้งแต่ Android 14) ควบคุมทรัพยากรเพื่อใช้สำหรับทุกอย่างหลังบูตและไม่อยู่ในเบื้องหลัง
        • โดยเฉพาะอย่างยิ่ง สิ่งนี้สอดคล้องกับคลาสลำดับความสำคัญ PRIORITY_INTERACTIVE_FAST และ PRIORITY_INTERACTIVE ใน ART Service

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

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

    • 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): ตัวกรองคอมไพเลอร์สำหรับแพ็คเกจ System 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) (ค่าเริ่มต้น: false): จะใช้ 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-strings ทั้งหมดที่อ้างอิงมาจากวิธีที่ทำเครื่องหมายเป็น "startup" ในโปรไฟล์
    • debug.generate-debug-info (ค่าเริ่มต้น: false) จะสร้างข้อมูลการดีบักสำหรับการดีบักแบบเนทีฟหรือไม่ เช่น ข้อมูลการคลายสแต็ก สัญลักษณ์ ELF และส่วนแคระ
    • dalvik.vm.dex2oat-minidebuginfo (ตั้งแต่ Android 9) (ค่าเริ่มต้น: true) ไม่ว่าจะสร้างข้อมูลดีบักที่บีบอัด LZMA จำนวนน้อยที่สุดซึ่งจำเป็นต่อการพิมพ์ backtraces หรือไม่

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

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

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

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

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

    การกำหนดค่ารอม

    ตั้งแต่ 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
    

    โปรดทราบว่ารหัสบูตคลาสพาธ รหัสเซิร์ฟเวอร์ระบบ และแอปหลักเฉพาะผลิตภัณฑ์จะคอมไพล์ไปยังพาร์ติชันระบบเสมอ ตามค่าเริ่มต้น แอพอื่นๆ ทั้งหมดจะถูกคอมไพล์ไปยังพาร์ติชั่นระบบตัวที่สองที่ไม่ได้ใช้ ซึ่งสามารถควบคุมได้ด้วย 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 สำหรับทั้งแอปที่แก้ไขข้อบกพร่องและไม่สามารถแก้ไขข้อบกพร่องได้ ให้ตั้งค่า persist.debug.dalvik.vm.jdwp.enabled เป็น 1 ต้องรีบูตอุปกรณ์เพื่อให้การเปลี่ยนแปลงคุณสมบัติมีผล

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

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