Android'de ANR: nedir, nedenleri ve çözüm yöntemleri

Yazar: IT Sectr Yayınlanma: 2026-07-28 Okuma süresi: 9 dk

ANR (Application Not Responding), bir uygulamanın 5 saniye içinde girdiye yanıt vermemesi durumunda Android'de görünen bir sistem bildirimidir. Glitch'lerin (UI blokajı olmayan mantıksal hatalar) ve lag'lerin (tam durma olmadan yavaşlama) aksine, ANR işletim sistemi tarafından kaydedilen kritik bir hatadır: Android, kapatma veya bekleme seçeneğiyle birlikte “Uygulama yanıt vermiyor” diyalogunu gösterir. Android Vitals Documentation'a göre, ANR oranı %0,5'in üzerinde olan uygulamalar Google Play'de daha düşük puan alır ve önerilerden gizlenebilir. Teşhis, /data/anr/traces.txt analizini, StrictMode kullanımını ve ana iplik profillemesini içerir.

Kilit Noktalar

  • ANR — ana iplik 5 saniyeden fazla bloke olduğunda Android'de bir sistem bildirimi, “Uygulama yanıt vermiyor” diyaloguna yol açar
  • Ana nedenler — ana iplik blokajı (BroadcastReceiver, Service), iplikler arasında deadlock, ContentProvider'da uzun işlem
  • Teşhis — /data/anr/traces.txt analizi, Android Studio Profiler, Firebase Performance Monitoring
  • Çözüm — görevleri WorkManager'a aktarma, Dispatchers.IO ile Kotlin Coroutines kullanma, erken tespit için StrictMode
  • Önleme — BroadcastReceiver süresini 10 saniye, Service'i 20 saniye, ContentProvider'ı 15 saniye ile sınırlama

Android'de ANR Nedir

ANR (Application Not Responding), uygulamanın girdiye yanıt vermeyi bırakması durumunda etkinleşen bir Android kullanıcı koruma mekanizmasıdır. Sistem olay işleme süresini izler: BroadcastReceiver onReceive'i 10 saniye içinde tamamlamazsa, Service 20 saniye içinde onCreate'den dönmezse veya ContentProvider 15 saniye içinde yanıt vermezse — Android bir ANR üretir.

ANR Kullanıcıya Nasıl Görünür

Bir ANR oluştuğunda, Android tüm pencerelerin üstünde bir sistem diyalogu gösterir: “Uygulama yanıt vermiyor. Kapatmak mı yoksa beklemek mi istiyorsunuz?” Kullanıcı uygulamayı kapatabilir veya düzelmesini bekleyebilir. ANR'ler sık sık meydana gelirse, kullanıcı uygulamayı kaldırır. Google Play, sıralama algoritmalarında ANR oranını (ANR'li oturumların yüzdesi) dikkate alır.

ANR ve iOS Donmaları Arasındaki Fark

iOS'ta sistem diyaloglu olan bir ANR eşdeğeri yoktur. Bunun yerine Apple, 0x8badf00d çıkış koduyla süreci sonlandıran Watchdog'u kullanır. Kullanıcı bir diyalog görmez — uygulama ana ekrana kapanır. Bu, Android'de ANR'yi kullanıcı için daha belirgin hale getirir ancak sisteme daha fazla teşhis bilgisi sağlar.

ANR'nin Ana Nedenleri

ANR, sistem dört bileşen türünden biri için bir zaman aşımı izlediğinde oluşur. Her bileşenin kendi zaman sınırı vardır.

BroadcastReceiver'da Blokaj

BroadcastReceiver ana iplikte çalıştırılır. onReceive senkron bir ağ isteği başlatırsa, veritabanına uzun bir yazma yaparsa veya bir kilit beklerse — 10 saniye içinde bir ANR oluşur. Çözüm: arka plan işleme için goAsync() ve WorkManager kullanın. Tipik bir senaryo, FCM'den Push bildirimi almak ve Room'a senkron olarak kaydetmektir.

Service'te Uzun İşlem

Service.onCreate ve Service.onStartCommand 20 saniye sınırına sahiptir. Hizmet, ana iplikte ağır bir başlatma (kütüphane yükleme, ağdan yapılandırma okuma) başlatırsa — ANR kaçınılmazdır. Arka planda garantili yürütme için IntentService (eski) veya WorkManager kullanın.

Yavaş Başlatmalı ContentProvider

