What is ANR in Android?

App-responsivitet og ANR-fejl på Android

12/03/2025

Rating: 4.17 (14531 votes)

Forestil dig dette: Du er midt i at bruge din yndlings-app på din Android-telefon, måske scroller du gennem en nyhedsfeed eller udfylder en formular. Pludselig fryser skærmen, appen reagerer ikke på dine tryk, og efter et par ubehagelige sekunder dukker en dialogboks op: “Appen svarer ikke. Vil du lukke den?” Dette frygtede scenarie er kendt som en ANR-fejl (Application Not Responding), og det er et mareridt for både brugere og udviklere. Men hvad er en ANR egentlig, hvorfor sker det, og hvordan kan man forhindre det? Denne artikel vil dykke ned i ANR'ernes verden og forklare, hvordan man kan sikre, at dine Android-apps forbliver responsive og giver en flydende brugeroplevelse.

What are ANRS & app responsiveness?

App-responsivitet er en afgørende faktor for en applikations succes. I dagens digitale landskab forventer brugere øjeblikkelig feedback og en problemfri interaktion. En langsom eller frysende app kan hurtigt føre til frustration, dårlige anmeldelser, og i sidste ende, at brugere afinstallerer appen. Google lægger også stor vægt på responsivitet; apps, der ofte oplever ANR-fejl, kan blive straffet ved at blive mindre synlige i søgninger og i Play Butikken. Det er derfor ikke kun et spørgsmål om brugertilfredshed, men også om appens synlighed og udbredelse.

Indholdsfortegnelse

Hvad er en ANR-fejl?

En ANR-fejl opstår, når en Android-app ikke reagerer på brugerinput eller systembegivenheder i en længere periode. I tekniske termer udløses en ANR, når appens hovedtråd (også kendt som UI-tråden) er blokeret i fem sekunder eller mere. Hovedtråden er ansvarlig for at håndtere alle brugergrænsefladeinteraktioner – alt fra tryk og swipes til tastaturinput og skærmopdateringer. Hvis denne tråd bliver optaget af en langvarig operation, der blokerer den, kan appen ikke behandle nye input, og brugeren oplever, at appen “fryser”.

Typiske årsager til, at hovedtråden blokeres, inkluderer:

  • Netværksoperationer: Forsøg på at hente data fra internettet direkte på hovedtråden.
  • Databaseforespørgsler: Læsning eller skrivning til en database, der tager for lang tid.
  • Komplekse beregninger: Tunge matematiske operationer eller dataforarbejdning.
  • Disk-I/O: Læsning eller skrivning til lageret, der er for langsomt.
  • Døde låse (deadlocks): To eller flere tråde venter uendeligt på hinanden.

Når den magiske grænse på fem sekunder overskrides, registrerer Android-systemet, at appen ikke svarer, og viser den berygtede ANR-dialogboks. Dette er systemets måde at informere brugeren om, at appen er gået ned, og tilbyde dem en mulighed for at lukke den.

Hvorfor er app-responsivitet så afgørende?

App-responsivitet er ikke bare en teknisk detalje; det er fundamentalt for den samlede brugeroplevelse. En app, der konstant fryser eller føles langsom, vil hurtigt miste sine brugere. Tænk over det: Hvor mange gange har du selv lukket en app i frustration, fordi den ikke reagerede som forventet? Her er nogle afgørende grunde til, at responsivitet er så vigtig:

  • Brugerfastholdelse: En flydende og responsiv app holder brugerne engagerede. Hvis en app er langsom, vil brugerne hurtigt søge efter alternativer. Førstehåndsindtrykket tæller, og en app, der føles sløv fra starten, vil have svært ved at vinde brugernes tillid.
  • Omdømme og anmeldelser: Dårlige ydeevne fører ofte til negative anmeldelser i Play Butikken. Disse anmeldelser kan skade appens omdømme og afskrække potentielle nye brugere. Positive anmeldelser, der fremhæver appens hurtighed og pålidelighed, er derimod en guldgrube.
  • Play Butik-synlighed: Som nævnt tidligere overvåger Google aktivt app-ydeevne. Apps med mange ANR-fejl eller dårlig responsivitet kan blive nedprioriteret i Play Butikkens søgeresultater, hvilket reducerer deres organiske rækkevidde og downloadtal. Googles algoritmer favoriserer apps, der leverer en god brugeroplevelse.
  • Tillid og pålidelighed: En app, der fungerer fejlfrit, opbygger tillid hos brugeren. De føler sig sikre på, at appen vil levere, når de har brug for den. Omvendt er en ustabil app en kilde til usikkerhed og irritation.

