ใช้คอมไพเลอร์ ART แบบทันเวลา

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

    จิตภูต
    รูปที่ 3. กิจกรรม JIT daemon

บริการ Google Play เป็นตัวอย่างที่ใช้โดยแอปพลิเคชันอื่นที่ทำงานคล้ายกับไลบรารีที่แชร์

ขั้นตอนการทำงานของ JIT

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

ล้างข้อมูลโปรไฟล์

หากต้องการล้างข้อมูลโปรไฟล์และลบโค้ดที่คอมไพล์แล้ว ให้รันสิ่งต่อไปนี้:

  • สำหรับหนึ่งแพ็คเกจ:
    adb shell cmd package compile --reset my-package
    
  • สำหรับแพ็คเกจทั้งหมด:
    adb shell cmd package compile --reset -a