ANR (Application Not Responding) — adalah pemberitahuan sistem Android yang muncul ketika aplikasi tidak merespons input selama 5 detik. Berbeda dengan glitch (kesalahan logis tanpa memblokir UI) dan lag (perlambatan tanpa berhenti total), ANR adalah kegagalan kritis yang dicatat oleh sistem operasi: Android menampilkan dialog "Aplikasi Tidak Merespons" dengan tawaran untuk menutup atau menunggu. Menurut Android Vitals Documentation, aplikasi dengan tingkat ANR di atas 0,5% memiliki peringkat lebih rendah di Google Play dan dapat disembunyikan dari rekomendasi. Diagnosis meliputi analisis /data/anr/traces.txt, penggunaan StrictMode, dan pembuatan profil thread utama.
Poin Utama
ANR (Application Not Responding) — adalah mekanisme perlindungan pengguna di Android yang aktif ketika aplikasi berhenti merespons input. Sistem melacak waktu pemrosesan peristiwa: jika BroadcastReceiver tidak menyelesaikan onReceive dalam 10 detik, Service tidak kembali dari onCreate dalam 20 detik, dan ContentProvider tidak merespons dalam 15 detik — Android menghasilkan ANR.
Ketika ANR terjadi, Android menampilkan dialog sistem di atas semua jendela: "Aplikasi Tidak Merespons. Tutup atau tunggu?". Pengguna dapat menutup aplikasi atau menunggu pemulihannya. Jika ANR sering berulang, pengguna akan menghapus aplikasi. Google Play mempertimbangkan tingkat ANR — persentase sesi dengan ANR — dalam algoritma peringkat.
Di iOS tidak ada padanan ANR dengan dialog sistem. Sebagai gantinya, Apple menggunakan Watchdog yang menghentikan proses aplikasi dengan kode 0x8badf00d. Pengguna tidak melihat dialog — aplikasi hanya tertutup ke layar utama. Hal ini membuat ANR di Android lebih terlihat oleh pengguna, tetapi memberikan sistem lebih banyak informasi untuk diagnosis.
ANR terjadi ketika sistem melacak batas waktu untuk salah satu dari empat jenis komponen. Setiap komponen memiliki batas waktunya sendiri.
BroadcastReceiver dieksekusi di thread utama. Jika onReceive memulai permintaan jaringan sinkron, operasi penulisan panjang ke database, atau menunggu pemblokiran — setelah 10 detik ANR muncul. Solusi: gunakan goAsync() dan WorkManager untuk pemrosesan latar belakang. Skenario tipikal — menerima notifikasi Push dari FCM dan menyimpan sinkron di Room.
Service.onCreate dan Service.onStartCommand memiliki batas 20 detik. Jika layanan memulai inisialisasi berat (memuat pustaka, membaca konfigurasi dari jaringan) di thread utama — ANR tidak terhindarkan. Gunakan IntentService (usang) atau WorkManager untuk eksekusi terjamin di thread latar belakang.
ContentProvider.onCreate dieksekusi sebelum panggilan Application.onCreate dan memiliki batas 15 detik. Jika penyedia melakukan migrasi database, memuat kamus, atau inisialisasi SDK dari jaringan — ini menyebabkan ANR saat memulai aplikasi. Solusi: inisialisasi lazy, memindahkan operasi berat ke WorkManager.
Android menyediakan beberapa alat untuk analisis ANR: dari log sistem hingga pustaka khusus.
Pada setiap ANR, Android menyimpan file /data/anr/traces.txt dengan dump tumpukan semua thread aplikasi. Temukan thread "main" — metode terakhir di tumpukan menunjukkan penyebabnya. Pola tipikal: Thread.sleep(), InputStream.read(), BinderProxy.transact(). Untuk mengekstrak file dari perangkat, gunakan adb dengan hak superuser.
Firebase Crashlytics secara otomatis mengumpulkan ANR dan menampilkannya di dasbor bersama dengan pelacakan. Untuk Android 11+, laporan ANR datang dengan tumpukan lengkap thread utama. Integrasi memerlukan penambahan dependensi dan inisialisasi FirebaseApp di Application.onCreate.
CPU Profiler di Android Studio memungkinkan Anda merekam pelacakan kerja aplikasi dan melihat metode mana yang menghabiskan waktu CPU. Aktifkan "Record with method traces" dan reproduksi skenario yang menyebabkan ANR. Pada garis waktu akan terlihat metode mana yang dieksekusi di thread utama saat pembekuan.
Contoh integrasi Firebase Crashlytics untuk mengumpulkan ANR di Android:
class App : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
FirebaseCrashlytics.getInstance()
.setCrashlyticsCollectionEnabled(true)
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build())
}
}
Perbaikan ANR terutama berarti memindahkan semua operasi panjang dari thread utama ke thread latar belakang. Mari kita lihat teknik spesifik untuk setiap jenis komponen.
WorkManager — solusi yang direkomendasikan Google untuk pekerjaan latar belakang. Ini menjamin eksekusi tugas di thread latar belakang dengan mempertimbangkan status perangkat. Tidak seperti Service, WorkManager tidak memblokir thread utama dan tahan terhadap restart aplikasi. Untuk BroadcastReceiver, gunakan goAsync() dan teruskan hasil PendingResult ke WorkManager.
Jalankan semua permintaan jaringan, pekerjaan database, dan operasi file dengan Dispatchers.IO. Thread utama hanya boleh memperbarui UI. Gunakan viewModelScope untuk pembatalan otomatis coroutine saat Activity dihancurkan. Hindari runBlocking() dalam konteks apa pun — ini adalah pemblokiran sinkron thread saat ini.
Jika ContentProvider melakukan inisialisasi panjang, gunakan mekanisme pemuatan tertunda: buat penyedia yang segera mengembalikan data, dan jalankan inisialisasi berat melalui WorkManager dengan penundaan. Ini mencegah ANR saat memulai aplikasi, ketika sistem paling sensitif terhadap penundaan.
Contoh penggunaan BroadcastReceiver yang benar dengan goAsync di Android:
class FcmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val pendingResult = goAsync()
WorkManager.getInstance(context!!)
.enqueue(OneTimeWorkRequest.from(NotificationWorker::class.java))
pendingResult.finish()
}
}
Cara terbaik untuk melawan ANR adalah mencegah kemunculannya di tahap pengembangan melalui alat dan solusi arsitektur.
StrictMode dengan kebijakan detectNetwork() dan detectDiskReads()/detectDiskWrites() yang diaktifkan mendeteksi potensi ANR di tahap pengembangan. Di build Debug, atur penaltyDeath — setiap pelanggaran akan menyebabkan crash segera, dan pengembang akan melihat masalah sebelum commit.
Firebase Performance melacak waktu eksekusi operasi kunci dan menunjukkan skenario mana yang melebihi ambang ANR. Konfigurasikan pelacakan kustom untuk setiap layar dan permintaan jaringan. Jika waktu eksekusi melebihi 3 detik — ini adalah potensi ANR yang memerlukan optimasi.
Simulasikan kondisi lambat: batasi kecepatan jaringan melalui Network Link Conditioner di iOS atau Android Emulator. Perlambat pembacaan dari disk melalui emulasi memori lambat. ANR sering muncul tepat dalam kondisi seperti itu, pada perangkat cepat pengembang tidak terlihat.
Pertanyaan yang Sering Diajukan
Android secara eksplisit melacak waktu pemrosesan peristiwa di thread utama dan menampilkan dialog ANR. iOS menggunakan Watchdog yang memaksa menutup aplikasi saat membeku lebih dari 10–20 detik. ANR adalah fitur arsitektur Android di mana beberapa komponen (BroadcastReceiver, Service) memiliki batas waktu yang ketat.
Di Android 11+ Anda bisa mendapatkan dump ANR melalui adb shell dumpsys dropbox --print data_app_anr. Di Android 10 dan lebih rendah tanpa root tidak ada akses ke /data/anr/traces.txt. Gunakan Firebase Crashlytics — ia mengumpulkan laporan ANR secara otomatis untuk Android 11+.
Google Play merekomendasikan tingkat ANR di bawah 0,5% — yaitu tidak lebih dari 5 ANR per 1000 sesi. Aplikasi dengan tingkat di atas 1% mendapat peringatan di Google Play Console dan dapat disembunyikan dari rekomendasi. Idealnya tingkat ANR harus di bawah 0,1%.
Coroutine itu sendiri tidak memblokir thread. Tetapi jika di dalam coroutine dijalankan runBlocking di thread utama atau coroutine dijalankan dengan Dispatchers.Main dan melakukan operasi CPU panjang — ini akan menyebabkan ANR. Gunakan Dispatchers.IO untuk input-output dan Dispatchers.Default untuk perhitungan.
Gunakan Android Emulator dengan profil "Slow Network" atau tulis tes yang memanggil Thread.sleep(6000) di thread utama. Jalankan aplikasi melalui Debug dan setelah 5 detik Anda akan melihat dialog ANR. Periksa apakah di logcat muncul catatan ANR dengan pelacakan.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga