ใช้คอมไพเลอร์แบบ Just-in-Time ของ ART

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

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

สถาปัตยกรรม JIT

สถาปัตยกรรม JIT
รูปที่ 1 สถาปัตยกรรม JIT

การคอมไพล์ JIT

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

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

    Daemon ของ JIT
    รูปที่ 3 กิจกรรมของ Daemon JIT

บริการ Google Play เป็นแอปพลิเคชันตัวอย่างที่แอปพลิเคชันอื่นๆ ใช้ซึ่งมีลักษณะการทำงานคล้ายกับไลบรารีที่ใช้ร่วมกัน

เวิร์กโฟลว์ JIT

สถาปัตยกรรม JIT
รูปที่ 4 โฟลว์ข้อมูล JIT
  • ระบบจะจัดเก็บข้อมูลการโปรไฟล์ไว้ในแคชโค้ดและจะทำการรวบรวมขยะเมื่อหน่วยความจํามีการใช้งานมาก
    • ไม่มีการรับประกันว่าสแนปชอตที่ถ่ายเมื่อแอปพลิเคชันทำงานอยู่เบื้องหลังจะมีข้อมูลที่สมบูรณ์ (นั่นคือทุกอย่างที่ JIT)
    • ไม่มีการพยายามบันทึกทุกอย่าง (เนื่องจากอาจส่งผลต่อประสิทธิภาพรันไทม์)
  • วิธีการมี 3 สถานะ ดังนี้
    • แปลแล้ว (โค้ด DEX)
    • คอมไพล์ด้วย JIT
    • คอมไพล์ AOT
    หากมีทั้งโค้ด JIT และ AOT (เช่น เนื่องจากการยกเลิกการเพิ่มประสิทธิภาพซ้ำๆ) ให้ใช้โค้ด 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 

หมายเหตุ: คำสั่งนี้จะไม่ล้างข้อมูลโปรไฟล์ภายนอก (".dm") ที่ติดตั้งมาพร้อมกับแอป ซึ่งแตกต่างจากคำสั่งสำหรับ Android 13 หรือเก่ากว่า

หากต้องการล้างข้อมูลโปรไฟล์ในเครื่องและนำโค้ดที่คอมไพล์แล้วซึ่งสร้างขึ้นจากข้อมูลโปรไฟล์ในเครื่องออก (กล่าวคือ เพื่อรีเซ็ตเป็นสถานะการติดตั้ง) ให้ทำดังนี้

adb shell pm compile --reset 

หมายเหตุ: คำสั่งนี้จะไม่นําโค้ดที่คอมไพล์แล้วซึ่งสร้างจากข้อมูลโปรไฟล์ภายนอก (".dm") ที่ติดตั้งมาพร้อมกับแอปออก

หากต้องการล้างโค้ดที่คอมไพล์แล้วทั้งหมด ให้เรียกใช้คําสั่งนี้

adb shell cmd package compile -m verify -f 

หมายเหตุ: คำสั่งนี้จะเก็บข้อมูลโปรไฟล์ในเครื่องไว้