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 ileti dizilerini tespit etmenize yardımcı olabilir. ANR'leri analiz eder, ardından DevOps ve Etkileşim > Crashlytics kontrol paneli'nde geçerli mesaj dizilerini etiketleyerek ANR'de hata ayıklama konusunda ipuçları veririz.
Bu sayfadaki aşağıdaki bölümlerde her bir ANR etiketinin ne anlama geldiği açıklanmakta, bu etikete sahip örnek bir ANR gösterilmekte ve ANR'de hata ayıklama için önerilen bir çözüm sunulmaktadır.
Triggered ANR
Çok uzun süre engellenen ve ANR'yi tetikleyen bir iş parçacığı bu Triggered ANR etiketiyle ek açıklama alır.
Sorunlu iş parçacığı, uygulamanın ana iş parçacığı veya yanıt vermediği tespit edilen herhangi bir iş parçacığı olabilir. Ancak Triggered ANR olarak etiketlenen iş parçacığı, ANR'nin asıl nedeni olabilir veya olmayabilir. Crashlytics, bu ANR'lerde hata ayıklama ve düzeltme için analizler sağlamak amacıyla ANR'ye dahil olan diğer mesaj dizilerini de etiketler. Bu sayfanın sonraki bölümlerinde, bir ileti dizisine uygulanabilecek diğer etiketler hakkında bilgi edinebilirsiniz.
Deadlocked
ANR'ye yol açan bir kilitlenmeye dahil olduğu tespit edilen tüm iş parçacıkları bu Deadlocked etiketiyle ek açıklama alır.
Kilitlenme, bir iş parçacığının bekleme durumuna girmesiyle oluşur. Bunun nedeni, gerekli bir kaynağın başka bir iş parçacığı tarafından tutulmasıdır. Bu iş parçacığı da ilk iş parçacığı tarafından tutulan bir kaynağı beklemektedir. Uygulamanın ana iş parçacığı bu durumdaysa ANR'ler meydana gelebilir.
Örneği göster
Kilitlenmeye neden olan iki iş parçacığı aşağıda gösterilmiş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 dahil olan ileti dizilerine bakın ve bu ileti dizileri tarafından edinilen kaynakları/kilitleri kontrol edin. Olası çözümler için Kilitlenme ve Kilitlenmeyi önleme algoritmaları başlıklı makaleleri inceleyin.
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 ek açıklama alır. Triggered ANR iş parçacığı diğer iş parçacıkları tarafından engellenmiyorsa IO Root blocking iş parçacığı da Root blocking iş parçacığıdır.
Ö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 yüksek maliyetli G/Ç işlemleri yürütmemelidir. Ana iş parçacığının IO Root blocking olması durumunda, ana iş parçacığında gerçekleşen istenmeyen G/Ç işlemlerini belirlemek için yüksek düzey modunu da kullanabilirsiniz.
Root blocking
Triggered ANR olarak etiketlenen ileti dizisini engelleyen tüm ileti dizileri Root blocking etiketiyle ek açıklama alır. Bir mesaj dizisi hem Root blocking hem de Triggered ANR olarak etiketlenmişse bu mesaj dizisini engelleyen başka bir mesaj dizisi yoktur.
Diğer iş parçacıklarını bekleyen (geçişli olarak da olabilir) Triggered ANR iş parçacıkları varsa bunlar Root blocking. Bir iş parçacığının ANR'nin temel nedeni olmasının çeşitli nedenleri olabilir.
Örnekleri göster
İleti dizisi durumuna göre birkaç örnek:
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ğunluklu işleri en aza indirin. CPU yoğunluklu görevleri gerçekleştirmek için çalışan veya arka plan iş parçacıkları kullanın.
Ana iş parçacığında, veritabanından yükleme gibi G/Ç yoğunluklu işleri en aza indirin.
Unknown root cause
ANR'yi tetikleyen ancak ANR gerçekleştiğinde işlemde boşta olan bir iş parçacığı Unknown root cause etiketiyle etiketlenir. Crashlytics, temel nedeni belirlemek için yeterli bilgiye sahip değil. Bu ANR'nin neden oluştuğuna dair belirgin bir neden yok.
Örneği göster
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 önerileri uygulayın. Örneğin, kodunuzda uygulamanın ana iş parçacığının 5 saniyeden uzun süre meşgul olabileceği yerleri belirleyin.
Waiting for binder call
Bir bağlayıcı çağrısı bekleyen ve Triggered ANR iş parçacığını engelleyen tüm iş parçacıkları Waiting for binder call etiketiyle ek açıklama alır. Triggered ANR iş parçacığı başka iş parçacıkları tarafından engellenmiyorsa Waiting for binder call iş parçacığı da bir Root blocking iş parçacığıdır.
Örneği göster
Thread main(THREAD_STATE_NATIVE_WAITING)
syscall
android::IPCThreadState::talkWithDriver(bool)
android::IPCThreadState::waitForResponse(android::Parcel*, int*)
android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)
android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)
android_os_BinderProxy_transact(_JNIEnv*, _jobject*, int, _jobject*, _jobject*, int)
android.os.BinderProxy.transactNative( BinderProxy.java:0 )
android.os.BinderProxy.transact( BinderProxy.java:540 )
android.app.IActivityManager$Stub$Proxy.getContentProvider( IActivityManager.java:5945 )
android.app.ActivityThread.acquireProvider( ActivityThread.java:7138 )
android.app.ActivityThread$H.handleMessage( ActivityThread.java:1982 )
android.os.Handler.dispatchMessage( Handler.java:106 )
android.os.Looper.loop( Looper.java:236 )
android.app.ActivityThread.main( ActivityThread.java:8037 )
Öneri
Bağlayıcı çağrısının gecikmesi öngörülemez olabileceğinden bağlayıcı çağrılarını G/Ç işlemleri gibi ele alın ve mümkün olduğunda ana iş parçacığında yapmaktan kaçının. Bağlayıcı çağrılarını (bağlayıcı işlemleriyle sonuçlanan platform API çağrıları dahil) tetikleyen kodu bir arka plan ileti dizisine taşıyın veya ana ileti dizisinden çağrı yapılması kaçınılmazsa sonuçları önbelleğe alın.