At investere i app-responsivitet er altså ikke bare en “nice-to-have”, men en nødvendighed for at opnå succes på Android-platformen.

Diagnosticering af ANR'er: Profileringsværktøjets Kraft

Den bedste måde at håndtere ANR-fejl på er at forhindre dem. Den grundlæggende best practice er at fjerne så meget arbejde som muligt fra hovedtråden. Alt, der tager mere end et par millisekunder, bør udføres på en baggrundstråd. Men hvad hvis du stadig oplever ANR'er, eller hvis du har en kendt ANR, som du kan reproducere, men ikke kan finde årsagen til?

Her kommer profilering ind i billedet. Profilering er processen med at analysere din apps ydeevne, herunder CPU-, hukommelses- og trådforbrug, for at identificere flaskehalse og ineffektiviteter. Ved at optage en systemtrace, der fanger, hvad der kører på applikationsprocessen og dens tråde, kan du få værdifuld indsigt til at diagnosticere og løse ANR-fejl.

Trin 1: Gør din Android-app profilérbar

For at kunne profilere din app effektivt skal den være konfigureret til det. Dette er en simpel proces, der involverer tilføjelse af et enkelt element til din apps manifestfil. Det er afgørende at udføre disse ydeevnediagnostik på build-konfigurationer, der er så tætte på, hvad dine kunder bruger, som muligt. Debuggable builds eller builds, der ikke er kørt gennem et kodeoptimeringsværktøj som R8 eller Proguard, kan føre til unøjagtige traces, da de ofte er langsommere og udfører ekstra arbejde, der kan påvirke ydeevnen. Fra Android 10 er builds profilérbare uden at skulle være debuggable, så det anbefales at gøre dette på en enhed, der kører mindst denne version af OS'et.

What is ANR & how it can be prevented in Android?
What is ANR and How it Can be Prevented in Android? ANR stands for Application Not Responding. An ANR will occur if you're running a process on the UI thread which takes an extended time, usually around 5 seconds. During this point, the GUI (Graphical User Interface) will lock up which can end in anything the user presses won't be actioned.

For at gøre din app profilérbar skal du tilføje <profileable android:shell="true" android:enabled="true"/>-elementet til <application>-sektionen i din apps manifestfil (AndroidManifest.xml). Her er et eksempel:

<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<profileable android:shell="true" android:enabled="true"/>
...
</application>

Trin 2: Vælg et værktøj til at profilere din app med

Når din app er profilérbar, er det tid til at vælge det profileringsværktøj, du vil bruge til at fange en systemtrace. Disse værktøjer hjælper dig med at indfange køre-tidsinformation om en Android-apps ydeevne, så du kan analysere, hvad der foregår under motorhjelmen.

  • Android Profiler: Dette er et profileringsværktøj, der er indbygget direkte i Android Studio, hvilket gør det til et foretrukket valg for udviklere på alle niveauer. Android Profiler giver dig mulighed for at se realtidsdata om CPU-, hukommelses- og netværksforbrug. Det giver også et anstændigt detaljeniveau for information som trådaktivitet og metodekald. Android Profiler bruges almindeligvis under udvikling for at få et overordnet overblik over, hvad der foregår i appen, da det lever direkte inde i Android Studio. Det er ofte det mest bekvemme værktøj at starte med.
  • Perfetto: Perfetto er et værktøj med både en webbaseret og en kommandolinje-brugerflade, der bruges til at optage og visualisere Android-systemtraces. Perfetto har meget af den samme funktionalitet som Android Profiler, men tilbyder en langt bedre brugerflade til at se traces, ud over større konfigurationsmuligheder. Du kan også se tidligere optagede systemtraces, der er gemt som en fil med web-brugerfladen. På grund af dens meget mere kraftfulde brugerflade foretrækkes Perfetto ofte, når man analyserer komplekse traces og dykker dybere ned i ydeevnedata.
  • System Tracing-appen: Dette er en app, der følger med de fleste Android-installationer, og som giver dig mulighed for at fange systemtraces direkte på enheden. Denne app genererer en trace-fil, som derefter kan ses ved hjælp af Perfetto. System Tracing er utrolig nyttig, da den lader dig fange systemtraces uden at skulle bruge en computer, hvilket er ideelt, hvis du skal diagnosticere et problem på en specifik brugers enhed.

Valget af værktøj afhænger i sidste ende af dine individuelle behov og præferencer. Det vigtigste er, at du præcist kan identificere, hvad der kører på din apps hovedtråd før eller under en ANR.

Trin 3: Identificer og eliminer kendte ANR'er ved at profilere din Android-app

