ข้อผิดพลาด Application Not Responding (ANR) จะเกิดขึ้นเมื่อเธรด UI ของ
แอปพลิเคชันไม่ตอบสนองนานกว่า 5 วินาที อ่านเพิ่มเติมเกี่ยวกับ ANR และการวินิจฉัย ANR ได้ใน
เอกสารประกอบของ Android
นอกจากนี้ Crashlytics ยังช่วยระบุเธรดที่มีปัญหาได้ด้วย เราจะวิเคราะห์ ANR แล้วติดแท็กเทรดที่เกี่ยวข้องในแดชบอร์ด DevOps และความผูกพัน > Crashlytics เพื่อให้คำแนะนำเกี่ยวกับวิธีแก้ไขข้อบกพร่องของ ANR
ส่วนต่อไปนี้ในหน้านี้จะอธิบายความหมายของแท็ก ANR แต่ละแท็ก แสดงตัวอย่าง ANR ที่มีแท็กนั้น และแนะนำวิธีแก้ปัญหาเพื่อแก้ไขข้อบกพร่องของ ANR
Triggered ANR
เธรดที่ถูกบล็อกนานเกินไปและเรียกให้เกิด ANR จะมีคำอธิบายประกอบด้วย
แท็ก Triggered ANR นี้
เธรดที่มีปัญหาอาจเป็นเธรดหลักของแอปหรือเธรดใดก็ตามที่พบว่าไม่ตอบสนอง อย่างไรก็ตาม เธรดที่ติดแท็กเป็น
Triggered ANR อาจเป็นหรือไม่เป็นสาเหตุ ที่แท้จริง ของ
ANR ก็ได้ เพื่อให้ข้อมูลเชิงลึกสำหรับการแก้ไขข้อบกพร่องและแก้ไข ANR เหล่านี้
Crashlytics ยังติดแท็กเธรดอื่นๆ ที่เกี่ยวข้องกับ ANR ด้วย ดูข้อมูลเกี่ยวกับแท็กอื่นๆ ที่อาจใช้กับเธรดได้ในส่วนต่อไปนี้ของหน้านี้
Deadlocked
เธรดใดก็ตามที่พบว่าเกี่ยวข้องกับการติดตายซึ่งนำไปสู่ ANR จะมี
คำอธิบายประกอบด้วยแท็ก Deadlocked นี้
การติดตายเกิดขึ้นเมื่อเธรดเข้าสู่สถานะรอเนื่องจากทรัพยากรที่จำเป็นถูกเธรดอื่นถือครองอยู่ ซึ่งเธรดนั้นก็รอทรัพยากรที่เธรดแรกถือครองอยู่เช่นกัน หากเธรดหลักของแอปอยู่ในสถานการณ์นี้ ANR มีแนวโน้มที่จะเกิดขึ้น
ดูตัวอย่าง
ตัวอย่างเธรด 2 รายการที่เกี่ยวข้องกับการติดตาย
main (unknown): tid=1 systid=1568
com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.getPackage(PackageManagerService.java:22701)
com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.filterOnlySystemPackages(PackageManagerService.java:22787)
...
com.android.server.SystemServer.main(SystemServer.java:368)
java.lang.reflect.Method.invoke(Native method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:517)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)
ActivityManager (unknown): tid=21 systid=1902
com.android.server.pm.PackageManagerService.getPackageSetting(PackageManagerService.java:23618)
com.android.server.pm.PackageManagerService.getPackageUid(PackageManagerService.java:4542)
...
android.os.Handler.handleCallback(Handler.java:907)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:216)
android.os.HandlerThread.run(HandlerThread.java:67)
com.android.server.ServiceThread.run(ServiceThread.java:44)
คำแนะนำ
ดูเธรดที่เกี่ยวข้องกับการติดตายและตรวจสอบทรัพยากร/การล็อกที่เธรดเหล่านั้นได้รับ ดูวิธีแก้ปัญหาที่เป็นไปได้ใน
อัลกอริทึมการติดตาย และ
อัลกอริทึมการป้องกันการติดตาย
IO Root blocking
เธรดใดก็ตามที่ดำเนินการ I/O ช้าและบล็อกเธรด
Triggered ANR จะมีคำอธิบายประกอบด้วยแท็ก
IO Root blocking หากเธรด
Triggered ANR ไม่ถูกบล็อกโดยเธรดอื่น
เธรด IO Root blocking จะเป็นเธรด
Root blocking ด้วย
ดูตัวอย่าง
Thread main(THREAD_STATE_TIMED_WAITING)
sun.misc.Unsafe.park( Unsafe.java:0 )
java.util.concurrent.locks.LockSupport.parkNanos( LockSupport.java:230 )
android.database.sqlite.SQLiteConnectionPool.waitForConnection( SQLiteConnectionPool.java:756 )
...
android.app.ActivityThread.main( ActivityThread.java:8192 )
Thread main(THREAD_STATE_NATIVE_WAITING)
Syscall
art::ConditionVariable::WaitHoldingLocks(art::Thread*)
art::GoToRunnable(art::Thread*)
art::JniMethodEnd(unsigned int, art::Thread*)
libcore.io.Linux.fdatasync( Linux.java:0 )
libcore.io.ForwardingOs.fdatasync( ForwardingOs.java:105 )
...
java.io.RandomAccessFile.write( RandomAccessFile.java:559 )
...
android.app.ActivityThread.main( ActivityThread.java:8192 )
คำแนะนำ
โดยทั่วไปแล้ว แอปไม่ควรดำเนินการ I/O ที่ใช้ทรัพยากรมากในเธรดหลัก ในกรณีที่เธรดหลักเป็น
IO Root blocking คุณยังใช้
โหมดเข้มงวด
เพื่อระบุการดำเนินการ I/O ที่ไม่ได้ตั้งใจซึ่งเกิดขึ้นในเธรดหลัก
ได้ด้วย
Root blocking
เธรดใดก็ตามที่บล็อกเธรดที่ติดแท็ก
Triggered ANR จะมีคำอธิบายประกอบด้วยแท101}Root blocking หากเธรดได้รับการติดแท็กว่าเป็นทั้ง
Root blocking และ
Triggered ANR หมายความว่าจะไม่มีเธรดอื่นมา
บล็อกเธรดนั้น
หากเธรด Triggered ANR ใดรอเธรดอื่น (อาจรอแบบทรานซิทีฟ) เธรดนั้นจะเป็น
Root blocking อาจมีสาเหตุต่างๆ ที่ทำให้เธรดเป็นสาเหตุของ ANR
ดูตัวอย่าง
ตัวอย่างบางส่วนตามสถานะเธรด
Thread main(THREAD_STATE_RUNNABLE)
android.os.Parcel.createTypedArray( Parcel.java:3086 )
android.content.pm.PackageInfo.<init>( PackageInfo.java:546 )
...
android.app.ActivityThread$H.handleMessage( ActivityThread.java:2166 )
android.os.Handler.dispatchMessage( Handler.java:106 )
android.os.Looper.loop( Looper.java:246 )
android.app.ActivityThread.main( ActivityThread.java:8633 )
Thread main(THREAD_STATE_BLOCKED)
DBHelper.runOnDB( DBHelper.java:97 )
DBHelper.runDb( DBHelper.java:125 )
...
java.lang.reflect.Method.invoke( Method.java:0 )
EventBus.invokeSubscriber( EventBus.java:510 )
postToSubscription( EventBus.java:437 )
...
android.os.Handler.handleCallback( Handler.java:938 )
android.os.Handler.dispatchMessage( Handler.java:99 )
android.os.Looper.loop( Looper.java:268 )
android.app.ActivityThread.main( ActivityThread.java:7904 )
คำแนะนำ
ลดงานที่ใช้ CPU มากในเธรดหลัก ใช้เธรดงานหรือเธรดเบื้องหลังเพื่อทำงานที่ใช้ CPU มาก
ลดงานที่ใช้ I/O มาก เช่น การโหลดจากฐานข้อมูล ในเธรดหลัก
Unknown root cause
เธรดจะได้รับการติดแท็ก Unknown root cause หากเป็นเธรดที่เรียกให้เกิด ANR แต่ไม่มีการใช้งานในกระบวนการเมื่อเกิด ANR Crashlytics ไม่มีข้อมูลเพียงพอที่จะระบุ
สาเหตุ ไม่มีเหตุผลที่ชัดเจนว่าทำไม ANR นี้จึงเกิดขึ้น
ดูตัวอย่าง
Thread main(THREAD_STATE_NATIVE_WAITING) __epoll_pwait
android::Looper::pollInner(int)
android::Looper::pollOnce(int, int*, int*, void**)
android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int)
android.os.MessageQueue.nativePollOnce( MessageQueue.java:0 )
android.os.MessageQueue.next( MessageQueue.java:335 )
android.os.Looper.loop( Looper.java:193 )
android.app.ActivityThread.main( ActivityThread.java:8019 )
คำแนะนำ
ทำตามคำแนะนำทั่วไปเกี่ยวกับวิธีป้องกัน ANR เช่น ระบุตำแหน่งในโค้ดที่เธรดหลักของแอปอาจไม่ว่างนานกว่า
5 วินาที