Uygulama Yanıt Vermiyor (ANR) hataları,
Uygulama 5 saniyeden uzun süredir yanıt vermiyor. Okuyabilirsiniz
ANR'ler ve ANR'leri teşhis etme hakkında daha fazla bilgi
Android dokümanları.
Ayrıca Crashlytics, belirli sorunlu iş parçacıklarını tespit etmenize yardımcı olabilir. Biz
ANR'leri analiz eder ve ardından Crashlytics kontrol panelinde
ANR'nin nasıl ayıklanacağıyla ilgili ipuçları sağlamak için geçerli ileti dizilerini etiketleyin.
Bu sayfanın aşağıdaki bölümlerinde, her bir ANR etiketinin ne anlama geldiği açıklanmakta ve
etiket oluşturur ve ANR'de hata ayıklamak için önerilen bir çözüm sunar.
Triggered ANR
Çok uzun süre engellenen ve ANR'yi tetikleyen bir ileti dizisine
bu Triggered ANR
etiketini kullanabilirsiniz.
Sorunlu ileti dizisi, uygulamanın ana ileti dizisi veya bulunan herhangi bir ileti dizisi olabilir.
yanıt vermemesini sağlayabilirsiniz. Ancak, ileti dizisi
İşlemin gerçek nedeni Triggered ANR
olabilir veya olmayabilir.
sorunu çözebilir. Bu ANR'lerle ilgili hata ayıklama ve düzeltme analizleri sağlamak için
Crashlytics, ANR'ye dahil olan diğer ileti dizilerini de etiketler.
bölümlerini takip ederek, etkilenebilecek diğer etiketler hakkında bilgi edinin.
ileti dizisine uygulandı.
Deadlocked
ANR'ye neden olan bir kilitlenmeye neden olduğu tespit edilen tüm ileti dizileri
bu Deadlocked
etiketiyle belirtilir.
Bir iş parçacığı zorunlu bir ayar nedeniyle bekleme durumuna girdiğinde
kaynağı başka bir iş parçacığı tarafından tutuluyor. Bu iş parçacığı da
ele alacağız. Uygulamanın ana iş parçacığı bu durumdaysa ANR'ler büyük olasılıkla
inceleyebilirsiniz.
Ö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 ilgili ileti dizilerine bakın ve edinilen kaynakları/kilitleri kontrol edin
. Referans
Kilitlenmeler ve
Kilitlenmeyi önleme algoritmaları
göz atabilirsiniz.
IO Root blocking
Yavaş G/Ç işlemleri yürüten ve
Triggered ANR
ileti dizisine
IO Root blocking
etiketi. Öğe
Triggered ANR
ileti dizisi, diğer ileti dizileri tarafından engellenmiyor.
IO Root blocking
ileti dizisi de bir
Root blocking
ileti dizisi.
Ö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
ileti dizisi. Bu örnekte,
IO Root blocking
, şunları da kullanabilirsiniz:
Yüksek Mod
ana sayfada gerçekleşen yanlışlıkla G/Ç işlemlerini belirlemek için
ileti dizisi.
Root blocking
olarak etiketlenen ileti dizisini engelleyen tüm ileti dizileri
Triggered ANR
Root blocking
etiketi. Bir ileti dizisi her ikisi olarak da etiketlenmişse
Root blocking
ve
Triggered ANR
ise başka ileti dizisi yoktur:
o ileti dizisini engelleyebilirsiniz.
Bekleyen Triggered ANR
ileti dizisi varsa (belki
geçişli) ise diğer iş parçacıkları için
Root blocking
. Bir iş kırılım yapısı oluşturmak üzere
ileti dizisi, ANR'nin temel nedeni.
Örnekleri görüntüleyin
Aşağıda ileti dizisi durumuna dayalı birkaç örnek 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 yoğun çalışmayı en aza indirin. Çalışan veya arka plan ileti dizilerini kullanma
tercih edebilirsiniz.
Ana iş parçacığında, veritabanından yükleme gibi G/Ç yoğun işleri en aza indirin.
Unknown root cause
Bir ileti dizisi aşağıdaki durumlarda Unknown root cause
etiketiyle etiketlenmişse
ANR'yi tetikleyen ileti dizisidir. Ancak,
ANR oluştu. Crashlytics, belirlemek için yeterli bilgiye sahip değil
neden olabilir. Bu ANR'nin oluşmasının belirgin bir nedeni yok.
Ö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 nasıl önleyeceğinizle ilgili genel tavsiyeyi uygulayın. Örneğin,
kodunuzda, uygulamanın ana iş parçacığının daha uzun süre meşgul olabileceği yerlerdir
5 saniye.