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

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

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