หน้านี้พูดถึงวิธีกำหนดค่ารันไทม์ของ Android (ART) และตัวเลือกการคอมไพล์ หัวข้อ
ที่ระบุในที่นี้รวมถึงการกำหนดค่าการคอมไพล์อิมเมจระบบล่วงหน้า dex2oat
ตัวเลือกการคอมไพล์ และวิธีตัดพื้นที่พาร์ติชันระบบ พื้นที่การแบ่งส่วนข้อมูล และ
ด้านประสิทธิภาพ
โปรดดู ART และ Dalvik และรูปแบบปฏิบัติการ Dalvik เพื่อทำงานกับ ART ดูการยืนยัน พฤติกรรมของแอปใน Android Runtime (ART) เพื่อดูแลให้แอปทำงานได้ อย่างเหมาะสม
วิธีการทำงานของ ART
ART ใช้การรวบรวมล่วงหน้า (AOT) และเริ่มตั้งแต่ Android 7 ใช้การผสมผสานระหว่างการรวบรวม AOT, การคอมไพล์แบบ Just-In-Time (JIT) และการตีความ และการรวบรวม AOT สามารถ ใช้อ้างอิงโปรไฟล์ได้ โหมดการดำเนินการทั้งหมดนี้รวมกันคือ กำหนดค่าได้ซึ่งจะอธิบายในส่วนนี้ เช่น อุปกรณ์ Pixel ได้รับการกำหนดค่าให้ จะทำงานในขั้นตอนต่อไปนี้
- ตอนแรกมีการติดตั้งแอปพลิเคชันด้วยไฟล์ข้อมูลเมตา dex (
.dm
) ที่เผยแพร่โดย Play Store ซึ่งมีโปรไฟล์ระบบคลาวด์ ART AOT รวบรวมวิธีการที่แสดงอยู่ในระบบคลาวด์ โปรไฟล์ หรือหากติดตั้งแอปพลิเคชันโดยไม่มีไฟล์ข้อมูลเมตา dex จะไม่มีการคอมไพล์ AOT ที่ได้รับ - เมื่อแอปพลิเคชันทำงาน 2-3 ครั้งแรก ระบบจะตีความเมธอดที่ไม่ได้คอมไพล์ AOT สำหรับวิธีการที่ตีความแล้ว วิธีที่ระบบดำเนินการบ่อยครั้งจะทำการคอมไพล์ JIT ศิลปะ จะสร้างโปรไฟล์ในเครื่องตามการดำเนินการและรวมกับโปรไฟล์ในระบบคลาวด์ (หากมี อยู่แล้ว)
- เมื่อไม่มีการใช้งานอุปกรณ์และกำลังชาร์จ Daemon ของคอมไพล์จะทำงานเพื่อคอมไพล์แอปพลิเคชันอีกครั้ง โดยอิงจากโปรไฟล์แบบรวมที่สร้างขึ้นระหว่างการเรียกใช้ 2-3 ครั้งแรก
- ในการเรียกใช้แอปพลิเคชันครั้งต่อๆ ไป 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 หมวดหมู่ ได้แก่
- การกำหนดค่า ROM ของระบบ: AOT คอมไพล์โค้ดใดเมื่อสร้าง อิมเมจระบบ
- การกำหนดค่ารันไทม์: วิธีที่ ART คอมไพล์และเรียกใช้แอปใน อุปกรณ์
ตัวกรองคอมไพเลอร์
ตัวเลือก ART หลักหนึ่งในการกำหนดค่าสองหมวดหมู่นี้คือ คอมไพเลอร์
ตัวกรอง ตัวกรองคอมไพเลอร์จะช่วยระบุวิธีที่ ART คอมไพล์โค้ด DEX และเป็น
ไปยังเครื่องมือ dex2oat
เริ่มตั้งแต่ Android 8
มีตัวกรองที่รองรับอย่างเป็นทางการอยู่ 4 แบบ ดังนี้
verify
: เรียกใช้การยืนยันรหัส DEX เท่านั้น (ไม่มีการคอมไพล์ AOT)quicken
: (จนถึง Android 11) เรียกใช้โค้ด DEX และเพิ่มประสิทธิภาพคำสั่ง DEX บางอย่างเพื่อให้ได้ประสิทธิภาพการทำงานของล่ามที่ดีขึ้นspeed
: เรียกใช้การยืนยันรหัส DEX และคอมไพล์วิธีการทั้งหมด AOTspeed-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
(ดูภายหลังใน ) - (Android 14 ขึ้นไป) คอมไพล์ด้วย
- แอปหลักเฉพาะผลิตภัณฑ์ (ดู
PRODUCT_DEXPREOPT_SPEED_APPS
ภายหลังในหัวข้อนี้ document): คอมไพล์ด้วยตัวกรองของคอมไพเลอร์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
และใช้ตัวกรอง - หากตั้งค่าเป็น
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 คลาสเซิร์ฟเวอร์ระบบ จัดส่งด้วย 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 แบบสแตนด์อโลนในรายการนี้จะส่งผลให้ การเปิดเครื่องล้มเหลว
มีการเรียกใช้ dex2oat
ในโค้ด DEX ที่ติดตั้งในอิมเมจของระบบหรือไม่ เปิดใช้โดยค่าเริ่มต้น
การเปิดใช้ DONT_DEXPREOPT_PREBUILTS
จะป้องกันไม่ให้สิ่งที่สร้างไว้ล่วงหน้า
dexpreopt แล้ว รายการเหล่านี้คือแอปที่มี include $(BUILD_PREBUILT)
ที่ระบุไว้ใน Android.mk
ข้าม
ซ่อนแอปที่สร้างไว้ล่วงหน้าซึ่งมีแนวโน้มที่จะได้รับการอัปเดตผ่าน Google Play
ประหยัดพื้นที่ในอิมเมจของระบบแต่จะเพิ่มเวลาเปิดเครื่องครั้งแรก โปรดทราบว่าตัวเลือกนี้ไม่มีผล
ในแอปที่สร้างไว้ล่วงหน้าซึ่งระบุไว้ใน Android.bp
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
dexpreopt เฉพาะ
บูตคลาสพาธและ Jars ของเซิร์ฟเวอร์ระบบ
คุณยังเปิดหรือปิดใช้ Dexpreopt ในแอปแต่ละรายการได้โดย
โดยระบุตัวเลือก LOCAL_DEX_PREOPT
ในการกำหนดโมดูล
ซึ่งอาจเป็นประโยชน์ในการปิดใช้ dexpreopt ของแอปที่อาจปรากฏขึ้นทันที
ได้รับการอัปเดตจาก Google Play เนื่องจากการอัปเดตจะแสดงผล
โค้ดในอิมเมจของระบบล้าสมัย วิธีนี้ยังช่วยให้ประหยัดพื้นที่ได้
สำหรับผู้ให้บริการอีเมล
จะอัปเกรดเวอร์ชัน 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 เวอร์ชันที่แก้ไขข้อบกพร่องในอุปกรณ์หรือไม่ โดยค่าเริ่มต้น นี่คือ
เปิดใช้สำหรับบิลด์การแก้ไขข้อบกพร่องและวิศวกร คุณสามารถลบล้างลักษณะการทำงานนี้ได้โดย
กำลังตั้งค่าตัวเลือกเป็น 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 เฉพาะเมื่อคอมไพเลอร์ 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
- โดยเฉพาะ 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 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 รวมขั้นต่ำใน ไบต์เพื่อปิดใช้การคอมไพล์ AOTdalvik.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 โดยการเรียกใช้โค้ดต่อไปนี้ คำสั่ง:
สำหรับอุปกรณ์ที่ใช้ Android 13 และต่ำกว่า รันไทม์จะสร้าง JDWP ชุดข้อความสำหรับแอปที่แก้ไขข้อบกพร่องได้และแก้ไขข้อบกพร่องไม่ได้ในบิลด์การแก้ไขข้อบกพร่องของผู้ใช้ ซึ่งหมายความว่าอาจเป็นไปได้ เพื่อแนบโปรแกรมแก้ไขข้อบกพร่องหรือสร้างโปรไฟล์แอปในบิลด์ userdebugadb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
adb reboot