หน้านี้จะอธิบายวิธีกำหนดค่ารันไทม์ Android (ART) และตัวเลือกการคอมไพล์ หัวข้อที่กล่าวถึงในที่นี้รวมถึงการกำหนดค่าการคอมไพล์ล่วงหน้าของอิมเมจระบบ dex2oat
ตัวเลือกการคอมไพล์ และวิธีแลกเปลี่ยนพื้นที่พาร์ติชันของระบบ พื้นที่พาร์ติชันข้อมูล และประสิทธิภาพ
ดูART และ Dalvik รวมถึงรูปแบบไฟล์ปฏิบัติการ Dalvik เพื่อใช้งานกับ ART ดูการยืนยันลักษณะการทํางานของแอปใน Android Runtime (ART) เพื่อให้แอปทํางานได้อย่างถูกต้อง
วิธีการทํางานของ ART
ART ใช้การคอมไพล์ล่วงหน้า (AOT) และตั้งแต่ Android 7 เป็นต้นไป ระบบจะใช้การคอมไพล์ AOT, การคอมไพล์แบบทันท่วงที (JIT) และการตีความแบบผสมผสาน และสามารถคอมไพล์ AOT ตามโปรไฟล์ได้ การรวมโหมดการดําเนินการทั้งหมดเหล่านี้สามารถกําหนดค่าได้ และจะกล่าวถึงในส่วนนี้ ตัวอย่างเช่น อุปกรณ์ Pixel ได้รับการกําหนดค่าให้ทํางานในขั้นตอนต่อไปนี้
- แอปพลิเคชันได้รับการติดตั้งครั้งแรกด้วยไฟล์ข้อมูลเมตา dex (
.dm
) ที่เผยแพร่โดย Play Store ซึ่งมีโปรไฟล์ระบบคลาวด์ ART AOT จะคอมไพล์เมธอดที่ระบุไว้ในโปรไฟล์ระบบคลาวด์ หรือหากติดตั้งแอปพลิเคชันโดยไม่มีไฟล์ข้อมูลเมตา dex ระบบจะไม่ทำการคอมไพล์ AOT - ในช่วงแรกที่แอปพลิเคชันทำงาน ระบบจะตีความเมธอดที่ไม่ได้คอมไพล์แบบ AOT วิธีการแบบตีความที่เรียกใช้บ่อยจะได้รับการคอมไพล์แบบ JIT ART จะสร้างโปรไฟล์ในเครื่องตามการดำเนินการและรวมเข้ากับโปรไฟล์ระบบคลาวด์ (หากมี)
- เมื่ออุปกรณ์ไม่ได้ใช้งานและกำลังชาร์จ โปรแกรมรวบรวมข้อมูลเดรัมจะทำงานเพื่อคอมไพล์แอปพลิเคชันอีกครั้งโดยอิงตามโปรไฟล์แบบรวมที่สร้างขึ้นระหว่างการเรียกใช้ 2-3 ครั้งแรก
- เมื่อเรียกใช้แอปพลิเคชันครั้งต่อๆ ไป 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 หมวดหมู่ ได้แก่
- การกําหนดค่า ROM ของระบบ: โค้ดใดที่ AOT จะคอมไพล์เมื่อสร้างอิมเมจระบบ
- การกําหนดค่ารันไทม์: วิธีที่ 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
(ดูในเอกสารนี้ในลำดับถัดไป) - (Android 14 ขึ้นไป) คอมไพล์ด้วยตัวกรองคอมไพเลอร์
- แอปหลักเฉพาะผลิตภัณฑ์ (ดู
PRODUCT_DEXPREOPT_SPEED_APPS
ในเอกสารนี้ภายหลัง) คอมไพล์ด้วยตัวกรองคอมไพเลอร์speed
โดยค่าเริ่มต้น - แอปอื่นๆ ทั้งหมด: คอมไพล์ด้วยตัวกรองคอมไพเลอร์
speed-profile
โดยค่าเริ่มต้น หรือคอมไพล์ด้วยตัวกรองคอมไพเลอร์verify
หากไม่ได้ระบุโปรไฟล์กำหนดค่าได้ผ่าน
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(ดูในเอกสารนี้ในลำดับถัดไป)
ตัวเลือก Makefile
WITH_DEXPREOPT
DONT_DEXPREOPT_PREBUILTS
(Android 5 ขึ้นไป)PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(Android 9 ขึ้นไป)WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
(ตั้งแต่ Android 8 MR1)LOCAL_DEX_PREOPT
PRODUCT_DEX_PREOPT_BOOT_FLAGS
PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
PRODUCT_DEX_PREOPT_MODULE_CONFIGS
PRODUCT_DEXPREOPT_SPEED_APPS
(ตั้งแต่ Android 8)PRODUCT_SYSTEM_SERVER_APPS
(ตั้งแต่ Android 8)PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD
(ตั้งแต่ Android 8 ขึ้นไป)WITH_DEXPREOPT_PIC
(จนถึง Android 7)WITH_DEXPREOPT_BOOT_IMG_ONLY
(จนถึง Android 7 MR1)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
- (ต้องระบุ)
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 แบบสแตนด์อโลนในรายการนี้ไม่สำเร็จ ระบบจะบูตไม่สำเร็จ
มีการเรียกใช้ dex2oat
ในโค้ด DEX ที่ติดตั้งในอิมเมจระบบหรือไม่ เปิดใช้โดยค่าเริ่มต้น
การเปิดใช้ DONT_DEXPREOPT_PREBUILTS
จะทำให้ระบบไม่ใช้การแยกคำของรายการที่สร้างไว้ล่วงหน้า แอปเหล่านี้คือแอปที่ระบุ include $(BUILD_PREBUILT)
ใน Android.mk
การข้าม DEXPREOPT ของแอปที่สร้างไว้ล่วงหน้าซึ่งมีแนวโน้มที่จะอัปเดตผ่าน Google Play จะช่วยประหยัดพื้นที่ในอิมเมจระบบ แต่จะทำให้เวลาในการบูตครั้งแรกนานขึ้น โปรดทราบว่าตัวเลือกนี้จะไม่มีผลกับแอปที่สร้างไว้ล่วงหน้าซึ่งกำหนดไว้ใน Android.bp
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
dexpreopts เฉพาะ classpath ของบูตและ jar ของเซิร์ฟเวอร์ระบบ
นอกจากนี้ คุณยังเปิดหรือปิดใช้ Dexpreopt ในแอปแต่ละแอปได้โดยระบุตัวเลือก LOCAL_DEX_PREOPT
ในคําจํากัดความของข้อบังคับ
ซึ่งอาจมีประโยชน์สำหรับการปิดใช้ dexpreopt ของแอปที่อาจได้รับการอัปเดตจาก Google Play ทันที เนื่องจากอัปเดตจะทำให้โค้ด dexpreopt ในอิมเมจระบบล้าสมัย นอกจากนี้ การดำเนินการนี้ยังช่วยประหยัดพื้นที่ใน OTA สำหรับการอัปเกรดเวอร์ชันหลักด้วย เนื่องจากผู้ใช้อาจมีแอปเวอร์ชันใหม่กว่าอยู่ในพาร์ติชันข้อมูลอยู่แล้ว
LOCAL_DEX_PREOPT
รองรับค่า true
หรือ false
เพื่อเปิดหรือปิดใช้ dexpreopt ตามลำดับ นอกจากนี้ คุณยังระบุ nostripping
ได้หากไม่ต้องการให้ dexpreopt ตัดไฟล์ classes.dex
ออกจากไฟล์ APK หรือ JAR โดยปกติแล้วระบบจะตัดไฟล์นี้ออกเนื่องจากไม่จําเป็นต้องใช้อีกต่อไปหลังจาก dexpreopt แต่ตัวเลือกสุดท้ายนี้จําเป็นต่อการอนุญาตให้ลายเซ็น APK ของบุคคลที่สามยังคงใช้งานได้
ส่งตัวเลือกไปยัง dex2oat
เพื่อควบคุมวิธีคอมไพล์อิมเมจบูต ซึ่งสามารถใช้เพื่อระบุรายการคลาสรูปภาพที่กําหนดเอง รายการคลาสที่คอมไพล์แล้ว และตัวกรองคอมไพเลอร์
ส่งตัวเลือกไปยัง dex2oat
เพื่อควบคุมวิธีคอมไพล์ทุกอย่างนอกเหนือจากภาพบูต
ช่วยให้สามารถส่งตัวเลือก dex2oat
สำหรับการกำหนดค่าผลิตภัณฑ์และข้อบังคับที่เฉพาะเจาะจง โดยตั้งค่าในไฟล์ device.mk
ของผลิตภัณฑ์ตาม $(call add-product-dex-preopt-module-config,<modules>,<option>)
โดยที่ <modules>
คือรายการชื่อ LOCAL_MODULE
และ
LOCAL_PACKAGE
สำหรับไฟล์ JAR และ APK ตามลำดับ
รายการแอปที่ได้รับการระบุว่าเป็นแกนหลักของผลิตภัณฑ์และควรคอมไพล์ด้วยตัวกรองคอมไพเลอร์ speed
ตัวอย่างเช่น แอปที่ทำงานอยู่ตลอด เช่น SystemUI มีโอกาสใช้การคอมไพล์ที่แนะนำโดยโปรไฟล์เมื่อรีบูตครั้งถัดไปเท่านั้น ดังนั้นผลิตภัณฑ์จึงอาจทำงานได้ดีขึ้นหากแอปเหล่านี้ได้รับการคอมไพล์ AOT เสมอ
รายการแอปที่เซิร์ฟเวอร์ระบบโหลด แอปเหล่านี้จะคอมไพล์โดยค่าเริ่มต้นด้วยตัวกรองคอมไพเลอร์ speed
ไม่ว่าจะรวม ART เวอร์ชันแก้ไขข้อบกพร่องไว้ในอุปกรณ์หรือไม่ โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดใช้สำหรับบิลด์ userdebug และ eng คุณลบล้างลักษณะการทำงานได้โดยการตั้งค่าตัวเลือกเป็น true
หรือ false
อย่างชัดแจ้ง
โดยค่าเริ่มต้น อุปกรณ์จะใช้เวอร์ชันที่ไม่ใช่การแก้ไขข้อบกพร่อง (libart.so
) หากต้องการเปลี่ยน ให้ตั้งค่าพร็อพเพอร์ตี้ของระบบ persist.sys.dalvik.vm.lib.2
เป็น libartd.so
ใน 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_AND_SYSTEM_SERVER_ONLY
ซึ่งจะเลือก JAR ของเซิร์ฟเวอร์ระบบไว้ล่วงหน้าด้วย
ตัวเลือกนี้จะระบุตัวกรองคอมไพเลอร์สำหรับเซิร์ฟเวอร์ระบบ
ต่อไปนี้คือรายการ JAR ที่เซิร์ฟเวอร์ระบบโหลด JAR จะคอมไพล์ด้วยตัวกรองคอมไพเลอร์ที่ระบุโดย PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
การกำหนดค่าเส้นทางคลาสบูต
รายการคลาสที่โหลดไว้ล่วงหน้าคือรายการคลาสที่ 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
- กล่าวโดยละเอียดคือ ตั้งแต่ Android 14 เป็นต้นไป ระดับนี้จะสอดคล้องกับคลาสลำดับความสำคัญ
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 ทั้งหมดขั้นต่ำเป็นไบต์เพื่อปิดใช้การคอมไพล์ AOTdalvik.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 และส่วน Dwarfdalvik.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 โดยเรียกใช้คำสั่งต่อไปนี้
สำหรับอุปกรณ์ที่ใช้ Android 13 หรือต่ำกว่า รันไทม์จะสร้างเธรด JDWP สำหรับแอปที่แก้ไขข้อบกพร่องได้และแก้ไขข้อบกพร่องไม่ได้ในบิลด์ userdebug ซึ่งหมายความว่าคุณสามารถแนบโปรแกรมแก้ไขข้อบกพร่องหรือสร้างโปรไฟล์แอปใดก็ได้ในบิลด์ userdebugadb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
adb reboot