ContentProvider.onCreate, Application.onCreate'dan önce çalıştırılır ve 15 saniye sınırına sahiptir. Sağlayıcı veritabanı geçişi yaparsa, sözlükler yüklerse veya ağdan SDK başlatırsa — bu, uygulama başlatmada ANR'ye neden olur. Çözüm: tembel başlatma, ağır işlemleri WorkManager'a aktarma.

  • BroadcastReceiver — onReceive için 10 saniye; arka plan işleme için goAsync() kullanın
  • Service — onCreate/onStartCommand için 20 saniye; WorkManager veya CoroutineWorker kullanın
  • ContentProvider — onCreate için 15 saniye; başlatmayı gecikmeli başlatma ile Application.onCreate'a taşıyın
  • UI İpliği — olay işleme olmadan 5 saniye; 5 saniyeden uzun herhangi bir blokaj ANR'yi tetikler

ANR Nasıl Teşhis Edilir

Android, sistem günlüklerinden özel kütüphanelere kadar ANR analizi için çeşitli araçlar sağlar.

traces.txt Analizi

Her ANR'de Android, tüm uygulama ipliklerinin yığın dökümünü içeren /data/anr/traces.txt dosyasını kaydeder. “main” ipliğini bulun — yığındaki son yöntem nedeni gösterir. Tipik desenler: Thread.sleep(), InputStream.read(), BinderProxy.transact(). Dosyayı cihazdan çıkarmak için süper kullanıcı ayrıcalıklarıyla adb kullanın.

ANR Raporlarıyla Firebase Crashlytics

Firebase Crashlytics, ANR'leri otomatik olarak toplar ve izlerle birlikte gösterge tablosunda gösterir. Android 11+ için ANR raporları, ana ipliğin tam yığını içerir. Entegrasyon, bir bağımlılık eklemeyi ve Application.onCreate'da FirebaseApp'i başlatmayı gerektirir.

İplik İzleme ile Android Studio Profiler

Android Studio'daki CPU Profiler, uygulama izlerini kaydetmenize ve hangi yöntemlerin CPU süresi tükettiğini görmenize olanak tanır. “Record with method traces” özelliğini etkinleştirin ve ANR'ye neden olan senaryoyu yeniden oluşturun. Zaman çizelgesi, donma anında ana iplikte hangi yöntemlerin çalıştığını gösterecektir.

Android'de ANR toplama için Firebase Crashlytics entegrasyonu örneği:

kotlin
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this)
        FirebaseCrashlytics.getInstance()
            .setCrashlyticsCollectionEnabled(true)
        StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build())
    }
}

ANR'yi Düzeltme Yöntemleri

ANR'yi düzeltmek, tüm uzun işlemleri ana iplikten arka plan ipliklerine taşımak anlamına gelir. Her bileşen türü için belirli tekniklere bakalım.

Arka Plan Görevleri İçin WorkManager Kullanımı

WorkManager, arka plan çalışması için Google tarafından önerilen çözümdür. Cihaz durumunu dikkate alarak bir arka plan ipliğinde görev yürütmeyi garanti eder. Service'in aksine, WorkManager ana ipliği bloke etmez ve uygulama yeniden başlatmalarına karşı dayanıklıdır. BroadcastReceiver için goAsync() kullanın ve PendingResult'u WorkManager'a iletin.

Uygun Göndericilerle Kotlin Coroutines

Tüm ağ isteklerini, veritabanı işlemlerini ve dosya G/Ç işlemlerini Dispatchers.IO ile çalıştırın. Ana iplik yalnızca UI'yı güncellemelidir. Activity yok edildiğinde otomatik coroutine iptali için viewModelScope kullanın. Herhangi bir bağlamda runBlocking()'den kaçının — mevcut ipliği senkron olarak bloke eder.

ContentProvider'ın Tembel Başlatması

ContentProvider yavaş başlatma yapıyorsa, tembel yükleme mekanizması kullanın: hemen veri döndüren bir sağlayıcı oluşturun ve WorkManager aracılığıyla gecikmeli olarak ağır başlatmayı başlatın. Bu, sistemin gecikmelere en duyarlı olduğu uygulama başlatmada ANR'yi önler.

Android'de goAsync ile BroadcastReceiver'ın doğru kullanımı örneği:

kotlin
class FcmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val pendingResult = goAsync()
        WorkManager.getInstance(context!!)
            .enqueue(OneTimeWorkRequest.from(NotificationWorker::class.java))
        pendingResult.finish()
    }
}

Geliştirmede ANR'yi Önleme

ANR'lerle mücadele etmenin en iyi yolu, araçlar ve mimari kararlar aracılığıyla geliştirme sırasında bunları önlemektir.

Ana İplik Blokajını Tespit İçin StrictMode

