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 eder ve ardından ANR'nin nasıl ayıklanacağına dair ipuçları sağlamak için Crashlytics kontrol panelinde 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 ileti dizisi veya yanıt vermediği tespit edilen 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'ye dahil olan 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
Kilitlenme sorunuyla ilgili iki ileti dizisini aşağıda görebilirsiniz:
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
Kilitlenmeyle ilişkili ileti dizilerine bakın 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
iş parçacığını engelleyen tüm iş parçacıkları, IO Root blocking
etiketiyle belirtilir. Triggered ANR
mesaj dizisi diğer mesaj dizileri tarafından engellenmezse IO Root blocking
mesaj dizisi de Root blocking
mesaj dizisidir.
Örnekleri görüntüleyin
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 dizilerinde Root blocking
etiketi bulunur. Bir ileti dizisi hem Root blocking
hem de Triggered ANR
olarak etiketlenmişse bu ileti dizisini engelleyen başka ileti dizisi yoktur.
Diğer ileti dizileri için bekleyen (belki de geçişli olarak) Triggered ANR
ileti dizileri varsa bunlar Root blocking
şeklindedir. Bir iş parçacığının ANR'nin temel nedeni olmasının çeşitli nedenleri olabilir.
Örnekleri görüntüleyin
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 ancak ANR oluştuğunda işlemde boşta olan bir ileti dizisi Unknown root cause
etiketiyle etiketlenir. Crashlytics, sorunun temel nedenini 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.