Uygulama Yanıt Vermiyor (ANR) hataları, uygulamanın kullanıcı arayüzü iş parçacığı 5 saniyeden uzun süre yanıt vermediğinde tetiklenir. ANR'ler ve ANR'leri teşhis etme hakkında daha fazla bilgiyi Android belgelerinde bulabilirsiniz.
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
etiketiyle ek açıklamaya sahiptir.
Sorunlu ileti dizisi, uygulamanın ana mesaj dizisi veya yanıt vermeyen herhangi bir ileti dizisi olabilir. Ancak Triggered ANR
olarak etiketlenen ileti dizisi, ANR'nin asıl nedeni olabilir veya olmayabilir. Crashlytics, bu ANR'lerle ilgili hata ayıklama ve düzeltme bilgileri sağlamak için ANR'de yer alan diğer ileti dizilerini de etiketler. Bu sayfanın aşağıdaki bölümlerinde, bir ileti dizisine uygulanabilecek diğer etiketler hakkında bilgi edinebilirsiniz.
Deadlocked
ANR'ye yol açan bir kilitlenmede yer aldığı tespit edilen tüm ileti dizileri bu Deadlocked
etiketiyle ek açıklamaya sahiptir.
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
ileti dizisini engelleyen tüm iş parçacıkları IO Root blocking
etiketiyle ek açıklamaya sahiptir. Triggered ANR
mesaj dizisi diğer mesaj dizileri tarafından engellenmezse IO Root blocking
mesaj dizisi de Root blocking
mesaj dizisidir.
Ö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
ise ana iş parçacığında gerçekleşen istenmeyen G/Ç işlemlerini tespit etmek için Katı Mod'u da kullanabilirsiniz.
Root blocking
Triggered ANR
olarak etiketlenen ileti dizisini engelleyen tüm ileti dizileri Root blocking
etiketiyle ek açıklamaya sahiptir. Bir ileti dizisi hem Root blocking
hem de Triggered ANR
olarak etiketlenirse bu ileti dizisini engelleyen başka ileti dizileri yoktur.
Diğer iş parçacıklarını bekleyen (belki de dolaylı olarak) Triggered ANR
iş parçacıkları Root blocking
olarak işaretlenir. Bir iş parçacığının ANR'nin temel nedeni olmasının çeşitli nedenleri olabilir.
Ö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
etiketiyle etiketlenir ancak ANR oluştuğunda işlemde boştadır. Crashlytics, temel nedeni belirlemek için yeterli bilgiye sahip değil. Bu ANR'nin nedeni net değil.
Ö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 5 saniye boyunca meşgul olabileceği yerleri tanımlayın.