Om din app är långsam på vissa enheter eller om Android Studios Instant Run-funktioner slutar att fungera slumpmässigt, kan du ha problem med minnesläckor.
När inträffar en minnesläcka?
En av de bästa sakerna med Java är garbage collector (GC). En garbage collector körs regelbundet för att kontrollera objekt som inte används och tar bort dem. En minnesläcka uppstår när det finns objekt som inte används av programmet men som inte kan identifieras av garbage collector. Därför kommer de att ligga kvar i minnet utan att användas, vilket minskar mängden tillgängligt minne för appen, vilket orsakar oväntade resultat.
Hur upptäcker man minnesläckor?
Det finns flera sätt att göra det på. Vi kommer att ta upp några av dem i den här artikeln.
Men först ska vi skriva lite kod som kan producera en minnesläcka. Vi kommer att skapa en app med två aktiviteter. Aktivitet A kommer att ha en knapp som öppnar aktivitet B. Vid sidan av detta kommer vi också att skapa en singletonklass som innehåller en statisk referens till 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 kommer att anropa denna singleton från aktivitet A
Manager.getInstance(this);
Detektering av minnesläckor med hjälp av Android Studios monitorer
Android Studio tillhandahåller praktiska verktyg för att profilera prestandan i din app, och ett av dem är Memory Monitor. Vi kan använda Memory Monitor för att upptäcka minnesläckor genom följande steg:
1. Kör din app på din mobila enhet eller en emulator.
2. Öppna Android Monitor (tryck på Cmd + 6 på Mac eller Alt + 6 i Windows). Klicka på Start Allocation Tracking högst upp i Memory Monitor.
3. Använd appen runt den del som du misstänker har en minnesläcka. I vårt exempel går vi till en annan aktivitet.
4. Klicka på Initiera GC för att tvinga skräpplockaren att börja samla in objekt som inte används för närvarande och ta bort dem. Du bör se att minnesgrafen minskar lite grann.
5. Klicka på Dump Java Heap för att låta Android Studio generera en .hprof-fil som innehåller en ögonblicksbild av heap. Det enklaste sättet att kontrollera en minnesläcka är att använda Analyzer Tasks
6. Öppna fliken Analyzer Tasks och klicka sedan på Run högst upp på fliken. Du bör se de läckta aktiviteterna i fliken Analysresultat under fliken Analyzer Tasks.
Detektering av minnesläckor med hjälp av Leak Canary
Leak Canary är ett bibliotek som gjorts av Square och det är ett mycket snabbt sätt att upptäcka minnesläckor. Leak Canary gör att du kan upptäcka minnesläckor i längre körningar eftersom du inte behöver ansluta enheten till Android Studio och övervaka din app under en längre tid. Leak Canary skickar meddelanden till dig när det finns en minnesläcka.
Integration av Leak Canary är väldigt enkelt. Allt du behöver göra är att lägga till följande i din build.gradle-fil på app-nivå:
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öljande kod läggs sedan till i din applikationsklass:
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
/// Den här processen är dedikerad till LeakCanary för heap-analys.
// Du bör inte starta din app i den här processen.
return;
}
LeakCanary.install(this);
/// Normal kod för att starta appen….
}
Och så är det, du är redo att köra.
Detektera möjliga läckor med Infer
Infer är ett statiskt analysverktyg från Facebook som hjälper dig att hitta möjliga nullpointerundantag och resursläckor samt annoteringarnas räckvidd, saknade låsvakter och tävlingsvillkor för samtidighet. Det är ett bra verktyg att lägga till i din CI för att komma till rätta med alla möjliga buggar. Det är också öppen källkod, så utvecklingen av verktyget utvecklas fortfarande. Du kan hitta mer information om Infer i deras Quick Start-dokumentation.