Profiling ist der Prozess der Messung der Anwendungsleistung anhand wichtiger Metriken: CPU-Auslastung, Speicherverbrauch, Netzwerkverkehr und Energieverbrauch. Das Ziel des Profilings ist es, Engpässe zu finden, die die Anwendung verlangsamen oder zu übermäßigem Ressourcenverbrauch führen. Laut Android Developers reduziert regelmäßiges Profiling während der Entwicklung die Anzahl der Leistungsfehler in der Produktion um bis zu 60% und hilft, eine flüssige Benutzeroberfläche auch auf schwächeren Geräten zu erhalten.
Wichtige Punkte
Profiling ist die Sammlung und Analyse von Daten darüber, wie eine Anwendung funktioniert: welche Funktionen ausgeführt werden, wie lange sie dauern, wie viel Speicher sie verbrauchen und wie sie mit dem Netzwerk interagieren. Im Gegensatz zum Logging arbeitet Profiling auf Systemebene und liefert präzise numerische Metriken statt subjektiver Bewertungen.
Das Hauptziel des Profilings ist es, Codeabschnitte zu finden, die Ressourcen suboptimal nutzen. Dies können langsame Methoden sein, die im UI-Thread aufgerufen werden, Speicherlecks, ineffiziente SQL-Abfragen, übermäßige Netzwerkaufrufe oder übermäßiger Energieverbrauch. Ohne Profiling beheben Entwickler das, was sich langsam anfühlt, anstatt sich auf reale Daten zu stützen.
Laut Google I/O 2023 zeigen Anwendungen, die während der Entwicklung regelmäßig profiliert werden, 40% weniger ANR-Fehler (Application Not Responding) und 50% weniger OutOfMemory-Abstürze. Profiling-Tools sind in alle modernen IDEs integriert — Android Studio Profiler für Android und Xcode Instruments für iOS.
Profiling kann statisch (Codeanalyse ohne Ausführung — lint, Detekt) und dynamisch (Messungen während der Anwendungslaufzeit) sein. Um echte Leistungsprobleme zu finden, wird dynamisches Profiling verwendet, das das tatsächliche Verhalten der Anwendung auf einem Gerät oder Emulator zeigt.
Profiling ist vor jedem großen Release erforderlich, bei der Einführung schwerer UI-Komponenten (Listen, Animationen, benutzerdefinierte Views), bei Beschwerden von Benutzern über Verzögerungen und Batterieentladung sowie nach Änderungen an der Anwendungsarchitektur. Ein systematischer Ansatz besteht darin, in jedem Sprint ein Profiling durchzuführen und eine Baseline der Metriken zu erfassen.
CPU-Profiling verfolgt, welche Methoden und Threads den Prozessor belasten und wie lange die Ausführung jedes Aufrufs dauert. Das Hauptziel ist es, Funktionen zu finden, die länger als erwartet laufen und den UI-Thread blockieren, was zu Bildausfällen (Jank) und ANRs führt.
Unter Android zeigt der CPU Profiler einen Top-Down-Baum — einen Aufrufbaum, in dem Sie sehen können, welche Methode im Kontext eines bestimmten Threads am längsten läuft. Unter iOS arbeitet Instruments Time Profiler auf Sampling-Basis: in regelmäßigen Abständen (z. B. 1 ms) zeichnet das System den Aufrufstapel jedes Threads auf. Die Stichprobenstatistik bestimmt, welcher Code die meiste Zeit benötigt.
// Beispiel: eine langsame Methode, die Jank verursacht
class UserAdapter : RecyclerView.Adapter<UserViewHolder>() {
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
// ❌ Diese Methode wird im UI-Thread aufgerufen und blockiert das Rendering
// Das Profiling zeigt, dass decompressImage 80% der Zeit benötigt
val user = getItem(position)
val bitmap = ImageUtils.decompressImage(user.avatar)
holder.avatarView.setImageBitmap(bitmap)
}
}
Achten Sie beim CPU-Profiling auf Methoden mit hoher Self Time — dies ist die Zeit, die eine Methode für ihre eigene Arbeit aufwendet, ohne Aufrufe von Kindmethoden. Wenn die Self Time einer Methode im UI-Thread 16 ms überschreitet, ist ein Bildausfall auf einem 60-FPS-Bildschirm garantiert. Die Lösung besteht darin, schwere Operationen in einen Hintergrundthread zu verschieben.
Speicher-Profiling verfolgt, wie viel Speicher eine Anwendung verwendet: welche Objekte erstellt werden, wie lange sie leben und wann sie freigegeben werden. Das Hauptziel ist es, Lecks (Objekte, die nicht existieren sollten, aber im Speicher bleiben) und übermäßige Allokationen (Objekte, die zu häufig erstellt werden) zu finden.
Unter Android zeigt der Memory Profiler ein Echtzeit-RAM-Verbrauchsdiagramm, eine Liste aller alloziierten Objekte und Details für jeden Typ. Wichtige Metriken: Java Heap (Objekte im JVM-Heap), Native Heap (Allokationen auf C/C++-Ebene), Graphics Memory (Texturen und GPU-Puffer). Für iOS zeigt Instruments Allocations ähnliche Metriken: Heap Allocations (Objekte im Heap) und Anonymous VM (Seiten des virtuellen Speichers).
| Metrik | Android Profiler | Instruments (iOS) |
|---|---|---|
| Heap-Objekte | Java Heap + Native Heap | Heap Allocations |
| Grafik | Graphics Memory | VM Tracker |
| Lecks | Memory Profiler + LeakCanary | Leaks instrument |
| Heap-Dump | HPROF (Capture) | Heapshot |
Beim Speicher-Profiling ist es wichtig, Heap-Dumps nach der Ausführung typischer Benutzerszenarien zu erstellen: Bildschirm öffnen und schließen, Liste laden, mit Bildern arbeiten. Der Vergleich zweier Dumps (vor und nach einem Szenario) zeigt, welche Objekte nicht freigegeben wurden. Wenn die Anzahl der Activity-Objekte gestiegen ist, der Bildschirm jedoch geschlossen wurde, handelt es sich um ein Leck.
Öffnen Sie in Android Studio den Dump über den Memory Profiler: sortieren Sie Objekte nach Retained Size (je größer, desto mehr Speicher hält das Objekt zurück). Suchen Sie nach Instanzen von Activity, Fragment und Bitmap, die nicht im Speicher vorhanden sein sollten. Wenn ein solches Objekt existiert, gehen Sie zum Reference Tree, um zu sehen, was es zurückhält.
Netzwerk-Profiling verfolgt alle HTTP-Anfragen der Anwendung: URL, Antwortgröße, Ausführungszeit, Antwortcodes und Header. Das Hauptziel ist es, Anfragen zu finden, die zu lange dauern, übermäßige Daten übertragen oder unnötig gestellt werden.
Unter Android zeigt der Network Profiler eine Zeitleiste aller Netzwerkaufrufe, deren Dauer und die Menge der übertragenen Daten. Jede Anfrage kann geöffnet werden, um vollständige Header und Antwortkörper anzuzeigen. Unter iOS verwendet Instruments Network für ähnliche Aufgaben die Überwachung des URL-Ladesystems und zeigt ein Wasserfalldiagramm der Anfragen.
Typische Probleme, die durch Netzwerk-Profiling identifiziert werden: fehlende Zwischenspeicherung (derselbe JSON wird jedes Mal geladen, wenn ein Bildschirm geöffnet wird), doppelte Anfragen (mehrere Komponenten fordern gleichzeitig dieselben Daten an), große Antworten (der Server sendet 5 MB JSON, wenn 100 KB benötigt werden). Für jedes Problem gibt es eine Standardlösung: Zwischenspeicherung über OkHttp oder URLSession konfigurieren, Abonnements über Combine oder Flow zusammenführen, serverseitige Paginierung hinzufügen.
Achten Sie besonders auf die Zeit bis zum ersten Byte (TTFB). Wenn der TTFB bei guter Verbindung 500 ms überschreitet, liegt das Problem auf der Serverseite. Wenn die Anfrage selbst schnell ist, aber das Parsen des JSON Sekunden dauert, liegt das Problem in der Deserialisierung und sollte separat profiliert werden.
Energie-Profiling misst, wie sich eine Anwendung auf die Akkulaufzeit auswirkt. Dies ist eine relativ neue Art des Profilings, aber für mobile Anwendungen von entscheidender Bedeutung — Benutzer löschen Apps, die den Akku übermäßig entladen. Der Energy Profiler in Android Studio und das Energy Log in Instruments zeigen, welche Operationen (Wi-Fi, GPS, CPU, Bluetooth) zu jedem Zeitpunkt Energie verbrauchen.
Hauptenergieverbraucher in mobilen Anwendungen: WakeLock (Prozessor aktiv halten), GPS-Standort (ständige Standortaktualisierungen), Netzwerkanfragen (insbesondere über 4G/5G), Hintergrundanimationen. Der Energy Profiler überlagert Anwendungsereignisse auf einer Energieverbrauchsskala — wenn es einen Ausschlag im Diagramm gibt, können Sie genau bestimmen, welche Operation ihn verursacht hat.
Laut Apple WWDC 2023 erhöht eine Reduzierung des Energieverbrauchs einer Anwendung um 20% die Benutzerbindung um 12%, da Benutzer dazu neigen, Apps zu löschen, die den Akku stark entladen. Die Empfehlung lautet, den Energy Profiler immer zu aktivieren, wenn Szenarien mit GPS, Hintergrundsynchronisation und Streaming getestet werden.
Die Wahl des Tools hängt von der Plattform und der Art des Profilings ab. Für Android ist das Hauptset Android Studio Profiler (CPU, Speicher, Netzwerk, Energie), LeakCanary (Speicherlecks) und Perfetto (systemweites Profiling). Für iOS — Xcode Instruments mit Vorlagen: Time Profiler, Allocations, Leaks, Energy Log, Network und Core Animation.
Für die plattformübergreifende Entwicklung mit Flutter verwenden Sie DevTools mit den Modulen Timeline (CPU), Memory, Network und Debugger. Für React Native — React DevTools und Flipper von Facebook, das die Inspektion von Netzwerk, Datenbank und UI-Hierarchie unterstützt. Unabhängig vom Framework sind die Grundprinzipien des Profilings universell: messen Sie vor und nach der Optimierung, erfassen Sie eine Baseline, vergleichen Sie Metriken bei jeder Codeänderung.
Moderne Ansätze umfassen automatisiertes Profiling in CI. Unter Android unterstützt Firebase Test Lab Leistungsmessungen zusammen mit UI-Tests: Sie erhalten nicht nur Bestehen/Nichtbestehen-Ergebnisse, sondern auch CPU-, Speicher- und Netzwerkdiagramme für jede Iteration. Ähnliche Funktionalität für iOS bieten GitHub Actions mit XCUITest und Instruments CLI.
Für eine schnelle Überprüfung einer einzelnen Metrik verwenden Sie den integrierten IDE-Profiler. Für eine umfassende Leckanalyse — spezialisierte Tools (LeakCanary, Instruments Leaks). Für systemweites Treiber-Profiling — Perfetto (Android) oder DTrace (macOS). Die Kombination von zwei oder drei Tools deckt 95% der Profiling-Szenarien ab.
Häufig gestellte Fragen
Logging zeigt eine Abfolge von Ereignissen in Textform, während Profiling quantitative Metriken liefert — wie viel Zeit, Speicher, CPU und Netzwerk jeder Codeabschnitt verbraucht. Profiling beantwortet die Frage „wie viel“, während Logging die Frage „was ist passiert“ beantwortet.
Es wird empfohlen, vor jedem größeren Release, bei der Einführung neuer schwerer UI-Komponenten und bei Leistungsbeschwerden zu profilieren. Idealerweise ist das Profiling in CI integriert und wird bei jedem Pull-Request automatisch ausgeführt.
Ja, und dies ist sogar einem Emulator vorzuziehen. Ein echtes Gerät zeigt die tatsächliche Leistung unter Berücksichtigung der Einschränkungen der spezifischen Hardware. Android Studio Profiler und Xcode Instruments unterstützen das Profiling auf einem angeschlossenen Gerät ohne Einschränkungen.
Ja, jeder Profiler fügt Overhead hinzu. Für sampling-basiertes CPU-Profiling beträgt der Overhead 1–5%. Für Speicher-Profiling mit Heap-Dumps beträgt er zum Zeitpunkt des Dumps bis zu 10%. Moderne Tools versuchen, den Einfluss zu minimieren, aber er sollte bei der Interpretation der Ergebnisse immer berücksichtigt werden.
Baseline ist ein Referenzsatz von Leistungsmetriken, der in der ersten stabilen Version der Anwendung erfasst wurde. Vergleichen Sie bei jeder Codeänderung die neuen Metriken mit der Baseline. Wenn die Startzeit um 50 ms gegenüber der Baseline gestiegen ist, untersuchen Sie die Ursache vor dem Zusammenführen der Änderungen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch