ใช้คอมไพเลอร์แบบ 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. Daemon ของการคอมไพล์ 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 

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

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

adb shell pm compile --reset 

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

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

adb shell cmd package compile -m verify -f 

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