ANR (Application Not Responding) — är ett systemmeddelande i Android som visas när applikationen inte svarar på inmatning inom 5 sekunder. Till skillnad från glitchar (logiska fel utan att blockera UI) och lagg (långsamhet utan fullständigt stopp) är ANR ett kritiskt fel som registreras av operativsystemet: Android visar en dialogruta "Applikationen svarar inte" med erbjudande om att stänga eller vänta. Enligt Android Vitals Documentation har applikationer med en ANR-frekvens över 0,5% lägre betyg i Google Play och kan döljas från rekommendationer. Diagnostik inkluderar analys av /data/anr/traces.txt, användning av StrictMode och profilering av huvudtråden.
Huvudpunkter
ANR (Application Not Responding) — är en användarskyddsmekanism i Android som aktiveras när applikationen slutar svara på inmatning. Systemet övervakar bearbetningstiden för händelser: om BroadcastReceiver inte slutför onReceive inom 10 sekunder, Service inte återvänder från onCreate inom 20 sekunder, och ContentProvider inte svarar inom 15 sekunder — genererar Android ett ANR.
När ANR inträffar visar Android en systemdialogruta ovanför alla fönster: "Applikationen svarar inte. Stänga eller vänta?". Användaren kan stänga applikationen eller vänta på dess återställning. Om ANR upprepas ofta tar användaren bort applikationen. Google Play beaktar ANR-frekvensen — andelen sessioner med ANR — i rankningsalgoritmerna.
På iOS finns ingen motsvarighet till ANR med systemdialogruta. Istället använder Apple Watchdog, som avslutar applikationsprocessen med kod 0x8badf00d. Användaren ser ingen dialogruta — applikationen stängs helt enkelt till hemskärmen. Detta gör ANR på Android mer synligt för användaren, men ger systemet mer information för diagnostik.
ANR inträffar när systemet övervakar timeout för en av fyra komponenttyper. Varje komponent har sin egen tidsgräns.
BroadcastReceiver körs i huvudtråden. Om onReceive startar en synkron nätverksförfrågan, en lång skrivoperation till databasen eller väntar på en blockering — uppstår ANR efter 10 sekunder. Lösning: använd goAsync() och WorkManager för bakgrundsbearbetning. Typiskt scenario — ta emot Push-meddelande från FCM och synkron spara i Room.
Service.onCreate och Service.onStartCommand har en gräns på 20 sekunder. Om tjänsten startar tung initialisering (ladda bibliotek, läsa konfiguration från nätverket) i huvudtråden — är ANR oundvikligt. Använd IntentService (föråldrad) eller WorkManager för garanterad exekvering i bakgrundstråden.
ContentProvider.onCreate körs före anropet till Application.onCreate och har en gräns på 15 sekunder. Om leverantören utför databasmigrering, laddning av ordlistor eller SDK-initialisering från nätverket — orsakar detta ANR vid applikationsstart. Lösning: lazy-initialisering, flytta tunga operationer till WorkManager.
Android tillhandahåller flera verktyg för ANR-analys: från systemloggar till specialiserade bibliotek.
Vid varje ANR sparar Android filen /data/anr/traces.txt med en dump av stackarna för alla applikationens trådar. Hitta tråden "main" — den sista metoden i stacken indikerar orsaken. Typiska mönster: Thread.sleep(), InputStream.read(), BinderProxy.transact(). För att extrahera filen från enheten, använd adb med superanvändarrättigheter.
Firebase Crashlytics samlar automatiskt in ANR och visar dem på instrumentpanelen tillsammans med spårning. För Android 11+ kommer ANR-rapporter med full stack av huvudtråden. Integration kräver att ett beroende läggs till och initialisering av FirebaseApp i Application.onCreate.
CPU Profiler i Android Studio låter dig spela in en spårning av applikationens arbete och se vilka metoder som tar CPU-tid. Aktivera "Record with method traces" och återskapa scenariot som orsakar ANR. På tidslinjen kommer det att synas vilka metoder som kördes i huvudtråden vid frysningsögonblicket.
Exempel på Firebase Crashlytics-integration för att samla in ANR på Android:
class App : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
FirebaseCrashlytics.getInstance()
.setCrashlyticsCollectionEnabled(true)
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build())
}
}
Att åtgärda ANR innebär främst att flytta alla långa operationer från huvudtråden till bakgrundstrådar. Låt oss titta på specifika tekniker för varje komponenttyp.
WorkManager — Googles rekommenderade lösning för bakgrundsarbete. Det garanterar exekvering av uppgiften i bakgrundstråden med hänsyn till enhetens tillstånd. Till skillnad från Service blockerar WorkManager inte huvudtråden och är tolerant mot omstart av applikationen. För BroadcastReceiver, använd goAsync() och skicka resultatet PendingResult till WorkManager.
Starta alla nätverksförfrågningar, databasarbete och filoperationer med Dispatchers.IO. Huvudtråden bör bara uppdatera UI. Använd viewModelScope för automatisk annullering av coroutines när Activity förstörs. Undvik runBlocking() i något sammanhang — detta är en synkron blockering av den aktuella tråden.
Om ContentProvider utför lång initialisering, använd en mekanism för fördröjd laddning: skapa en leverantör som omedelbart returnerar data, och starta den tunga initialiseringen via WorkManager med fördröjning. Detta förhindrar ANR vid applikationsstart, när systemet är mest känsligt för fördröjningar.
Exempel på korrekt användning av BroadcastReceiver med goAsync i 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()
}
}
Det bästa sättet att bekämpa ANR är att förhindra deras uppkomst i utvecklingsfasen genom verktyg och arkitekturlösningar.
StrictMode med aktiverade policyer detectNetwork() och detectDiskReads()/detectDiskWrites() upptäcker potentiella ANR i utvecklingsfasen. I Debug-build, ställ in penaltyDeath — varje överträdelse leder till en omedelbar krasch, och utvecklaren ser problemet före commit.
Firebase Performance övervakar exekveringstiden för nyckeloperationer och visar vilka scenarier som överskrider ANR-tröskeln. Konfigurera anpassad spårning för varje skärm och nätverksförfrågan. Om exekveringstiden överstiger 3 sekunder — är detta en potentiell ANR som kräver optimering.
Simulera långsamma förhållanden: begränsa nätverkshastigheten via Network Link Conditioner på iOS eller Android Emulator. Sakta ner läsning från disk genom emulering av långsamt minne. ANR uppträder ofta just under sådana förhållanden, på utvecklarens snabba enheter är de inte synliga.
Vanliga frågor
Android övervakar explicit bearbetningstiden för händelser på huvudtråden och visar ANR-dialogrutan. iOS använder Watchdog, som tvångsstänger applikationen vid frysning längre än 10–20 sekunder. ANR är en egenskap i Android-arkitekturen där flera komponenter (BroadcastReceiver, Service) har strikta timeout-värden.
På Android 11+ kan du få en ANR-dump via adb shell dumpsys dropbox --print data_app_anr. På Android 10 och lägre finns det utan root ingen åtkomst till /data/anr/traces.txt. Använd Firebase Crashlytics — det samlar automatiskt in ANR-rapporter för Android 11+.
Google Play rekommenderar en ANR-frekvens under 0,5% — det vill säga inte mer än 5 ANR per 1000 sessioner. En applikation med en frekvens över 1% får en varning i Google Play Console och kan döljas från rekommendationer. Idealiskt bör ANR-frekvensen vara under 0,1%.
En coroutine blockerar inte tråden i sig. Men om runBlocking körs på huvudtråden inuti en coroutine, eller coroutinen startas med Dispatchers.Main och utför en lång CPU-operation — kommer detta att orsaka ANR. Använd Dispatchers.IO för in-utmatning och Dispatchers.Default för beräkningar.
Använd Android Emulator med profilen "Slow Network" eller skriv ett test som anropar Thread.sleep(6000) på huvudtråden. Starta applikationen via Debug och efter 5 sekunder ser du ANR-dialogrutan. Kontrollera att en ANR-post med spårning har dykt upp i logcat.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också