ANR i Android: vad det är, orsaker och åtgärdsmetoder

Författare: IT Sectr Publicerad: 2026-07-28 Lästid: 9 min

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 — systemmeddelande i Android när huvudtråden blockeras i mer än 5 sekunder, vilket leder till dialogrutan "Applikationen svarar inte"
  • Huvudorsaker — blockering av huvudtråden (BroadcastReceiver, Service), deadlock mellan trådar, lång operation i ContentProvider
  • Diagnostik — analys av /data/anr/traces.txt, Android Studio Profiler, Firebase Performance Monitoring
  • Åtgärd — flytta uppgifter till WorkManager, använda Kotlin Coroutines med Dispatchers.IO, StrictMode för tidig upptäckt
  • Förebyggande — begränsa BroadcastReceiver-tid till 10 sekunder, Service till 20 sekunder, ContentProvider till 15 sekunder

Vad är ANR i Android

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.

Hur ANR ser ut för användaren

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.

Skillnad mellan ANR och frysningar på iOS

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.

Huvudorsaker till ANR

ANR inträffar när systemet övervakar timeout för en av fyra komponenttyper. Varje komponent har sin egen tidsgräns.

Blockering i BroadcastReceiver

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.

Lång operation i Service

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 med lång initialisering

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.

  • BroadcastReceiver — 10 sekunder för onReceive; använd goAsync() för bakgrundsbearbetning
  • Service — 20 sekunder för onCreate/onStartCommand; använd WorkManager eller CoroutineWorker
  • ContentProvider — 15 sekunder för onCreate; flytta initialiseringen till Application.onCreate med fördröjd start
  • UI-tråd — 5 sekunder utan händelsebearbetning; varje blockering längre än 5 sekunder orsakar ANR

Hur man diagnostiserar ANR

Android tillhandahåller flera verktyg för ANR-analys: från systemloggar till specialiserade bibliotek.

Analys av traces.txt

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 med ANR-rapporter

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.

Android Studio Profiler med trådspårning

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:

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

Metoder för att åtgärda ANR

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.

Använda WorkManager för bakgrundsuppgifter

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.

Kotlin Coroutines med rätt avsändare

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.

Lazy-initialisering av ContentProvider

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:

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()
    }
}

Förebyggande av ANR i utveckling

Det bästa sättet att bekämpa ANR är att förhindra deras uppkomst i utvecklingsfasen genom verktyg och arkitekturlösningar.

StrictMode för att upptäcka blockering av huvudtråden

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 Monitoring för produktionsmätvärden

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.

Testning med nätverks- och diskfördröjningar

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.

  • BroadcastReceiver — använd alltid goAsync() för bearbetning längre än 1 sekund
  • Service — ersätt med WorkManager eller CoroutineWorker med bakgrundsavsändare
  • ContentProvider — undvik nätverk och databas i onCreate, använd lazy-init med WorkManager
  • UI-tråd — StrictMode med penaltyDeath i Debug, Firebase Performance för produktionsövervakning

Vanliga frågor

Varför uppstår ANR på Android men inte på iOS?

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.

Hur hittar man traces.txt på en enhet utan root?

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+.

Vilken ANR-frekvens anses acceptabel?

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%.

Kan en coroutine orsaka ANR?

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.

Hur testar man ANR i emulatorn?

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

  • ANR — systemmeddelande i Android när huvudtråden blockeras i mer än 5 sekunder eller komponent-timeout överskrids
  • Timeouter: BroadcastReceiver — 10 s, Service — 20 s, ContentProvider — 15 s, UI — 5 s
  • Diagnostik — /data/anr/traces.txt, Firebase Crashlytics, CPU Profiler i Android Studio
  • Åtgärd — WorkManager, goAsync(), Kotlin Coroutines med Dispatchers.IO, lazy-initialisering av ContentProvider
  • Förebyggande — StrictMode med penaltyDeath, Firebase Performance Monitoring, testning med nätverksfördröjningar
  • Google Play rekommenderar ANR-frekvens < 0,5%; vid frekvens > 1% får applikationen synlighetsbegränsningar
  • Rekommendation: konfigurera Firebase Crashlytics och Performance för ANR-insamling i produktion och ställ in varningar när tröskeln 0,3% överskrids

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.

Diskutera projektet

Läs också