รันไทม์ (ART) ของ Android ประกอบด้วยคอมไพเลอร์ Just-In-Time (JIT) ที่มีการทำโปรไฟล์โค้ด ซึ่งช่วยปรับปรุงประสิทธิภาพของแอปพลิเคชัน Android อย่างต่อเนื่องขณะที่แอปทำงาน JIT Compiler เสริมประสิทธิภาพให้กับคอมไพเลอร์ก่อนเวลา (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 Code)
- คอมไพล์ด้วย 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
หมายเหตุ: คำสั่งนี้จะเก็บข้อมูลโปรไฟล์ในเครื่องไว้