แก้ไขข้อบกพร่องแอป Android ตามแท็ก ANR ในหน้าแดชบอร์ด Crashlytics

ข้อผิดพลาดแอปพลิเคชันไม่ตอบสนอง (ANR) จะเกิดขึ้นเมื่อเธรด UI ของแอปพลิเคชันไม่ตอบสนองนานกว่า 5 วินาที อ่านข้อมูลเพิ่มเติมเกี่ยวกับ ANR และการวินิจฉัย ANR ได้ในเอกสารประกอบของ Android

นอกจากนี้ Crashlytics ยังช่วยระบุชุดข้อความที่มีปัญหาได้ด้วย เราจะวิเคราะห์ ANR จากนั้นในแดชบอร์ด DevOps และการมีส่วนร่วม > Crashlytics เราจะติดแท็กเทรดที่เกี่ยวข้องเพื่อให้คำแนะนำเกี่ยวกับวิธีแก้ไขข้อบกพร่อง ANR

ส่วนต่อไปนี้ในหน้านี้จะอธิบายความหมายของแท็ก ANR แต่ละแท็ก แสดงตัวอย่าง ANR ที่มีแท็กนั้น และให้โซลูชันที่แนะนำในการแก้ไขข้อบกพร่อง ANR

Triggered ANR

เทรดที่ถูกบล็อกนานเกินไปและทริกเกอร์ ANR จะมีคำอธิบายประกอบเป็นแท็ก Triggered ANR นี้

ชุดข้อความที่มีปัญหาอาจเป็นชุดข้อความหลักของแอป หรือชุดข้อความใดก็ตามที่พบว่าไม่ตอบสนอง อย่างไรก็ตาม เทรดที่ติดแท็กเป็น Triggered ANR อาจเป็นหรือไม่เป็นสาเหตุที่แท้จริงของ ANR ก็ได้ Crashlytics ยังติดแท็กชุดข้อความอื่นๆ ที่เกี่ยวข้องกับ ANR เพื่อให้ข้อมูลเชิงลึกสำหรับการแก้ไขข้อบกพร่องและแก้ไข ANR เหล่านี้ด้วย ในส่วนถัดไปของหน้านี้ คุณจะได้เรียนรู้เกี่ยวกับแท็กอื่นๆ ที่สามารถใช้กับชุดข้อความได้

Deadlocked

ชุดข้อความที่พบว่าเกี่ยวข้องกับการหยุดชะงักที่นำไปสู่ ANR จะมีคำอธิบายประกอบด้วยแท็ก Deadlocked นี้

เดดล็อกจะเกิดขึ้นเมื่อเทรดเข้าสู่สถานะรอเนื่องจากเทรดอื่นมีทรัพยากรที่จำเป็น ซึ่งเทรดนั้นก็กำลังรอทรัพยากรที่เทรดแรกมีอยู่เช่นกัน หากเทรดหลักของแอปอยู่ในสถานการณ์นี้ ก็มีแนวโน้มที่จะเกิด ANR

คำแนะนำ

ดูชุดข้อความที่เกี่ยวข้องกับ Deadlock และตรวจสอบทรัพยากร/ล็อกที่ชุดข้อความเหล่านั้นได้รับ โปรดดูวิธีแก้ปัญหาที่เป็นไปได้ที่หัวข้อภาวะติดตายและอัลกอริทึมการป้องกันภาวะติดตาย

IO Root blocking

เทรดที่ดำเนินการ I/O ช้าและบล็อกเทรด Triggered ANR จะมีคำอธิบายประกอบเป็นแท็ก IO Root blocking หากเทรด Triggered ANR ไม่ถูกบล็อกโดยเทรดอื่นๆ เทรด IO Root blocking ก็จะเป็นเทรด Root blocking ด้วย

คำแนะนำ

โดยทั่วไปแล้ว แอปไม่ควรดำเนินการ I/O ที่ใช้ทรัพยากรมากในเทรดหลัก ในกรณีที่เทรดหลักIO Root blocking คุณยังใช้โหมดเข้มงวดเพื่อระบุการดำเนินการ I/O ที่ไม่ได้ตั้งใจซึ่งเกิดขึ้นในเทรดหลักได้ด้วย

Root blocking

ชุดข้อความที่บล็อกชุดข้อความที่ติดแท็กเป็น Triggered ANR จะมีคำอธิบายประกอบเป็นแท็ก Root blocking หากชุดข้อความมีการติดแท็กทั้ง Root blocking และ Triggered ANR แสดงว่าไม่มีชุดข้อความอื่นที่บล็อกชุดข้อความนั้น

หากมีเทรด Triggered ANR ใดๆ กำลังรอ (อาจเป็นแบบสกรรมกริยา) เทรดอื่นๆ เทรดเหล่านั้นจะRoot blocking อาจมีสาเหตุหลายประการที่ทำให้เทรดเป็นสาเหตุของปัญหา ANR

คำแนะนำ

ลดงานที่ใช้ CPU มากในเทรดหลัก ใช้เทรดของผู้ปฏิบัติงานหรือเทรดเบื้องหลังเพื่อทำงานที่ใช้ CPU มาก

ลดงานที่ต้องใช้ I/O มาก เช่น การโหลดจากฐานข้อมูลในเทรดหลัก

Unknown root cause

เทรดจะได้รับการติดแท็ก Unknown root cause หากเป็นเทรดที่ทริกเกอร์ ANR แต่ไม่มีการทำงานในกระบวนการเมื่อเกิด ANR Crashlytics มีข้อมูลไม่เพียงพอที่จะระบุสาเหตุของปัญหา ไม่มีสาเหตุที่ชัดเจนว่าทำไม ANR นี้จึงเกิดขึ้น

คำแนะนำ

ทำตามคำแนะนำทั่วไปเกี่ยวกับวิธีป้องกัน ANR ตัวอย่างเช่น ระบุตำแหน่งในโค้ดที่เทรดหลักของแอปอาจไม่ว่างนานกว่า 5 วินาที

Waiting for binder call

เทรดที่รอการเรียก Binder และบล็อกเทรด Triggered ANR จะมีคำอธิบายประกอบเป็นแท็ก Waiting for binder call หากเทรด Triggered ANR ไม่ถูกบล็อกโดยเทรดอื่นๆ เทรด Waiting for binder call ก็จะเป็นเทรด Root blocking ด้วย

คำแนะนำ

เนื่องจากเวลาในการตอบสนองของการเรียกใช้ Binder อาจคาดการณ์ไม่ได้ ให้จัดการกับการเรียกใช้ Binder เหมือนกับการดําเนินการ I/O และหลีกเลี่ยงการเรียกใช้ในเทรดหลักเมื่อเป็นไปได้ ย้ายโค้ดที่ทำให้เกิดการเรียกใช้ Binder (รวมถึงการเรียก API ของแพลตฟอร์มที่ส่งผลให้เกิดธุรกรรม Binder) ไปยังเทรดที่ทำงานอยู่เบื้องหลัง หรือแคชผลลัพธ์หากหลีกเลี่ยงการเรียกใช้จากเทรดหลักไม่ได้