Etkinleştirilmiş detectNetwork() ve detectDiskReads()/detectDiskWrites() politikalarıyla StrictMode, geliştirme sırasında potansiyel ANR'leri belirler. Debug yapılarında penaltyDeath ayarlayın — herhangi bir ihlal anında çökmeye neden olur ve geliştirici commit'ten önce sorunu görür.

Üretim Metrikleri İçin Firebase Performance Monitoring

Firebase Performance, anahtar işlemlerin yürütme süresini izler ve hangi senaryoların ANR eşiğini aştığını gösterir. Her ekran ve ağ isteği için özel izler ayarlayın. Yürütme süresi 3 saniyeyi aşarsa — optimizasyon gerektiren potansiyel bir ANR'dir.

Ağ ve Disk Gecikmesiyle Test Etme

Yavaş koşulları simüle edin: iOS veya Android Emulator'da Network Link Conditioner kullanarak ağ hızını sınırlayın. Yavaş bellek emülasyonuyla disk okumalarını yavaşlatın. ANR genellikle tam da bu koşullarda ortaya çıkar; hızlı geliştirici cihazlarında görünmezler.

  • BroadcastReceiver — 1 saniyeden uzun işlem için her zaman goAsync() kullanın
  • Service — bir arka plan göndericisiyle WorkManager veya CoroutineWorker ile değiştirin
  • ContentProvider — onCreate'te ağ ve veritabanından kaçının, WorkManager ile lazy-init kullanın
  • UI İpliği — Debug'da penaltyDeath ile StrictMode, üretim izleme için Firebase Performance

Sıkça Sorulan Sorular

ANR neden Android'de oluşuyor da iOS'te oluşmuyor?

Android, ana iplikteki olay işleme süresini açıkça izler ve bir ANR diyalogu gösterir. iOS, 10–20 saniyeden fazla donduğunda uygulamayı zorla kapatan Watchdog'u kullanır. ANR, birden çok bileşenin (BroadcastReceiver, Service) sıkı zaman aşımlarına sahip olduğu Android mimarisinin bir özelliğidir.

Köksüz bir cihazda traces.txt nasıl bulunur?

Android 11+'da adb shell dumpsys dropbox --print data_app_anr aracılığıyla ANR dökümünü alabilirsiniz. Android 10 ve altında, kök erişimi olmadan /data/anr/traces.txt'ye erişilemez. Firebase Crashlytics kullanın — Android 11+ için ANR raporlarını otomatik olarak toplar.

Hangi ANR oranı kabul edilebilir olarak kabul edilir?

Google Play, ANR oranının %0,5'in altında olmasını önerir — 1000 oturum başına en fazla 5 ANR. Oranı %1'in üzerinde olan bir uygulama, Google Play Console'da bir uyarı alır ve önerilerden gizlenebilir. İdeal olarak, ANR oranı %0,1'in altında olmalıdır.

Bir coroutine ANR'ye neden olabilir mi?

Coroutine'nin kendisi ipliği bloke etmez. Ancak bir coroutine içinde ana iplikte runBlocking çalıştırırsanız veya coroutine Dispatchers.Main ile başlatılır ve uzun bir CPU işlemi yaparsa — bu ANR'ye neden olur. G/Ç için Dispatchers.IO ve hesaplamalar için Dispatchers.Default kullanın.

Emülatörde ANR nasıl test edilir?

“Slow Network” profiliyle Android Emulator kullanın veya ana iplikte Thread.sleep(6000) çağıran bir test yazın. Uygulamayı Debug üzerinden başlatın ve 5 saniye sonra ANR diyalogunu göreceksiniz. logcat'te iz ile birlikte bir ANR kaydı göründüğünü doğrulayın.

Özet

  • ANR — ana iplik 5 saniyeden fazla bloke olduğunda veya bileşen zaman aşımları aşıldığında Android'de bir sistem bildirimi
  • Zaman aşımları: BroadcastReceiver — 10 sn, Service — 20 sn, ContentProvider — 15 sn, UI — 5 sn
  • Teşhis — /data/anr/traces.txt, Firebase Crashlytics, Android Studio'da CPU Profiler
  • Çözüm — WorkManager, goAsync(), Dispatchers.IO ile Kotlin Coroutines, ContentProvider tembel başlatma
  • Önleme — penaltyDeath ile StrictMode, Firebase Performance Monitoring, ağ gecikmesiyle test
  • Google Play ANR oranı < %0,5 önerir; oran > %1 olduğunda uygulama görünürlük kısıtlamalarıyla karşılaşır
  • Öneri: üretimde ANR toplama için Firebase Crashlytics ve Performance'u yapılandırın ve eşik %0,3'ü aştığında uyarılar ayarlayın

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun