Android Runtime (ART) และ Dalvik

รันไทม์ของ Android (ART) คือรันไทม์ที่มีการจัดการที่ใช้โดยแอปพลิเคชันและบริการระบบบางอย่างบน Android ART และ Dalvik รุ่นก่อนถูกสร้างขึ้นเฉพาะสำหรับโครงการ Android ART เมื่อรันไทม์รันรูปแบบ Dalvik Executable และข้อกำหนด Dex bytecode

ART และ Dalvik เป็นรันไทม์ที่เข้ากันได้ซึ่งรัน Dex bytecode ดังนั้นแอพที่พัฒนาขึ้นสำหรับ Dalvik ควรทำงานเมื่อรันด้วย ART อย่างไรก็ตาม เทคนิคบางอย่างที่ใช้กับ Dalvik ใช้ไม่ได้กับ ART สำหรับข้อมูลเกี่ยวกับปัญหาที่สำคัญที่สุด โปรดดูที่ การตรวจสอบการทำงานของแอปบนรันไทม์ของ Android (ART)

คุณสมบัติศิลปะ

ต่อไปนี้คือคุณลักษณะหลักบางประการที่ ART นำมาใช้

การรวบรวมล่วงหน้า (ทอท.)

ART แนะนำการรวบรวมล่วงหน้า (AOT) ซึ่งสามารถปรับปรุงประสิทธิภาพของแอปได้ ART ยังมีการตรวจสอบเวลาติดตั้งที่เข้มงวดกว่า Dalvik

ณ เวลาติดตั้ง ART จะรวบรวมแอปโดยใช้เครื่องมือ dex2oat บนอุปกรณ์ ยูทิลิตีนี้ยอมรับไฟล์ DEX เป็นอินพุตและสร้างแอปที่คอมไพล์แล้วปฏิบัติการได้สำหรับอุปกรณ์เป้าหมาย ยูทิลิตีควรจะสามารถรวบรวมไฟล์ DEX ที่ถูกต้องทั้งหมดได้โดยไม่ยาก อย่างไรก็ตาม เครื่องมือหลังการประมวลผลบางตัวสร้างไฟล์ที่ไม่ถูกต้องซึ่ง Dalvik อาจยอมรับได้ แต่ไม่สามารถคอมไพล์โดย ART ได้ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ การจัดการ ปัญหาการเก็บขยะ

ปรับปรุงการเก็บขยะ

การรวบรวมขยะ (GC) เป็นการใช้ทรัพยากรที่เข้มข้นมาก ซึ่งอาจทำให้ประสิทธิภาพของแอปลดลง ส่งผลให้การแสดงผลขาดๆ หายๆ การตอบสนองของ UI ที่ไม่ดี และปัญหาอื่นๆ ART ปรับปรุงการรวบรวมขยะในหลายวิธี:

  • การออกแบบส่วนใหญ่พร้อมกันด้วยการหยุดชั่วคราว GC เดียว
  • การคัดลอกพร้อมกันเพื่อลดการใช้หน่วยความจำพื้นหลังและการแตกแฟรกเมนต์
  • ความยาวของ GC หยุดชั่วคราวไม่ขึ้นกับขนาดฮีป
  • ตัวสะสมที่มีเวลา GC รวมต่ำกว่าสำหรับกรณีพิเศษในการทำความสะอาดวัตถุอายุสั้นที่ได้รับการจัดสรรเมื่อเร็วๆ นี้
  • ปรับปรุงการยศาสตร์ของการรวบรวมขยะ ทำให้การรวบรวมขยะพร้อมกันได้ทันท่วงที ซึ่งทำให้เหตุการณ์ GC_FOR_ALLOC หายากมากในกรณีการใช้งานทั่วไป

การพัฒนาและการดีบักการปรับปรุง

ART นำเสนอคุณสมบัติมากมายเพื่อปรับปรุงการพัฒนาและการดีบักแอพ

รองรับการสุ่มตัวอย่าง Profiler

