Error Aplikasi Tidak Merespons (ANR) dipicu saat UI thread aplikasi tidak merespons selama lebih dari
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
Thread yang bermasalah dapat berupa thread utama untuk aplikasi, atau thread apa pun yang diketahui tidak responsif. Namun, thread yang ditandai sebagai Triggered ANR
Deadlocked
Setiap thread yang diketahui terlibat dalam deadlock yang menyebabkan ANR diberi anotasi dengan tag Deadlocked
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
IO Root blocking
Triggered ANR
IO Root blocking
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
Root blocking
Setiap thread yang memblokir thread yang diberi tag
Triggered ANR
Root blocking
Root blocking
Triggered ANR
Jika terdapat thread Triggered ANR
Root blocking
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
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