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

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

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

คุณสมบัติด้านศิลปะ

นี่คือคุณสมบัติหลักบางส่วนที่ ART นำมาใช้

การรวบรวมล่วงหน้า (AOT)

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

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

ปรับปรุงการรวบรวมขยะ

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

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

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

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 จะแสดงข้อมูลเกี่ยวกับสิ่งที่แอปพยายามทำกับตัวชี้ว่าง เช่น ช่องที่แอปพยายามเขียนถึง หรือวิธีที่แอปพยายามเรียกใช้ นี่คือตัวอย่างทั่วไปบางส่วน:

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 ที่ทำให้เกิดปัญหาซ้ำ