Wenn Ihre App auf einigen Geräten langsam ist oder die Instant-Run-Funktionen von Android Studio zufällig nicht mehr funktionieren, könnte es sein, dass Sie Speicherlecks haben.
Wann tritt ein Speicherleck auf?
Eine der großartigen Eigenschaften von Java ist der Garbage Collector (GC). Der Garbage Collector prüft in regelmäßigen Abständen Objekte, die nicht verwendet werden, und entfernt sie. Ein Speicherleck entsteht, wenn es Objekte gibt, die von der Anwendung nicht verwendet werden, der Garbage Collector sie aber nicht erkennen kann. Daher verbleiben sie ungenutzt im Speicher und verringern den für die Anwendung verfügbaren Speicher, was zu unerwarteten Ergebnissen führt.
Wie erkennt man Speicherlecks?
Es gibt mehrere Möglichkeiten, dies zu tun. Wir werden in diesem Artikel einige davon behandeln.
Zunächst wollen wir jedoch einen Code schreiben, der ein Speicherleck verursachen könnte. Wir werden eine App mit zwei Aktivitäten erstellen. Aktivität A wird eine Schaltfläche haben, die Aktivität B öffnet. Außerdem werden wir eine Singleton-Klasse erstellen, die eine statische Referenz auf einen Context enthält.
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;
}
}
Wir werden dieses Singleton von Activity A aufrufen
Manager.getInstance(this);
Detecting Memory Leaks Using Android Studio’s Monitors
Android Studio bietet praktische Tools für das Profiling der Leistung Ihrer App, und eines davon ist der Memory Monitor. Wir können den Memory Monitor verwenden, um Speicherlecks durch die folgenden Schritte zu erkennen:
1. Starten Sie Ihre App auf Ihrem mobilen Gerät oder einem Emulator.
2. Öffnen Sie Android Monitor (Drücken Sie Cmd + 6 auf dem Mac oder Alt + 6 unter Windows). Klicken Sie oben im Memory Monitor auf Start Allocation Tracking.
3. Verwenden Sie die App in der Nähe des Bereichs, in dem Sie ein Speicherleck vermuten. In unserem Beispiel gehen wir zu einer anderen Aktivität.
4. Klicken Sie auf Initiate GC, um den Garbage Collector zu zwingen, Objekte zu sammeln, die derzeit nicht verwendet werden, und sie zu entfernen. Sie sollten sehen, dass der Speichergraph ein wenig abnimmt.
5. Klicken Sie auf Dump Java Heap, damit Android Studio eine .hprof-Datei erzeugt, die einen Heap-Snapshot enthält. Der einfachste Weg, ein Speicherleck zu überprüfen, ist die Verwendung von Analyzer Tasks
6. Öffnen Sie die Registerkarte Analyzer Tasks und klicken Sie dann oben auf dieser Registerkarte auf Run. Sie sollten die ausgelaufenen Aktivitäten in der Registerkarte „Analyseergebnisse“ unterhalb der Registerkarte „Analyzer Tasks“ sehen.
Erkennen von Speicherlecks mit Leak Canary
Leak Canary ist eine Bibliothek von Square und eine sehr schnelle Methode, um Speicherlecks zu erkennen. Mit Leak Canary können Sie Speicherlecks in längeren Laufzeiten aufspüren, da Sie Ihr Gerät nicht mit Android Studio verbinden und Ihre App über einen langen Zeitraum überwachen müssen. Leak Canary sendet Ihnen Benachrichtigungen, wenn ein Speicherleck auftritt.
Die Integration von Leak Canary ist wirklich einfach. Alles, was Sie tun müssen, ist, das Folgende zu Ihrer App-Level build.gradle-Datei hinzuzufügen:
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‘
}
Dann fügen Sie den folgenden Code zu Ihrer Anwendungsklasse hinzu:
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Dieser Prozess ist für LeakCanary zur Heap-Analyse bestimmt.
// Sie sollten Ihre App nicht in diesem Prozess starten.
return;
}
LeakCanary.install(this);
// Normaler App-Init-Code…
}
Und das war’s, Sie können loslegen.
Mögliche Lecks mit Infer aufspüren
Infer ist ein statisches Analysetool von Facebook, das Ihnen hilft, mögliche Nullzeigerausnahmen und Ressourcenlecks sowie die Erreichbarkeit von Annotationen, fehlende Lock Guards und Gleichzeitigkeits-Race-Bedingungen zu finden. Es ist ein gutes Tool, das Sie zu Ihrem CI hinzufügen können, um alle möglichen Fehler zu beseitigen. Es ist außerdem Open Source, so dass die Entwicklung des Tools immer noch fortschreitet. Weitere Informationen über Infer finden Sie in der Schnellstart-Dokumentation.