หน้านี้จะอธิบายวิธีกำหนดค่ารันไทม์ 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 แบบสแตนด์อโลนในรายการนี้ไม่สำเร็จ ระบบจะบูตไม่สำเร็จ 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): น้ำหนักของการเรียกใช้เมธอดที่เปลี่ยนระหว่างการคอมไพล์โค้ดและโปรแกรมล่าม วิธีนี้ช่วยตรวจสอบว่าคอมไพล์เมธอดที่เกี่ยวข้องเพื่อลดทรานซิชัน (ซึ่งใช้ค่าใช้จ่ายสูง)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 ที่จะใช้กับส่วนอื่นๆ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
: ขนาดฮีปสูงสุดสําหรับส่วนที่เหลือ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 เพียงเล็กน้อยที่จําเป็นต่อการพิมพ์การติดตามกลับหรือไม่
มีการเรียกใช้ 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 เท่านั้น
ตัวเลือก Dex2oat
ตัวเลือกเหล่านี้มีผลต่อการคอมไพล์ในอุปกรณ์ (หรือที่เรียกว่า dexopt) และตัวเลือกบางรายการยังมีผลต่อ dexpreopt ด้วย ส่วนตัวเลือกที่กล่าวถึงในส่วนการกำหนดค่า ROM ของระบบด้านบนจะมีผลต่อ dexpreopt เท่านั้น
ตัวเลือกในการควบคุมการใช้ทรัพยากร
ควรระบุชุดแกน 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)
โปรไฟล์งานที่ใช้ได้ ได้แก่
เมื่อระบุทั้งพร็อพเพอร์ตี้ของระบบและโปรไฟล์งาน พร็อพเพอร์ตี้และโปรไฟล์ดังกล่าวจะมีผลทั้งคู่
ตัวเลือกในการควบคุมขนาดกองมีดังนี้
ไม่ควรลดตัวเลือกที่ควบคุมขนาดกองเริ่มต้นและสูงสุดสำหรับ dex2oat
เนื่องจากอาจจำกัดแอปพลิเคชันที่คอมไพล์ได้
ตัวเลือกในการควบคุมตัวกรองคอมไพเลอร์
ตัวเลือกอื่นๆ ในการควบคุมการคอมไพล์ทุกอย่างที่ไม่ใช่อิมเมจบูต
ตัวเลือกบริการของ 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