Det sidste trin er at udnytte det valgte profileringsværktøj til at analysere din profilérbare app for at finde og eliminere en kendt ANR. Forestil dig, at en bruger eller en tester rapporterer en ANR, som du kan reproducere på din egen enhed, men du kender ikke den underliggende årsag.

Det første skridt er at bestemme den arbejdsgang, der udløser fejlen. Sker ANR'en, når brugeren scroller for hurtigt, når de forsøger at afspille en indlejret video, eller når de tilføjer et specifikt element til deres indkøbskurv? Når arbejdsgangen er identificeret, skal du bruge profileringsværktøjet til at optage en trace af det arbejde, der udføres på appens hovedtråd før og under ANR'en.

Herfra kan du analysere tracen for at se, hvad der sker på hovedtråden af din Android-app, når ANR-arbejdsgangen udføres. Dette vil ligne en tidslinje af begivenheder og komponenter, der initialiseres, samt spor af flaskehalse og forsinkelser i operationer. Du vil kunne se, hvilke metoder der kører, hvor lang tid de tager, og om de blokerer hovedtråden.

Nogle gange er dette nok information til at identificere de kodeblokke, der kan være rodårsagen til ANR'en. Men nogle gange vil en langvarig blok, der involverer mange metodekald, vise flaskehalse eller en opbremsning i operationer. Hvis dette er tilfældet, kan det være svært at bestemme den nøjagtige årsag fra din indledende trace, og du bliver nødt til at dykke dybere ned i, hvad der sker i den langvarige blok. Dette kræver tilføjelse af brugerdefinerede begivenheder, der vises i systemtracen, når appen kører. Når du optager en trace næste gang, vil den give mere detaljeret information, der hjælper med at nedbryde, hvad der sker i den tidligere uigennemsigtige blok. Dette kan gøres ved hjælp af Jetpack Tracing-biblioteket, som Google tilbyder.

Why are ANRS a problem?

For eksempel, hvis vi ser, at et bestemt metodekald tager usædvanligt lang tid at udføre, kan vi undersøge implementeringen af den metode, se om der er ting at optimere, og afgøre, om den virkelig skal udføres på hovedtråden. Ved at analysere tidslinjen, der repræsenteres af en systemtrace, kan vi identificere den specifikke kode, der forårsager ANR'en, og tage skridt til at eliminere den. Ofte indebærer løsningen at flytte den blokerende operation til en baggrundstråd, bruge asynkrone operationer eller optimere den kode, der kører langsomt.

Sammenligning af profileringsværktøjer

VærktøjIntegrationDetaljegradAnvendelsesscenarie
Android ProfilerIndbygget i Android StudioGodt overblik over CPU, hukommelse, netværk, trådaktivitet. God nok til de fleste almindelige flaskehalse.Hurtig realtidsdiagnose under udvikling. Velegnet til at identificere generelle ydeevneproblemer og enkle ANR'er, der nemt kan reproduceres i et udviklingsmiljø.
PerfettoWebbaseret UI, kommandolinje, kræver separat konfigurationMeget høj. Detaljerede systemtraces med mulighed for dybdegående analyse af tråde, processer og events. Ideel til at finde skjulte flaskehalse.Analyse af komplekse og vanskelige ANR'er. Visualisering af traces optaget med System Tracing-appen. Foretrukket til dybdegående ydeevneanalyse og optimering.
System Tracing-appenIndbygget på Android-enhederGenererer trace-filer, der kan importeres til Perfetto for detaljeret analyse. Fanger system- og app-events på enheden.Optagelse af traces direkte på en enhed uden brug af en computer. Ideel til at diagnosticere ANR'er, der kun opstår under specifikke enhedsforhold eller hos specifikke brugere.

Håndtering af ANR'er i produktion

Profileringsværktøjer som Android Profiler, Perfetto og System Tracing-appen er fantastiske gratis ressourcer, der er yderst nyttige, når du har en kendt ANR, som kan reproduceres på en lokal enhed. De kan spare dig for mange hovedpiner, især hvis du støder på ANR'er, som du nemt kan reproducere internt.

Men profilering er ikke en god løsning, når ANR'er hærger i produktion, i stor skala, og ikke let kan reproduceres. Desværre kan ingen mængde af profilering fortælle dig omfanget af et ANR-problem i produktion, og hvor ofte brugere støder på dem. I produktionsmiljøer, hvor millioner af brugere interagerer med din app på tværs af et utal af enheder og netværksforhold, er ANR'er ofte uregelmæssige og svære at isolere.

