Hvis din app er langsom på visse enheder, eller hvis Android Studios Instant Run-funktioner stopper med at fungere tilfældigt, kan det være, at du oplever hukommelseslækager.
Hvornår opstår et hukommelseslækage?
En af de fantastiske ting ved Java er garbage collector (GC). En garbage collector kører med jævne mellemrum for at kontrollere objekter, der ikke er i brug, og fjerner dem. En hukommelseslækage vil ske, når der er objekter, der der ikke er i brug af appen, men garbage collector kan ikke genkende dem. Derfor vil de forblive i hukommelsen uden at blive brugt, hvilket reducerer mængden af hukommelse, der er tilgængelig for appen, hvilket giver uventede resultater.
Hvordan opdager man hukommelseslækager?
Der er flere måder at gøre det på. Vi vil dække nogle af dem i denne artikel.
Men lad os først skrive noget kode, der kan producere en hukommelseslækage. Vi vil oprette en app med to aktiviteter. Aktivitet A vil have en knap, der åbner aktivitet B. Sideløbende hermed vil vi også oprette en singleton-klasse, der indeholder en statisk reference til en Context.
class Manager {
private static Manager ourInstance;
private Context context;
static Manager getInstance(Context context) {
if (ourInstance == null) {
ourInstance = new Manager(context);
}
return ourInstance;
}
private Manager(Context context) {
this.context = context;
}
}
}
Vi vil kalde denne singleton fra aktivitet A
Manager.getInstance(this);
Detektering af hukommelseslækager ved hjælp af Android Studios monitorer
Android Studio indeholder praktiske værktøjer til profilering af din apps ydeevne, og et af dem er Memory Monitor. Vi kan bruge Memory Monitor til at opdage hukommelseslækager gennem følgende trin:
1. 1. Kør din app på din mobilenhed eller en emulator.
2. Åbn Android Monitor (tryk på Cmd + 6 på Mac eller Alt + 6 i Windows). Klik øverst i Memory Monitor på Start allokeringssporing.
3. Brug appen omkring den del, som du har mistanke om, at der er en hukommelseslækage. I vores eksempel går vi til en anden aktivitet.
4. Klik på Initiate GC for at tvinge garbage collector til at begynde at indsamle objekter, der ikke er i brug i øjeblikket, og fjerne dem. Du bør se, at hukommelsesgrafen falder en smule.
5. Klik på Dump Java Heap for at lade Android Studio generere en .hprof-fil, der indeholder et heap-snapshot. Den nemmeste måde at kontrollere en hukommelseslækage på er ved at bruge Analyzer Tasks
6. Åbn fanen Analyzer Tasks, og klik derefter på Run øverst på denne fane. Du bør se de lækkede aktiviteter i fanen Analyseresultater under fanen Analyzer Tasks.
Detektering af hukommelseslækager ved hjælp af Leak Canary
Leak Canary er et bibliotek, der er lavet af Square, og det er en meget hurtig måde at opdage hukommelseslækager på. Leak Canary giver dig mulighed for at opdage hukommelseslækager i længere løb, fordi du ikke behøver at tilslutte din enhed til Android Studio og overvåge din app i en længere periode. Leak Canary sender dig notifikationer, når der er en hukommelseslækage.
Integration af Leak Canary er virkelig nemt. Det eneste du skal gøre er at tilføje følgende til din build.gradle-fil på app-niveau:
dependencies {
debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.5.1’
releaseCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.5.1’
testCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.5.1’
}
Føj derefter følgende kode til din Application-klasse:
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
/// Denne proces er dedikeret til LeakCanary til heap-analyse.
// Du bør ikke initere din app i denne proces.
return;
}
LeakCanary.install(this);
/// Normal app-init-kode…
}
Og det var det, så er du klar til at gå i gang.
Detektering af mulige lækager med Infer
Infer er et statisk analyseværktøj lavet af Facebook, der hjælper dig med at finde mulige null pointer-exceptions og ressourcelækager samt annotation reachability, manglende lock guards og concurrency race conditions. Det er et godt værktøj at tilføje til din CI for at overvinde alle mulige fejl. Det er også open source, så udviklingen af værktøjet er stadig under udvikling. Du kan finde flere oplysninger om Infer i deres Quick Start-dokumentation.