Error Aplikasi Tidak Merespons (ANR) dipicu saat UI thread aplikasi tidak merespons selama lebih dari 5 detik. Anda dapat membaca informasi lebih lanjut tentang ANR dan diagnosis ANR di dokumentasi Android.
Selain itu, Crashlytics dapat membantu menentukan thread tertentu yang bermasalah. Kami menganalisis ANR, lalu di dasbor Crashlytics, kami memberi tag pada thread yang berlaku untuk memberikan petunjuk tentang cara men-debug ANR.
Bagian berikut di halaman ini menjelaskan arti setiap tag ANR, menunjukkan contoh ANR dengan tag tersebut, dan memberikan solusi yang direkomendasikan untuk men-debug ANR.
Triggered ANR
Thread pesan yang diblokir terlalu lama dan memicu ANR dianotasi dengan tag Triggered ANR
ini.
Thread yang bermasalah dapat berupa thread utama untuk aplikasi, atau thread apa pun yang diketahui tidak responsif. Namun, thread yang ditandai sebagai Triggered ANR
mungkin merupakan penyebab sebenarnya dari ANR, tetapi mungkin juga bukan. Untuk memberikan insight mengenai proses debug dan perbaikan ANR ini, Crashlytics juga memberikan tag pada thread lain yang terlibat dalam ANR. Di bagian berikut ini, pelajari tag lain yang dapat diterapkan ke thread.
Deadlocked
Setiap thread yang diketahui terlibat dalam deadlock yang menyebabkan ANR diberi anotasi dengan tag Deadlocked
ini.
Deadlock terjadi saat thread memasuki status menunggu karena resource yang diperlukan ditahan oleh thread lain, yang juga menunggu resource yang ditahan oleh thread pertama. Jika thread utama aplikasi mengalami situasi ini, ANR mungkin terjadi.
Lihat contoh
Berikut adalah dua thread yang mengalami deadlock:
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)
Rekomendasi
Lihat thread yang terlibat dalam deadlock dan periksa resource/kunci yang diperoleh oleh thread tersebut. Lihat
Deadlock dan
Algoritme pencegahan deadlock
untuk kemungkinan solusi.
IO Root blocking
Setiap thread yang menjalankan operasi I/O yang lambat dan memblokir
thread Triggered ANR
dianotasi dengan
tag IO Root blocking
. Jika
thread Triggered ANR
tidak diblokir oleh thread lain,
thread IO Root blocking
juga merupakan
Root blocking
.
Lihat contoh
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 )
Rekomendasi
Secara umum, aplikasi Anda tidak boleh menjalankan operasi I/O yang mahal di thread utama. Jika thread utama merupakan
IO Root blocking
, Anda juga dapat menggunakan
Mode Ketat
untuk mengidentifikasi operasi I/O yang tidak disengaja yang terjadi di thread
utama.
Root blocking
Setiap thread yang memblokir thread yang diberi tag
Triggered ANR
dianotasi dengan
tag Root blocking
. Jika thread diberi tag
Root blocking
dan
Triggered ANR
, maka tidak ada thread lain yang
memblokir thread tersebut.
Jika terdapat thread Triggered ANR
yang sedang menunggu (mungkin
secara transitif) untuk thread lain, thread tersebut
Root blocking
. Mungkin ada berbagai alasan mengapa thread merupakan akar penyebab ANR.
Lihat contoh
Berikut adalah beberapa contoh berdasarkan status thread:
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 )
Rekomendasi
Minimalkan pekerjaan intensif CPU di thread utama. Gunakan thread pekerja atau latar belakang untuk menjalankan tugas yang membebani CPU.
Minimalkan pekerjaan intensif I/O, seperti memuat dari database, pada thread utama.
Unknown root cause
Thread diberi tag Unknown root cause
jika thread tersebut memicu ANR, tetapi tidak ada aktivitas dalam proses saat ANR terjadi. Crashlytics tidak memiliki informasi yang cukup untuk menentukan akar masalah. Tidak ada alasan yang jelas mengapa ANR ini terjadi.
Lihat contoh
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 )
Rekomendasi
Ikuti saran umum tentang cara mencegah ANR. Misalnya, tentukan di mana saja thread utama aplikasi dapat sibuk selama lebih dari 5 detik di dalam kode Anda.