รันไทม์ 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 ไปยังไฟล์ในไดเรกทอรีระบบที่มีเพียงแอปพลิเคชันเท่านั้นที่เข้าถึงได้
- เดรัมคอมไพล์ 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
หมายเหตุ: คำสั่งนี้จะไม่ล้างข้อมูลโปรไฟล์ภายนอก (".dm") ที่ติดตั้งมาพร้อมกับแอป ซึ่งแตกต่างจากคำสั่งสำหรับ Android 13 หรือเก่ากว่า
หากต้องการล้างข้อมูลโปรไฟล์ในเครื่องและนำโค้ดที่คอมไพล์แล้วซึ่งสร้างขึ้นจากข้อมูลโปรไฟล์ในเครื่องออก (กล่าวคือ เพื่อรีเซ็ตเป็นสถานะการติดตั้ง) ให้ทำดังนี้
adb shell pm compile --reset
หมายเหตุ: คำสั่งนี้จะไม่นําโค้ดที่คอมไพล์แล้วซึ่งสร้างจากข้อมูลโปรไฟล์ภายนอก (".dm") ที่ติดตั้งมาพร้อมกับแอปออก
หากต้องการล้างโค้ดที่คอมไพล์แล้วทั้งหมด ให้เรียกใช้คําสั่งนี้
adb shell cmd package compile -m verify -f
หมายเหตุ: คำสั่งนี้จะเก็บข้อมูลโปรไฟล์ในเครื่องไว้