รันไทม์ 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 rootadb shell stopadb shell setprop dalvik.vm.extra-opts -verbose:jitadb shell start
ปิดใช้ JIT
หากต้องการปิดใช้ JIT ให้เรียกใช้คำสั่งต่อไปนี้
adb rootadb shell stopadb shell setprop dalvik.vm.usejit falseadb 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
หมายเหตุ: คำสั่งนี้จะเก็บข้อมูลโปรไฟล์ในเครื่องไว้