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

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

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