Android uygulamanızda Crashlytics kontrol panelindeki ANR etiketlerine dayalı hata ayıklayın

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.

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.

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.

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.

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.