ในอดีต นักพัฒนาได้ใช้เครื่องมือ Traceview (ออกแบบมาสำหรับการติดตามการทำงานของแอปพลิเคชัน) เป็นตัวสร้างโปรไฟล์ ในขณะที่ Traceview ให้ข้อมูลที่เป็นประโยชน์ ผลลัพธ์ของ Dalvik นั้นเบ้โดยค่าโสหุ้ยต่อการโทร และการใช้เครื่องมือนี้ส่งผลต่อประสิทธิภาพของรันไทม์อย่างเห็นได้ชัด

ART เพิ่มการสนับสนุนสำหรับตัวสร้างโปรไฟล์การสุ่มตัวอย่างโดยเฉพาะซึ่งไม่มีข้อจำกัดเหล่านี้ ซึ่งช่วยให้มองเห็นการทำงานของแอปได้แม่นยำยิ่งขึ้นโดยไม่ทำให้การทำงานช้าลงอย่างมีนัยสำคัญ เพิ่มการรองรับการสุ่มตัวอย่างใน Traceview สำหรับ Dalvik ในรุ่น KitKat

รองรับคุณสมบัติการดีบักเพิ่มเติม

ART รองรับตัวเลือกการดีบักใหม่จำนวนมาก โดยเฉพาะอย่างยิ่งในฟังก์ชันที่เกี่ยวข้องกับการมอนิเตอร์และการรวบรวมขยะ ตัวอย่างเช่น คุณสามารถ:

  • ดูว่าล็อกใดอยู่ในสแต็กเทรซ จากนั้นข้ามไปที่เธรดที่ล็อกไว้
  • ถามจำนวนอินสแตนซ์ที่มีอยู่ของชั้นเรียนที่กำหนด ขอดูอินสแตนซ์ และดูว่าการอ้างอิงใดที่ทำให้วัตถุมีชีวิตอยู่
  • กรองเหตุการณ์ (เช่น เบรกพอยต์) สำหรับอินสแตนซ์เฉพาะ
  • ดูค่าที่ส่งคืนโดยเมธอดเมื่อออกจากเมธอด (โดยใช้เหตุการณ์ "method-exit")
  • ตั้งค่าจุดเฝ้าระวังภาคสนามเพื่อระงับการทำงานของโปรแกรมเมื่อมีการเข้าถึงและ/หรือแก้ไขฟิลด์เฉพาะ

ปรับปรุงรายละเอียดการวินิจฉัยในข้อยกเว้นและรายงานข้อขัดข้อง

ART ให้บริบทและรายละเอียดแก่คุณมากที่สุดเมื่อเกิดข้อยกเว้นรันไทม์ ART ให้รายละเอียดข้อยกเว้นแบบขยายสำหรับ java.lang.ClassCastException , java.lang.ClassNotFoundException และ java.lang.NullPointerException (Dalvik เวอร์ชันต่อมาได้ให้รายละเอียดข้อยกเว้นแบบขยายสำหรับ java.lang.ArrayIndexOutOfBoundsException และ java.lang.ArrayStoreException ซึ่งขณะนี้รวมขนาดของอาร์เรย์และออฟเซ็ตนอกขอบเขต และ ART ก็ดำเนินการด้วยเช่นกัน)

ตัวอย่างเช่น java.lang.NullPointerException จะแสดงข้อมูลเกี่ยวกับสิ่งที่แอปพยายามทำกับตัวชี้ null เช่น ฟิลด์ที่แอปพยายามเขียนถึง หรือวิธีที่แอปพยายามเรียกใช้ ต่อไปนี้คือตัวอย่างทั่วไปบางส่วน:

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

ART ยังให้ข้อมูลบริบทที่ได้รับการปรับปรุงในรายงานข้อขัดข้องของแอพ โดยรวมทั้ง Java และข้อมูลสแต็กดั้งเดิม

การรายงานปัญหา

หากคุณพบปัญหาที่ไม่ได้เกิดจากปัญหา JNI ของแอป โปรดรายงานผ่าน Android Open Source Project Issue Tracker รวมรายงานข้อ adb bugreport และลิงก์ไปยังแอปใน Google Play Store หากมี มิฉะนั้น หากเป็นไปได้ ให้แนบ APK ที่ทำให้เกิดปัญหาซ้ำ