กำหนดค่า ART

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

ดูART และ Dalvik รวมถึงรูปแบบไฟล์ปฏิบัติการ Dalvik เพื่อใช้งานกับ ART ดูการยืนยันลักษณะการทํางานของแอปใน Android Runtime (ART) เพื่อให้แอปทํางานได้อย่างถูกต้อง

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • โค้ด 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 จะทำให้ระบบไม่ใช้การแยกคำของรายการที่สร้างไว้ล่วงหน้า แอปเหล่านี้คือแอปที่ระบุ include $(BUILD_PREBUILT) ใน Android.mk การข้าม DEXPREOPT ของแอปที่สร้างไว้ล่วงหน้าซึ่งมีแนวโน้มที่จะอัปเดตผ่าน Google Play จะช่วยประหยัดพื้นที่ในอิมเมจระบบ แต่จะทำให้เวลาในการบูตครั้งแรกนานขึ้น โปรดทราบว่าตัวเลือกนี้จะไม่มีผลกับแอปที่สร้างไว้ล่วงหน้าซึ่งกำหนดไว้ใน Android.bp

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

  • LOCAL_DEX_PREOPT
  • นอกจากนี้ คุณยังเปิดหรือปิดใช้ Dexpreopt ในแอปแต่ละแอปได้โดยระบุตัวเลือก LOCAL_DEX_PREOPT ในคําจํากัดความของข้อบังคับ ซึ่งอาจมีประโยชน์สำหรับการปิดใช้ dexpreopt ของแอปที่อาจได้รับการอัปเดตจาก Google Play ทันที เนื่องจากอัปเดตจะทำให้โค้ด dexpreopt ในอิมเมจระบบล้าสมัย นอกจากนี้ การดำเนินการนี้ยังช่วยประหยัดพื้นที่ใน 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 คุณลบล้างลักษณะการทำงานได้โดยการตั้งค่าตัวเลือกเป็น 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 compiler
    • หากตั้งค่าเป็น 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 ของ classpath ของเซิร์ฟเวอร์ระบบที่มาพร้อมกับ APEX (นั่นคือเป็นส่วนหนึ่งของ SYSTEMSERVERCLASSPATH) รูปแบบคือ <apex name>:<jar name> คุณต้องเพิ่ม JAR เส้นทาง Class ของเซิร์ฟเวอร์ระบบ APEX ลงในรายการนี้ หากเพิ่ม JAR เส้นทางคลาสเซิร์ฟเวอร์ระบบ APEX ลงในรายการนี้ไม่สำเร็จ ระบบจะไม่โหลด JAR เหล่านั้น
    • (ไม่บังคับ, Android 13 และต่ำกว่า) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS: รายการ JAR ที่เซิร์ฟเวอร์ระบบโหลดแบบไดนามิกโดยใช้ Class Loader แยกต่างหาก (ผ่าน SystemServiceManager.startServiceFromJar) คุณไม่จำเป็นต้องเพิ่ม JAR ของเซิร์ฟเวอร์ระบบแบบสแตนด์อโลนในรายการนี้ แต่แนะนำอย่างยิ่งเนื่องจากจะทำให้ JAR ได้รับการคอมไพล์และมีประสิทธิภาพรันไทม์ที่ดี
    • (ต้องระบุตั้งแต่ Android 13) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS: รายการ JAR ที่ส่งพร้อมกับ APEX ซึ่งเซิร์ฟเวอร์ระบบจะโหลดแบบไดนามิกโดยใช้ Class Loader แยกต่างหาก (นั่นคือผ่าน 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 เฉพาะในกรณีที่มีคอมไพเลอร์ JIT ของ ART เท่านั้น

    • dalvik.vm.usejit: มีการเปิดใช้ JIT หรือไม่
    • dalvik.vm.jitinitialsize (ค่าเริ่มต้น 64 KB): ความจุเริ่มต้นของแคชโค้ด แคชโค้ดจะเรียกใช้ GC เป็นประจําและเพิ่มหากจําเป็น
    • dalvik.vm.jitmaxsize (ค่าเริ่มต้น 64 ล้าน): ความจุสูงสุดของแคชโค้ด
    • dalvik.vm.jitthreshold (ค่าเริ่มต้น 10000): เกณฑ์ที่ตัวนับ "ความนิยม" ของเมธอดต้องผ่านเพื่อให้เมธอดได้รับการคอมไพล์ด้วย 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-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
    • 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 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)

    โปรไฟล์งานที่ใช้ได้ ได้แก่

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

    เมื่อระบุทั้งพร็อพเพอร์ตี้ของระบบและโปรไฟล์งาน พร็อพเพอร์ตี้และโปรไฟล์ดังกล่าวจะมีผลทั้งคู่

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

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

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

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

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

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

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

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

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

    ตัวอย่างการใช้งาน (ใน 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/%
    

    DEXOPT OTA เบื้องหลัง

    ในอุปกรณ์ที่เปิดใช้ 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