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

การคอมไพล์ JIT
การคอมไพล์ JIT เกี่ยวข้องกับกิจกรรมต่อไปนี้

- ผู้ใช้เรียกใช้แอป ซึ่งจะทริกเกอร์ให้ ART โหลด
.dex
ไฟล์- หากมีไฟล์
.oat
(ไบนารี AOT สำหรับไฟล์.dex
) ART จะใช้ไฟล์ดังกล่าวโดยตรง แม้ว่าระบบจะสร้างไฟล์.oat
เป็นประจำ แต่ไฟล์เหล่านี้ไม่ได้มีโค้ดที่คอมไพล์แล้ว (ไบนารี AOT) เสมอไป - หาก
.oat
ไม่มีโค้ดที่คอมไพล์ ART จะเรียกใช้ ผ่าน JIT และตัวแปลเพื่อเรียกใช้.dex
- หากมีไฟล์
- ระบบจะเปิดใช้ JIT สำหรับแอปพลิเคชันที่ไม่ได้คอมไพล์ตาม
speed
ตัวกรองการคอมไพล์ (ซึ่งระบุว่า "คอมไพล์ให้มากที่สุดเท่าที่จะทำได้ จากแอป") - ระบบจะทิ้งข้อมูลโปรไฟล์ JIT ลงในไฟล์ในไดเรกทอรีของระบบที่ แอปพลิเคชันเท่านั้นที่เข้าถึงได้
- Daemon ของการคอมไพล์ AOT (
dex2oat
) จะแยกวิเคราะห์ไฟล์ดังกล่าวเพื่อขับเคลื่อน การคอมไพล์
รูปที่ 3 กิจกรรมของ Daemon JIT
บริการ Google Play เป็นตัวอย่างที่แอปพลิเคชันอื่นๆ ใช้ซึ่งทำงานคล้ายกับไลบรารีที่แชร์
เวิร์กโฟลว์ JIT

- ระบบจะจัดเก็บข้อมูลการจัดโปรไฟล์ไว้ในแคชโค้ดและขึ้นอยู่กับการเก็บขยะ
เมื่อหน่วยความจำเต็ม
- ไม่มีการรับประกันว่าสแนปชอตที่ถ่ายเมื่อแอปพลิเคชันอยู่ในเบื้องหลังจะมีข้อมูลที่สมบูรณ์ (เช่น ทุกอย่างที่ JIT)
- ไม่มีการพยายามบันทึกทุกอย่าง (เนื่องจากอาจส่งผลต่อ ประสิทธิภาพขณะรันไทม์)
- วิธีการอาจมี 3 สถานะดังนี้
- ตีความ (โค้ด DEX)
- คอมไพล์ JIT
- คอมไพล์ AOT
- ข้อกำหนดด้านหน่วยความจำในการเรียกใช้ JIT โดยไม่ส่งผลต่อประสิทธิภาพของแอปเบื้องหน้า ขึ้นอยู่กับแอปที่เป็นปัญหา แอปขนาดใหญ่ต้องใช้หน่วยความจำมากกว่าแอปขนาดเล็ก โดยทั่วไปแล้ว แอปขนาดใหญ่จะมีความเสถียรที่ประมาณ 4 MB
เปิดการบันทึก JIT
หากต้องการเปิดการบันทึก JIT ให้เรียกใช้คำสั่งต่อไปนี้
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
ปิดใช้ JIT
หากต้องการปิดใช้ JIT ให้เรียกใช้คำสั่งต่อไปนี้
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
การบังคับให้คอมไพล์
หากต้องการบังคับให้คอมไพล์ ให้เรียกใช้คำสั่งต่อไปนี้
adb shell cmd package compile
กรณีการใช้งานทั่วไปสำหรับการบังคับคอมไพล์แพ็กเกจที่เฉพาะเจาะจงมีดังนี้
- อิงตามโปรไฟล์
adb shell cmd package compile -m speed-profile -f my-package
- โดยสมบูรณ์:
adb shell cmd package compile -m speed -f my-package
กรณีการใช้งานทั่วไปสำหรับการบังคับคอมไพล์แพ็กเกจทั้งหมดมีดังนี้
- อิงตามโปรไฟล์
adb shell cmd package compile -m speed-profile -f -a
- โดยสมบูรณ์:
adb shell cmd package compile -m speed -f -a
ล้างข้อมูลโปรไฟล์
ใน Android 13 หรือเวอร์ชันก่อนหน้า
หากต้องการล้างข้อมูลโปรไฟล์ในเครื่องและนำโค้ดที่คอมไพล์ออก ให้เรียกใช้คำสั่งต่อไปนี้
adb shell pm compile --reset
ใน Android 14 ขึ้นไป
วิธีล้างข้อมูลโปรไฟล์ในเครื่องเท่านั้น
adb shell pm art clear-app-profiles
หมายเหตุ: คำสั่งนี้ไม่เหมือนกับคำสั่งสำหรับ Android 13 หรือก่อนหน้า ซึ่งจะไม่ล้างข้อมูลโปรไฟล์ภายนอก (`.dm`) ที่ ติดตั้งพร้อมกับแอป
หากต้องการล้างข้อมูลโปรไฟล์ในเครื่องและนำโค้ดที่คอมไพล์ซึ่งสร้างจากข้อมูลโปรไฟล์ในเครื่องออก (เช่น รีเซ็ตเป็นสถานะการติดตั้ง) ให้เรียกใช้คำสั่งต่อไปนี้
adb shell pm compile --reset
หมายเหตุ: คำสั่งนี้จะไม่นำโค้ดที่คอมไพล์แล้วซึ่งสร้างจาก ข้อมูลโปรไฟล์ภายนอก (`.dm`) ที่ติดตั้งพร้อมกับแอปออก
หากต้องการล้างโค้ดที่คอมไพล์ทั้งหมด ให้เรียกใช้คำสั่งต่อไปนี้
adb shell cmd package compile -m verify -f
หมายเหตุ: คำสั่งนี้จะเก็บข้อมูลโปรไฟล์ในเครื่องไว้