Uygulama Yanıt Vermiyor (ANR) hataları, uygulamanın kullanıcı arayüzü iş parçacığı
Ayrıca Crashlytics, sorunlu mesaj dizilerini tespit etmenize yardımcı olabilir. ANR'leri analiz ettikten sonra, Crashlytics kontrol panelinde ANR'nin nasıl hata ayıklanacağına dair ipuçları sağlamak için geçerli ileti dizilerini etiketleriz.
Bu sayfada yer alan aşağıdaki bölümlerde her ANR etiketinin ne anlama geldiği açıklanır, ilgili etiketin kullanıldığı örnek bir ANR gösterilir ve ANR'de hata ayıklama için önerilen bir çözüm sunulur.
Triggered ANR
Çok uzun süre engellendiğinden ANR'yi tetikleyen ileti dizileri bu Triggered ANR
Sorunlu ileti dizisi, uygulamanın ana mesaj dizisi veya yanıt vermeyen herhangi bir ileti dizisi olabilir. Ancak Triggered ANR
Deadlocked
ANR'ye yol açan bir kilitlenmede yer aldığı tespit edilen tüm ileti dizileri bu Deadlocked
Gerekli bir kaynak başka bir iş parçacığı tarafından tutulduğu için bir iş parçacığı bekleme durumuna girdiğinde kilitlenme meydana gelir. Bu iş parçacığı da ilk iş parçacığı tarafından tutulan bir kaynağı bekler. Uygulamanın ana iş parçacığı bu durumdaysa ANR'lerin gerçekleşmesi muhtemeldir.
Örneği görüntüleyin
Kilitlenmeyle ilgili iki ileti dizisi aşağıda verilmiştir:
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)
Öneri
Kilitlenmeye neden olan iş parçacıklarını inceleyin ve bu iş parçacıkları tarafından edinilen kaynakları/kilitleri kontrol edin. Olası çözümler için Kilitlenme ve Kilitlenmeyi önleme algoritmaları başlıklı makalelere bakın.
IO Root blocking
Yavaş G/Ç işlemleri yürüten ve Triggered ANR
IO Root blocking
Triggered ANR
IO Root blocking
Root blocking
Örnekleri göster
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 )
Öneri
Genel olarak, uygulamanız ana iş parçacığında pahalı G/Ç işlemleri yürütmemelidir. Ana iş parçacığı IO Root blocking
Root blocking
Triggered ANR
Root blocking
Root blocking
Triggered ANR
Diğer iş parçacıklarını bekleyen (belki de dolaylı olarak) Triggered ANR
Root blocking
Örnekleri göster
Mesaj dizisi durumuna göre birkaç örnek aşağıda verilmiştir:
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 )
Öneri
Ana iş parçacığında CPU'yu yoğun olarak kullanan işleri en aza indirin. CPU'yu yoğun olarak kullanan görevleri gerçekleştirmek için işleyici veya arka plan iş parçacıklarını kullanın.
Ana iş parçacığında, veritabanından yükleme gibi yoğun G/Ç çalışmalarını en aza indirin.
Unknown root cause
ANR'yi tetikleyen ileti dizisi Unknown root cause
Örneği görüntüleyin
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 )
Öneri
ANR'leri önlemeyle ilgili genel tavsiyeleri uygulayın. Örneğin, kodunuzda uygulamanın ana iş parçacığının