Android uygulamanızda Crashlytics kontrol panelindeki ANR etiketlerine dayalı hata ayıklayın
Koleksiyonlar ile düzeninizi koruyun
İçeriği tercihlerinize göre kaydedin ve kategorilere ayırı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'lerin teşhis edilmesi hakkında daha fazla bilgiyi Android belgelerinde bulabilirsiniz.
Ayrıca Crashlytics, sorunlu belirli iş parçacıklarını belirlemeye yardımcı olabilir. ANR'leri analiz ederiz. Ardından, Crashlytics kontrol panelinde, ANR'de nasıl hata ayıklama yapılacağıyla ilgili ipuçları vermek için geçerli iş parçacıklarını etiketleriz.
Bu sayfadaki aşağıdaki bölümlerde, her bir ANR etiketinin ne anlama geldiği açıklanmakta, bu etikete sahip bir örnek ANR gösterilmekte ve ANR'de hata ayıklamak için önerilen bir çözüm sunulmaktadır.
Triggered ANR
Çok uzun süre engellenen ve ANR'yi tetikleyen ileti dizisi, Triggered ANR
etiketiyle açıklama olarak eklenir.
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. Bu ANR'lerin hata ayıklaması ve düzeltilmesi için analizler sağlamak üzere,
Crashlytics ANR'ye dahil olan diğer tüm ileti dizilerini de etiketler. Bu sayfanın aşağıdaki bölümlerinde, bir ileti dizisine uygulanabilecek diğer etiketler hakkında bilgi edinin.
Deadlocked
ANR'ye yol açan bir kilitlenmeye karıştığı tespit edilen tüm ileti dizileri bu Deadlocked
etiketiyle açıklama eklenir.
Bir iş parçacığı, gerekli bir kaynak başka bir iş parçacığı tarafından tutulduğu için bekleme durumuna girdiğinde kilitlenme oluşur. Bu iş parçacığı da ilk iş parçacığı tarafından tutulan bir kaynağı beklemektedir. Uygulamanın ana iş parçacığı bu durumdaysa ANR'lerin oluşması muhtemeldir.
Örneği göster
Kilitlenmeye neden olan 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
Kilitlenmeye dahil olan iş parçacıklarına bakın ve bu iş parçacıkları tarafından edinilen kaynakları/kilitleri kontrol edin. Olası çözümler için Kilitlenme ve Kilitlenme ö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 ileti dizileri IO Root blocking
etiketiyle açıklama eklenir. Triggered ANR
ileti dizisi diğer ileti dizileri tarafından engellenmezse IO Root blocking
ileti dizisi de Root blocking
ileti 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 maliyetli G/Ç işlemleri yürütmemelidir. Ana iş parçacığı IO Root blocking
olduğunda ana iş parçacığında gerçekleşen istenmeyen G/Ç işlemlerini belirlemek için katı modu da kullanabilirsiniz.
Root blocking
Triggered ANR
olarak etiketlenen ileti dizisini engelleyen tüm ileti dizileri Root blocking
etiketiyle açıklama eklenir. Bir ileti dizisi hem Root blocking
hem de Triggered ANR
olarak etiketlenirse bu ileti dizisini engelleyen başka ileti dizileri yoktur.
Herhangi bir Triggered ANR
iş parçacığı diğer iş parçacıklarının tamamlanmasını bekliyorsa (belki de geçişli olarak) Root blocking
. Bir iş parçacığının ANR'nin temel nedeni olmasının çeşitli nedenleri olabilir.
Örnekleri göster
İş parçacığı 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'yu yoğun olarak kullanan işleri en aza indirin. CPU'yu yoğun olarak kullanan görevleri gerçekleştirmek için çalışan veya arka plan iş parçacıklarını kullanın.
Ana iş parçacığında veritabanından yükleme gibi G/Ç yoğun işleri en aza indirin.
Unknown root cause
Bir ileti dizisi, ANR'yi tetikleyen ileti dizisi olmasına rağmen ANR oluştuğu sırada işlemde boşta ise 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 önleme ile ilgili genel tavsiyelere uyun. Örneğin, kodunuzda uygulamanın ana iş parçacığının 5 saniyeden uzun süre meşgul olabileceği yerleri belirleyin.