รันไทม์ Android และ Dalvik

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

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

ฟีเจอร์ ART

ฟีเจอร์หลักๆ ที่ ART นำมาใช้มีดังนี้

การคอมไพล์ล่วงหน้า (AOT)

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

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

การจัดการหน่วยความจําที่ไม่ใช้แล้วที่ดีขึ้น

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

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

การปรับปรุงการพัฒนาและการแก้ไขข้อบกพร่อง

ART มีฟีเจอร์หลายอย่างที่ช่วยปรับปรุงการพัฒนาแอปและการแก้ไขข้อบกพร่อง

การรองรับเครื่องมือวิเคราะห์การสุ่มตัวอย่าง

ที่ผ่านมา นักพัฒนาแอปใช้เครื่องมือ 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 ใส่ adb bugreport และลิงก์ไปยังแอปใน Google Play Store หากมี หรือแนบ APK ที่ทำให้เกิดปัญหาซ้ำ (หากเป็นไปได้)