รันไทม์ของ Android (ART) มีคอมไพเลอร์แบบทันเวลา (JIT) พร้อมการสร้างโปรไฟล์โค้ดที่ปรับปรุงประสิทธิภาพของแอปพลิเคชัน Android อย่างต่อเนื่องในขณะที่ทำงาน คอมไพเลอร์ JIT ช่วยเสริมคอมไพเลอร์ล่วงหน้า (AOT) ในปัจจุบันของ ART และปรับปรุงประสิทธิภาพรันไทม์ ประหยัดพื้นที่จัดเก็บข้อมูล และเพิ่มความเร็วของแอปพลิเคชันและระบบการอัปเดต นอกจากนี้ยังปรับปรุงคอมไพเลอร์ AOT โดยการหลีกเลี่ยงการชะลอตัวของระบบระหว่างการอัปเดตแอปพลิเคชันอัตโนมัติหรือการคอมไพล์ใหม่ของแอปพลิเคชันระหว่างการอัปเดตแบบ over-the-air (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. กิจกรรม JIT daemon
บริการ Google Play เป็นตัวอย่างที่ใช้โดยแอปพลิเคชันอื่นที่ทำงานคล้ายกับไลบรารีที่แชร์
ขั้นตอนการทำงานของ JIT
- ข้อมูลโปรไฟล์จะถูกเก็บไว้ในแคชโค้ดและถูกรวบรวมขยะภายใต้แรงกดดันของหน่วยความจำ
- ไม่มีการรับประกันว่าสแน็ปช็อตที่ถ่ายเมื่อแอปพลิเคชันอยู่ในเบื้องหลังจะมีข้อมูลครบถ้วน (เช่น ทุกอย่างที่เป็น JITed)
- ไม่มีการพยายามให้แน่ใจว่าทุกอย่างได้รับการบันทึก (เนื่องจากอาจส่งผลต่อประสิทธิภาพรันไทม์)
- วิธีการสามารถอยู่ในสถานะที่แตกต่างกันสามสถานะ:
- ตีความ (รหัส dex)
- JIT รวบรวม
- ทอท. เรียบเรียง
- ข้อกำหนดหน่วยความจำในการรัน 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
หมายเหตุ: คำสั่งนี้จะเก็บข้อมูลโปรไฟล์ในเครื่อง