I stedet for at tvinge dig til at reagere på negativ brugerfeedback og anmeldelser, når ANR'er dukker op, har mobile udviklere brug for specialiserede overvågningsværktøjer. Disse værktøjer er designet til at indfange ANR'er i produktion for hurtigere identifikation og problemløsning. De giver typisk indsigt i app-adfærd, før ANR'er opstår, og tilbyder detaljerede og nøjagtige oversigter over hver ANR-hændelse gennem samplede stack traces og flame graphs. Dette strømliner problemløsningsprocessen betydeligt, da du ikke spilder tid på at forsøge at genskabe ANR'er på en lokal enhed. I stedet kan du fange dem i realtid og nemt reproducere dem i dine data eller i det mindste forstå deres rodårsag baseret på de indsamlede data. Ved at implementere en omfattende tilgang til ANR-fejlfinding, især i produktion, kan du markant forbedre brugeroplevelsen og bevare appens gode omdømme.

Ofte Stillede Spørgsmål (FAQ)

Hvad er den primære årsag til ANR'er?

Den primære årsag til ANR'er er blokering af appens hovedtråd (også kendt som UI-tråden) i fem sekunder eller mere. Dette sker typisk, når tidskrævende operationer som netværkskald, komplekse databaseforespørgsler, tunge beregninger eller disk-I/O udføres direkte på hovedtråden, hvilket forhindrer den i at svare på brugerinput.

Hvorfor er app-responsivitet så vigtig for en Android-app?

App-responsivitet er afgørende for en god brugeroplevelse, da den sikrer, at appen føles hurtig og flydende. En responsiv app fører til højere brugerfastholdelse, bedre anmeldelser i Play Butikken og forbedret synlighed, da Google favoriserer apps med god ydeevne. Manglende responsivitet kan føre til brugerfrustration og afinstallationer.

How to detect ANR in Android?
How to Detect ANRs When an ANR occurs, Android logs a stack trace in Logcat with the tag: The trace shows which thread was blocked and where the freeze happened. Google Play reports ANRs in the Android Vitals dashboard. Helps track ANR rates by Android version, device, and OS. Monitors ANRs in production and provides detailed reports. 4.

Kan jeg forhindre alle ANR'er i min app?

Det er ekstremt udfordrende at forhindre absolut alle ANR'er, især i komplekse apps, der interagerer med eksterne systemer eller har mange brugerinteraktioner. Målet er at minimere forekomsten af ANR'er ved at følge best practices (f.eks. udføre langtidsoperationer på baggrundstråde) og implementere robuste fejlhåndtering. Kontinuerlig overvågning og profilering er nøglen til at identificere og løse de fleste problemer.

Hvilken tråd skal jeg undgå at blokere for at forhindre ANR'er?

Du skal ubetinget undgå at blokere hovedtråden (Main Thread) eller UI-tråden. Denne tråd er ansvarlig for at tegne brugergrænsefladen og behandle brugerinput. Alle operationer, der tager mere end et par millisekunder, skal udføres på separate baggrundstråde for at sikre, at UI'en forbliver responsiv.

Hvad betyder det at gøre min app “profilérbar”?

At gøre din app “profilérbar” betyder at konfigurere den, typisk ved at tilføje <profileable>-tagget i din AndroidManifest.xml, så dens ydeevne kan overvåges og analyseres af profileringsværktøjer som Android Profiler eller Perfetto. Dette giver udviklere mulighed for at indsamle detaljerede data om CPU-, hukommelses- og trådforbrug for at diagnosticere ydeevneproblemer, herunder ANR'er.

Hvad er forskellen mellem Android Profiler og Perfetto?

Android Profiler er integreret direkte i Android Studio og giver et godt realtidsoverblik over CPU, hukommelse og netværk. Det er ideelt til hurtig diagnosticering under udvikling. Perfetto er et mere avanceret, webbaseret værktøj, der giver dybere og mere detaljerede systemtraces med bedre visualisering og flere konfigurationsmuligheder. Perfetto er foretrukket til kompleks analyse og dybdegående ydeevneoptimering.

At bygge responsive Android-apps er en kontinuerlig proces, der kræver omhyggelig opmærksomhed på detaljer og en dyb forståelse af platformens ydeevnekarakteristika. Ved at forstå, hvad ANR'er er, hvorfor de opstår, og hvordan man bruger profileringsværktøjer effektivt, kan udviklere skabe mere stabile, hurtigere og mere brugervenlige applikationer. Husk, at en god brugeroplevelse er hjørnestenen i enhver succesfuld app, og responsivitet er kernen i den oplevelse. Ved at mestre disse teknikker kan du sikre, at dine apps ikke blot fungerer, men trives på brugernes enheder.

Hvis du vil læse andre artikler, der ligner App-responsivitet og ANR-fejl på Android, kan du besøge kategorien Mobiludvikling.

Go up