Die Optimierung der CPU-Auslastung Ihrer App bietet viele Vorteile, z. B. eine schnellere und reibungslosere Benutzererfahrung und die Akkulaufzeit des Geräts.
Sie können den CPU-Profiler verwenden, um die CPU-Auslastung und Thread-Aktivität Ihrer App in Echtzeit zu überprüfen, während Sie mit Ihrer App interagieren, oder Sie können die Details in aufgezeichneten Methodenspuren, Funktionsspuren und Systemspuren überprüfen.
Die spezifischen Arten von Informationen, die der CPU-Profiler aufzeichnet und anzeigt, werden durch die von Ihnen gewählte Aufzeichnungskonfiguration bestimmt:
- System-Trace: Erfasst feinkörnige Details, mit denen Sie überprüfen können, wie Ihre App mit Systemressourcen interagiert.
-
Methoden- und Funktionsspuren: Für jeden Thread in Ihrem App-Prozess können Sie herausfinden, welche Methoden (Java) oder Funktionen (C / C ++) über einen bestimmten Zeitraum ausgeführt werden und welche CPU-Ressourcen jede Methode oder Funktion während ihrer Ausführung verbraucht. Sie können auch Methoden- und Funktionsspuren verwenden, um Anrufer und Angerufene zu identifizieren. Ein Aufrufer ist eine Methode oder Funktion, die eine andere Methode oder Funktion aufruft, und ein Angerufener ist eine Methode oder Funktion, die von einer anderen Methode oder Funktion aufgerufen wird. Sie können diese Informationen verwenden, um zu bestimmen, welche Methoden oder Funktionen dafür verantwortlich sind, bestimmte ressourcenintensive Aufgaben zu oft aufzurufen und den Code Ihrer App zu optimieren, um unnötige Arbeit zu vermeiden.
Wenn Sie Methodenspuren aufnehmen, können Sie sampled oder instrumentedrecording wählen. Bei der Aufnahme von Funktionsspuren können Sie nur Sampled Recording verwenden.
Einzelheiten zur Verwendung und Auswahl jeder dieser Trace-Optionen finden Sie unterwählen Sie eine Aufzeichnungskonfiguration.
- CPU Profiler Übersicht
- Record traces
- Wählen Sie eine Aufzeichnungskonfiguration
- Erstellen, Bearbeiten oder Anzeigen einer Aufzeichnungskonfiguration
- CPU-Aktivität mit der Debug-API aufzeichnen
- CPU-Aktivität beim Start der App aufzeichnen
- Spuren exportieren
- Spuren importieren
- Inspect traces
- Spuren mit dem Anrufdiagramm untersuchen
- Leiterbahnen mit der Registerkarte Flammendiagramm untersuchen
- Traces von oben nach unten und von unten nach oben untersuchen
- Inspect system traces
- Frame-Rendering-Daten überprüfen
CPU Profiler Übersicht
Um den CPU Profiler zu öffnen, gehen Sie folgendermaßen vor:
-
Wählen Sie Ansicht > Werkzeugfenster > Profiler oder klicken Sie auf Profil in der Symbolleiste.
Wenn Sie im Dialogfeld Bereitstellungsziel auswählen dazu aufgefordert werden, wählen Sie das Gerät aus, auf dem Ihre App für die Profilerstellung bereitgestellt werden soll. Wenn Sie ein Gerät über USB angeschlossen haben, es aber nicht aufgelistet sehen, stellen Sie sicher, dass Sie das USB-Debugging aktiviert haben.
-
Klicken Sie auf eine beliebige Stelle in der CPU-Timeline, um den CPU Profiler zu öffnen.
Wenn Sie den CPU-Profiler öffnen, werden sofort die CPU-Auslastung und die Thread-Aktivität Ihrer App angezeigt. Sie sollten etwas Ähnliches wie Abbildung 1 sehen.
Abbildung 1. Zeitleisten im CPU-Profiler.
Wie in Abbildung 1 gezeigt, enthält die Standardansicht für den CPU-Profiler die folgenden Zeitleisten:
- Ereigniszeitleiste: Zeigt die Aktivitäten in Ihrer App beim Übergang durch verschiedene Zustände in ihrem Lebenszyklus an und zeigt Benutzerinteraktionen mit dem Gerät an, einschließlich Bildschirmrotationsereignissen. Informationen zum Aktivieren der Ereigniszeitleiste auf Geräten mit Android 7.1 (API-Stufe 25) und niedriger finden Sie unter Erweiterte Profilerstellung aktivieren.CPU-Zeitleiste: Zeigt die CPU-Auslastung Ihrer App in Echtzeit – als Prozentsatz der insgesamt verfügbaren CPU—Zeit – und die Gesamtzahl der Threads, die Ihre App verwendet. Die Zeitleiste zeigt auch die CPU-Auslastung anderer Prozesse (z. B. Systemprozesse oder andere Apps) an, sodass Sie sie mit der Nutzung Ihrer App vergleichen können. Sie können historische CPU-Auslastungsdaten überprüfen, indem Sie die Maus entlang der horizontalen Achse der Zeitleiste bewegen.
- Thread-Aktivitäts-Timeline: Listet jeden Thread auf, der zu Ihrem App-Prozess gehört, und zeigt seine Aktivität entlang einer Timeline in den unten aufgeführten Farben an. Nachdem Sie eine Ablaufverfolgung aufgezeichnet haben, können Sie einen Thread aus dieser Zeitleiste auswählen, um seine Daten im Bereich Ablaufverfolgung zu überprüfen.
- Grün: Der Thread ist aktiv oder bereit, die CPU zu verwenden. Das heißt, es befindet sich in einem laufenden oder ausführbaren Zustand.
- Gelb: Der Thread ist aktiv, wartet jedoch auf eine E / A-Operation, z. B. Festplatten- oder Netzwerk-E/ A, bevor er seine Arbeit abschließen kann.
- Grau: Der Thread schläft und verbraucht keine CPU-Zeit. Dies tritt manchmal auf, wenn der Thread Zugriff auf eine Ressource benötigt, die noch nicht verfügbar ist. Entweder geht der Thread in den freiwilligen Ruhezustand oder der Kernel versetzt den Thread in den Ruhezustand, bis die erforderliche Ressource verfügbar ist.
Der CPU—Profiler meldet auch die CPU-Auslastung von Threads, die Android Studio und die Android-Plattform Ihrem App-Prozess hinzufügen, z. B.
JDWP
Profile Saver
Studio:VMStats
Studio:Perfa
undStudio:Heartbeat
(obwohl die genauen Namen, die in der Thread-Aktivitäts-Timeline angezeigt werden, variieren können). Android Studio meldet diese Daten, damit Sie erkennen können, wann Thread-Aktivität und CPU-Auslastung tatsächlich durch den Code Ihrer App verursacht werden.
Record traces
Um die Aufzeichnung eines Traces zu starten, wählen Sie eine Aufnahmekonfiguration aus einem der Dropdown-Menüs über oder unter dem CPU Profiler aus und klicken Sie auf Record.
Abbildung 2. Der CPU Profiler zeigt den Status, die Dauer und die Art der Aufzeichnung an.
Interagieren Sie mit Ihrer App, und klicken Sie dann auf Stopp, wenn Sie fertig sind. Theprofiler zeigt automatisch seine Ablaufverfolgungsinformationen im Bereich Ablaufverfolgung, ashown in Abbildung 3:
Abbildung 3. Der CPU-Profiler nach der Aufzeichnung eines Methoden-Trace.
- Ausgewählter Bereich: Bestimmt den Teil der aufgezeichneten Zeit, der im Bereich Ablaufverfolgung überprüft werden soll. Wenn Sie zum ersten Mal einen Trace aufzeichnen, wählt der CPU-Profiler automatisch die gesamte Länge Ihrer Aufzeichnung in der CPU-Timeline aus. Um Tracedaten nur für einen Teil des aufgezeichneten Zeitbereichs zu überprüfen, ziehen Sie die Kanten des hervorgehobenen Bereichs.
- Interaktionsabschnitt: Zeigt Benutzerinteraktion und App-Lebenszyklusereignisse entlang einer Zeitleiste an.
- Abschnitt Threads: Zeigt die Aktivität des Thread-Status an (z. B. Ausführen, Schlafen usw.) und Rufen Sie Chart (oder Trace Event Chart in System Trace) für jeden Thread entlang einer Timeline auf.
- Verwenden Sie Maus- und Tastaturkürzel, um in der Zeitleiste zu navigieren.
- Doppelklicken Sie auf den Threadnamen oder drücken Sie die Eingabetaste, während ein Thread ausgewählt ist, um einen Thread zu erweitern oder zu reduzieren.
- Wählen Sie einen Thread aus, um zusätzliche Informationen im Analysefenster anzuzeigen. Halten Sie Umschalt oder Strg (Befehl auf Mac) gedrückt, um mehrere Threads auszuwählen.
- Wählen Sie einen Methodenaufruf (oder ein Trace-Ereignis im Systemtrace) aus, um zusätzliche Informationen im Analysefenster anzuzeigen.
- Analysefenster: Zeigt Ablaufverfolgungsdaten für den ausgewählten Zeitbereich und Thread- oder Methodenaufruf an. In diesem Bereich können Sie auswählen, wie jeder Stack-Trace angezeigt werden soll (mithilfe der Registerkarten Analyse) und wie die Ausführungszeit gemessen werden soll (mithilfe des Dropdown-Menüs Zeitreferenz).
- Registerkarten des Analysefensters: Wählen Sie aus, wie Trace-Details angezeigt werden sollen. Einzelheiten zu den einzelnen Optionen finden Sie unter Leiterbahnen prüfen.
- Zeitreferenzmenü: Wählen Sie eine der folgenden Optionen aus, um zu bestimmen, wie die Timinginformationen für jeden Anruf gemessen werden (nur in Java-Methoden für Sample /Trace unterstützt):
- Wanduhrzeit: Timing-Informationen stellen die tatsächlich verstrichene Zeit dar.
- Thread-Zeit: Timing-Informationen repräsentieren die tatsächlich verstrichene Zeit abzüglich eines Teils dieser Zeit, wenn der Thread keine CPU-Ressourcen verbraucht. Für jeden Anruf ist seine Thread-Zeit immer kleiner oder gleich seiner Wanduhrzeit. Die Verwendung der Thread-Zeit gibt Ihnen ein besseres Verständnis dafür, wie viel von der tatsächlichen CPU-Auslastung eines Threads von einer bestimmten Methode oder Funktion verbraucht wird.
- Filter: Filtert Trace-Daten nach Funktion, Methode, Klasse oder Paketname. Wenn Sie beispielsweise Trace-Daten zu einem bestimmten Anruf schnell identifizieren möchten, geben Sie den Namen in das Suchfeld ein. Auf der Registerkarte Flame Chart werden Aufrufstapel hervorgehoben, die einen Aufruf, ein Paket oder eine Klasse enthalten, die der Suchabfrage entsprechen. Auf den Registerkarten von oben nach unten und von unten nach oben werden diese Aufrufstapel vor anderen Ablaufverfolgungsergebnissen priorisiert. Sie können die folgenden Optionen auch aktivieren, indem Sie das entsprechende Kontrollkästchen neben dem Suchfeld aktivieren:
- Regex: Verwenden Sie diese Option, um reguläre Ausdrücke in Ihre Suche aufzunehmen.
- Groß-/Kleinschreibung: Wenn bei Ihrer Suche die Groß-/Kleinschreibung beachtet wird, verwenden Sie diese Option.
- Vergrößern: Drücken Sie W oder scrollen Sie mit dem Mausrad, während Sie Strg gedrückt halten (Befehl auf Mac).
- Verkleinern: Drücken Sie S oder bewegen Sie das Mausrad rückwärts, während Sie Strg (Befehl auf Mac) gedrückt halten.
- Schwenken nach links: Drücken Sie A oder ziehen Sie die Maus nach rechts, während Sie die Leertaste gedrückt halten.
- Schwenken nach rechts: Drücken Sie D oder ziehen Sie die Maus nach links, während Sie die Leertaste gedrückt halten.
- Erweitern oder Reduzieren eines Threads: Doppelklicken Sie auf den Threadnamen oder drücken Sie die Eingabetaste, während ein Thread ausgewählt ist.
Wählen Sie eine Aufzeichnungskonfiguration
Bevor Sie mit der Aufzeichnung von Trace-Informationen beginnen, wählen Sie die entsprechende Aufzeichnungskonfiguration für die Profilerstellungsinformationen aus, die Sie erfassen möchten:
- Beispiel-Java-Methoden: Erfasst den Aufrufstapel Ihrer App in regelmäßigen Abständen während der Java-basierten Codeausführung Ihrer App. Der Profiler vergleicht erfasste Datensätze, um Timing- und Ressourcennutzungsinformationen über die Java-basierte Codeausführung Ihrer App abzuleiten. Ein inhärentes Problem der stichprobenbasierten Ablaufverfolgung besteht darin, dass, wenn Ihre App nach einer Erfassung des Aufrufstapels eine Methode eingibt und die Methode vor der nächsten Erfassung beendet, dieser Methodenaufruf nicht vom Profiler protokolliert wird. Wenn Sie an Tracing-Methoden mit so kurzen Lebenszyklen interessiert sind, sollten Sie Instrumented Tracing verwenden.
- Java-Methoden verfolgen: Instrumentiert Ihre App zur Laufzeit, um am Anfang und am Ende jedes Methodenaufrufs einen Zeitstempel aufzuzeichnen. Zeitstempel werden gesammelt und verglichen, um Methodenablaufverfolgungsdaten zu generieren, einschließlich Zeitinformationen und CPU-Auslastung.
Beachten Sie, dass sich der mit der Instrumentierung jeder Methode verbundene Overhead auf die Laufzeitleistung auswirkt und die Profilerstellungsdaten beeinflussen kann. Wenn Ihre App in kurzer Zeit eine große Anzahl von Methoden ausführt, überschreitet der Profiler möglicherweise schnell seine Dateigrößenbeschränkung und kann möglicherweise keine weiteren Ablaufverfolgungsdaten aufzeichnen.
- Beispiel-C/C ++ – Funktionen: Erfasst abgetastete Traces der nativen Threads Ihrer App. Um diese Konfiguration zu verwenden, müssen Sie Ihre App auf einem Gerät mit Android 8.0 (API Level 26) oder höher bereitstellen.
Intern verwendet diese Konfiguration
simpleperf
, um den nativen Code Ihrer App zu verfolgen. Wenn Sie zusätzliche Optionen fürsimpleperf
angeben möchten, z. B. das Abtasten bestimmter Geräte-CPUs oder das Angeben von Abtastdauern mit hoher Genauigkeit, können Siesimpleperf
über die Befehlszeile verwenden. - Trace-Systemaufrufe: Erfasst feinkörnige Details, mit denen Sie überprüfen können, wie Ihre App mit Systemressourcen interagiert. Sie können die genauen Zeitpunkte und Dauer Ihrer Thread-Zustände überprüfen, visualisieren, wo sich Ihre CPU-Engpässe auf allen Kernen befinden, und benutzerdefinierte Ablaufverfolgungsereignisse zur Analyse hinzufügen. Solche Informationen können entscheidend sein, wenn Sie Leistungsprobleme beheben. Um diese Konfiguration zu verwenden, müssen Sie Ihre App auf einem Gerät mit Android 7.0 (API Level 24) oder höher bereitstellen.
Während Sie diese Trace-Konfiguration verwenden, können Sie wichtige Code-Routinen in der Profiler-Timeline visuell markieren, indem Sie Ihren Code instrumentieren. Verwenden Sie zum Instrumentieren von C/C ++ – Code die native Ablaufverfolgungs-API von
trace.h
. Verwenden Sie zum Instrumentieren von Java-Code die KlasseTrace
. Weitere Informationen finden Sie unter Instrumentieren Ihres App-Codes.Diese Trace-Konfiguration basiert auf
systrace
. Sie können das Befehlszeilenprogrammsystrace
verwenden, um Optionen anzugeben, die über die im CPU-Profiler angegebenen hinausgehen. Die zusätzlichen Daten auf Systemebene, die vonsystrace
bereitgestellt werden, können Ihnen helfen, native Systemprozesse zu überprüfen und Fehler bei ausgelassenen oder verzögerten Frames zu beheben.Auf Geräten mit Android 9 (API Level 28) oder höher können Sie eine System-App namens System Tracing verwenden, um System-Traces auf einem Gerät aufzuzeichnen.
Erstellen, Bearbeiten oder Anzeigen einer Aufzeichnungskonfiguration
Sie erstellen, bearbeiten und Anzeigen von Aufzeichnungskonfigurationen im Dialog CPU RecordingConfigurations, den Sie öffnen, indem Sie im Dropdown-Menü Aufzeichnungskonfigurationen oben im CPU Profiler die Option Konfigurationen bearbeiten auswählen.
Um die Einstellungen einer vorhandenen Aufzeichnungskonfiguration anzuzeigen, wählen Sie diese im linken Bereich des Dialogfelds CPU-Aufzeichnungskonfigurationen aus.
Um eine neue Aufnahmekonfiguration zu erstellen, gehen Sie wie folgt vor:
- Klicken Sie oben links im Dialogfeld auf Add . Dadurch wird eine neue Konfiguration mit einigen erstelltstandardeinstellungen.
- Benennen Sie Ihre Konfiguration.
- Wählen Sie eine Trace-Technologie aus.
- Geben Sie für abgetastete Aufzeichnungskonfigurationen das Abtastintervall in Mikrosekunden (µs) an. Dieser Wert stellt die Zeit zwischen jedem Beispiel des Aufrufstapels Ihrer App dar. Je kürzer das von Ihnen angegebene Intervall ist, desto schnellererreichen Sie die Dateigrößenbeschränkung für die aufgezeichneten Daten.
- Geben Sie die Dateigrößenbeschränkung in Megabyte (MB) für die aufgezeichneten Daten an, die auf das angeschlossene Gerät geschrieben werden. Wenn Sie die Aufnahme beenden, analysiert AndroidStudio diese Daten und zeigt sie im Profiler-Fenster an. Wenn Sie also das Limit erhöhen und eine große Datenmenge aufzeichnen, benötigt Android Studio viel länger, um die Datei zu analysieren, und reagiert möglicherweise nicht mehr.Hinweis: Wenn Sie ein angeschlossenes Gerät mit Android 8.0 (API Level 26)oder höher verwenden, gibt es keine Begrenzung für die Dateigröße der Ablaufverfolgungsdaten, und thisvalue wird ignoriert. Sie müssen jedoch immer noch darauf achten, wie viel Daten Das Gerät nach jeder Aufnahme sammelt – Android Studio kann Schwierigkeiten haben, große Trace-Dateien zu parsen. Wenn Sie beispielsweise entweder einen Sampledtrace mit einem kurzen Abtastintervall oder einen instrumentierten Trace aufzeichnen, während Ihre App in kurzer Zeit viele Methoden aufruft, generieren Sie schnell große Trace-Dateien.
- Um die Änderungen zu akzeptieren und weitere Änderungen an anderen Konfigurationen vorzunehmen, klicken Sie auf Übernehmen. Um alle vorgenommenen Änderungen zu akzeptieren und das Dialogfeld zu schließen, klicken Sie auf OK.
CPU-Aktivität mit der Debug-API aufzeichnen
Sie können die Debug
API verwenden, um Ihrer App die Möglichkeit zu geben, die Aufzeichnung der CPU-Aktivität im CPU-Profiler zu starten und zu stoppen.
Der CPU-Profiler beginnt mit der Aufzeichnung, wenn Ihre AppstartMethodTracing(String tracePath)
aufruft, und der CPU-Profiler stoppt die Aufzeichnung, wenn Ihre AppstopMethodTracing()
aufruft. Während der Aufzeichnung der CPU-Aktivität, die mit dieser API ausgelöst wird, zeigt der CPU-Profiler die DEBUG-API als aktive CPU-Aufzeichnungskonfiguration an.
Um die Aufzeichnung der CPU-Aktivität mit der Debug
API zu steuern, stellen Sie Ihre instrumentierte App auf einem Gerät mit Android 8.0 (API Level 26) oder höher bereit.
Wichtig: Die Debug
API soll getrennt von anderen Mitteln zum Starten und Stoppen der Aufzeichnung von Cpuaktivität verwendet werden, z. B. die Schaltflächen in der grafischen Benutzeroberfläche von CPU Profiler und die Einstellung in der Aufnahmekonfiguration für die automatische Aufzeichnung beim Start der App.
Aufgrund der Puffergrößenbeschränkung von 8 MB ist die startMethodTracing(String tracePath)
-Methode in der Debug
-API für kurze Intervalle oder Szenarien ausgelegt, in denen die Aufzeichnung manuell gestartet / gestoppt werden muss. Verwenden Sie für längere Aufnahmezeiträume die Profiler-Benutzeroberfläche in Android Studio.
Weitere Informationen finden Sie untergenerieren Sie Ablaufverfolgungsprotokolle, indem Sie Ihre App instrumentieren.
CPU-Aktivität beim Start der App aufzeichnen
Um die CPU-Aktivität beim Start der App automatisch aufzuzeichnen, gehen Sie folgendermaßen vor:
- Wählen Sie Ausführen > Konfigurationen bearbeiten.
- Aktivieren Sie auf der Registerkarte Profilerstellung das Kontrollkästchen neben Aufzeichnung eines Methodentrace beim Start starten.
- Wählen Sie eine CPU-Aufnahmekonfiguration aus dem Menü.
- Klicken Sie auf Anwenden.
- Stellen Sie Ihre App auf einem Gerät mit Android 8.0 (API Level 26) oder höher bereit, indem Sie Run > Profile auswählen.
Spuren exportieren
Nachdem Sie die CPU-Aktivität mit dem CPU-Profiler aufgezeichnet haben, können Sie die Daten als .trace
-Datei exportieren, um sie mit anderen zu teilen oder später zu überprüfen.
Um eine Ablaufverfolgungsdatei aus der CPU-Timeline zu exportieren, gehen Sie wie folgt vor:
- Klicken Sie in der CPU-Timeline mit der rechten Maustaste auf die aufgezeichnete Methodenverfolgung oder Systemverfolgung, die Sie exportieren möchten.
- Wählen Sie Trace exportieren aus dem Menü.
- Navigieren Sie zum Speicherort der Datei, geben Sie den Dateinamen an und klicken Sie auf Speichern.
Um eine Ablaufverfolgungsdatei aus dem Bereich Sitzungen zu exportieren, gehen Sie wie folgt vor:
- Klicken Sie im Bereich Sitzungen mit der rechten Maustaste auf die aufgezeichnete Ablaufverfolgung, die Sie exportieren möchtenexportieren.
- Klicken Sie rechts neben dem Sitzungseintrag auf die Schaltfläche Methodenverfolgung exportieren oder Systemverfolgung exportieren.
- Navigieren Sie zum Speicherort der Datei, geben Sie den Dateinamen an und klicken Sie auf Speichern.
Spuren importieren
Sie können .trace
Dateien importieren, die mit derDebug
API oder dem CPU-Profiler erstellt wurden.
Importieren Sie Ihre Trace-Datei, indem Sie im Bereich Sitzungen des Profilers auf Neue Profiler-Sitzung starten klicken und dann Aus Datei laden auswählen.
Sie können eine importierte Ablaufverfolgung im CPU-Profiler genauso überprüfen wie direkt im CPU-Profiler erfasste Ablaufverfolgungen, mit den folgenden Ausnahmen:
- Die CPU-Aktivität wird nicht entlang der CPU-Timeline dargestellt (außer im System-Trace).
- Die Timeline im Abschnitt Threads zeigt keine Thread-Zustände wie running, waiting oder Sleeping (außer im System Trace).
Inspect traces
Die Trace-Ansicht im CPU Profiler bietet mehrere Möglichkeiten, Informationen von aufgezeichneten Traces anzuzeigen.
Für Methoden- und Funktionsspuren können Sie das Aufrufdiagramm direkt in der Threads-Timeline und die Registerkarten Aufrufdiagramm, von oben nach unten und Unten nach oben im Analysefenster anzeigen. Für System-Traces können Sie die Trace-Ereignisse direkt in der Threads-Timeline und auf den Registerkarten Flame Chart, Top Down und Bottom Up im Analysepane anzeigen.
Maus- und Tastaturkürzel sind verfügbar, um die Navigation von Anrufdiagrammen oder Trace-Ereignissen zu vereinfachen.
Spuren mit dem Anrufdiagramm untersuchen
Das Anrufdiagramm stellt eine grafische Darstellung eines Methodenablaufs oder Funktionsablaufs bereit, wobei der Zeitraum und das Timing eines Anrufs auf der horizontalen Achse dargestellt werden und seine Angerufenen entlang der vertikalen Achse angezeigt werden. Aufrufe von System-APIs werden in Orange angezeigt, Aufrufe der eigenen Methoden Ihrer App in Grün und Aufrufe von APIs von Drittanbietern (einschließlich Java-Sprach-APIs) in Blau. Abbildung 4 zeigt ein Beispielaufrufdiagramm und veranschaulicht das Konzept der Selbstzeit, der untergeordneten Zeit und der Gesamtzeit für eine bestimmte Methode oder Funktion. Sie canlearn mehr über diese Konzepte in dem Abschnitt, wie toinspect Spuren mit Top-Down und Bottom-Up.
Abbildung 4. Ein Beispielaufrufdiagramm, das Selbst, Kinder und Gesamtzeit für die Methode D veranschaulicht.
Tipp: Um den Quellcode einer Methode oder Funktion zu springen, klicken Sie mit der rechten Maustaste darauf und wählen Sie Zur Quelle springen. Dies funktioniert auf allen Registerkarten des Analysefensters.
Leiterbahnen mit der Registerkarte Flammendiagramm untersuchen
Die Registerkarte Flammendiagramm bietet ein invertiertes Aufrufdiagramm, das identische Aufrufstapel aggregiert. Das heißt, identische Methoden oder Funktionen, die dieselbe Sequenz von Anrufern teilen, werden gesammelt und als ein längerer Balken in einem Flammendiagramm dargestellt (anstatt sie als mehrere kürzere Balken anzuzeigen, wie in einem Aufrufdiagramm gezeigt). Dies macht es einfacher zu sehen, welche Methoden oder Funktionen die meiste Zeit verbrauchen. Dies bedeutet jedoch auch, dass die horizontale Achse keine Zeitlinie darstellt. Stattdessen gibt es die relative Zeit an, die jede Methode oder Funktion zur Ausführung benötigt.
Um dieses Konzept zu veranschaulichen, betrachten Sie das Anrufdiagramm in Abbildung 5. Beachten Sie, dass Methode D mehrere Aufrufe an B (B1, B2 und B3) ausführt und einige dieser Aufrufe an B einen Aufruf an C (C1 und C3) tätigen.
Abbildung 5. Ein Anrufdiagramm mit mehreren Methodenaufrufen, die eine gemeinsame Sequenz von Anrufern gemeinsam haben.
Da B1, B2 und B3 dieselbe Sequenz von Anrufern (A → D → B) verwenden, werden sie aggregiert, wie in Abbildung 6 gezeigt. In ähnlicher Weise werden C1 und C3 aggregiert, da sie dieselbe Anrufersequenz (A → D → B → C) haben; Beachten Sie, dass C2 nicht enthalten ist, da es eine andere Anrufersequenz (A → D → C) hat.
Abbildung 6. Aggregieren identischer Methoden, die sich teilender gleiche Aufrufstapel.
Die aggregierten Aufrufe werden verwendet, um das Flammendiagramm zu erstellen, wie in Abbildung 7 gezeigt.Beachten Sie, dass für jeden Anruf in einem Flammendiagramm die Anrufer, die die meiste CPU-Zeit verbrauchen, zuerst angezeigt werden.
Abbildung 7. Eine Flammendiagrammdarstellung des in Abbildung 5 gezeigten Callcharts.
Traces von oben nach unten und von unten nach oben untersuchen
Auf der Registerkarte Top Down wird eine Liste der Aufrufe angezeigt, in denen beim Erweitern einer Methode oder eines Knotens die aufgerufenen Knoten angezeigt werden. Abbildung 8 zeigt ein Top-Down-Diagramm für das Callchart in Abbildung 4. Jeder Pfeil in der Grafik zeigt von einem Anrufer zu einem Angerufenen.
Wie in Abbildung 8 gezeigt, zeigt das Erweitern des Knotens für Methode A auf der Registerkarte von oben nach unten die aufgerufenen Methoden B und D. Danach werden beim Erweitern des Knotens für methodD die aufgerufenen Methoden B und C usw. angezeigt. Ähnlich wie bei der Flame Charttab aggregiert der Top-Down-Baum Traceinformationen für identische Methoden, die denselben Aufrufstapel verwenden. Das heißt, die Registerkarte Flammendiagramm bietet eine Grafikdarstellung der Registerkarte von oben nach unten.
Die Top-Down-Registerkarte enthält die folgenden Informationen, um die CPU-Zeit zu beschreiben, die für jeden Aufruf aufgewendet wurde (die Zeiten werden auch als Prozentsatz der Gesamtzeit des Threads über den ausgewählten Bereich dargestellt):
- Self: Die Zeit, die der Methoden- oder Funktionsaufruf für die Ausführung seines eigenen Codes und nicht für den seiner Aufgerufenen aufgewendet hat, wie in Abbildung 4 für Methode D dargestellt.
- Children: Die Zeit, die der Methoden- oder Funktionsaufruf für die Ausführung D.
- Total: die Summe der Self- und Children-Zeit der Methode. Dies stellt die Gesamtzeit dar, die die App für die Ausführung eines Aufrufs aufgewendet hat, wie in Abbildung 4 für Methode D dargestellt.
Abbildung 8. Ein Baum von oben nach unten.
Abbildung 9. Ein Bottom-Up-Baum für Methode C aus Abbildung 8.
Die untere Registerkarte zeigt eine Liste von Aufrufen an, in denen beim Erweitern eines Funktions- oder Methodenknotens die Aufrufer angezeigt werden. Anhand der Beispiel-Ablaufverfolgung in Abbildung 8 zeigt Abbildung 9 eine Bottom-up-Struktur für Methode C. Öffnen des Knotens für Methode Cin Der Bottom-up-Baum zeigt jeden seiner eindeutigen Aufrufer an, Methoden B und D. Hinweis: Obwohl B C zweimal aufruft, erscheint B nur einmal, wenn der Knoten erweitert wirdmethode C im Bottom-up-Baum. Danach wird beim Erweitern des Knotens für B angezeigtsein Aufrufer, Methoden A und D.
Die untere Registerkarte ist nützlich, um Methoden oder Funktionen nach denen zu sortieren, die die meiste (oder am wenigsten) CPU-Zeit verbrauchen. Sie können jeden Knoten überprüfen, um festzustellen, welche Aufrufer die meiste CPU-Zeit damit verbringen, diese Methoden oder Funktionen aufzurufen.Im Vergleich zum Top-Down-Baum beziehen sich die Timing-Informationen für jede Methode oder Funktion in einem Bottom-up-Baum auf die Methode oben in jedem Baum (oberster Knoten).Die CPU-Zeit wird auch als Prozentsatz der Gesamtzeit des Threads während dieser Aufzeichnung dargestellt. In der folgenden Tabelle wird erläutert, wie Timinginformationen für den obersten Knoten und seine Anrufer (Unterknoten) interpretiert werden.
Selbst | Kinder | Insgesamt | |
---|---|---|---|
Methode oder Funktion oben im Bottom-up-Baum (oberer Knoten) | Repräsentiert die Gesamtzeit, die die Methode oder Funktion damit verbracht hat, ihren eigenen Code auszuführen, und nicht die ihrer Angerufenen. Im Vergleich zum Top-Down-Baum stellt diese Zeitinformation eine Summe aller Aufrufe dieser Methode oder Funktion über die Dauer der Aufzeichnung dar. | Stellt die Gesamtzeit dar, die die Methode oder Funktion damit verbracht hat, ihre aufgerufenen und nicht ihren eigenen Code auszuführen. Im Vergleich zum Top-Down-Baum stellt diese Zeitinformation die Summe aller Aufrufe der aufgerufenen Methode oder Funktion über die Dauer der Aufzeichnung dar. | Die Summe der Selbstzeit und der Kinderzeit. |
Callers (sub-nodes) | Repräsentiert die gesamte Selbstzeit des Angerufenen, wenn er vom Anrufer angerufen wird. Am Beispiel des Bottom-up-Baums in Abbildung 9 entspricht die Self-Zeit für Methode B der Summe der Self-Zeiten für jede Ausführung von Methode C, wenn sie von B aufgerufen wird. | Repräsentiert die gesamte Self-Zeit der aufgerufenen Methode, wenn sie vom Aufrufer aufgerufen wird. Am Beispiel des Bottom-up-Baums in Abbildung 9 entspricht die untergeordnete Zeit für Methode B der Summe der untergeordneten Zeiten für jede Ausführung von Methode C, wenn sie von B aufgerufen wird. | Die Summe der Selbstzeit und der untergeordneten Zeit. |
Hinweis: Für eine bestimmte Aufnahme sammelt Android Studio keine neuen Daten mehr, wenn der Profiler die Dateigrößenbeschränkung erreicht (dies stoppt jedoch nicht die Aufzeichnung). Dies geschieht normalerweise viel schneller, wenn instrumentierte Ablaufverfolgungen ausgeführt werden, da diese Art der Ablaufverfolgung im Vergleich zu einer abgetasteten Ablaufverfolgung mehr Daten in kürzerer Zeit erfasst. Wenn Sie die Inspektionszeit in einen Zeitraum der Aufzeichnung verlängern, der nach Erreichen des Grenzwerts aufgetreten ist, ändern sich die Zeitdaten im Bereich Ablaufverfolgung nicht (da keine neuen Daten verfügbar sind). Darüber hinaus zeigt der Bereich Ablaufverfolgung NaN für Zeitinformationen an, wenn Sie nur den Teil einer Aufzeichnung auswählen, für den keine Daten verfügbar sind.
Inspect system traces
Wenn Sie einen System-Trace überprüfen, können Sie Trace-Ereignisse in der Threads-Timeline untersuchen, um die Details der Ereignisse anzuzeigen, die in jedem Thread auftreten.Bewegen Sie den Mauszeiger über ein Ereignis, um den Namen des Ereignisses und die in jedem Status verbrachte Zeit anzuzeigen. Klicken Sie auf ein Ereignis, um weitere Informationen im Analysefenster anzuzeigen.
Im Bereich CPU-Kerne (siehe Abbildung 10) wird die Thread-Aktivitätsplanung für jeden Kern angezeigt. Bewegen Sie den Mauszeiger über eine Thread-Aktivität, um zu sehen, auf welchem Thread dieser Core zu diesem Zeitpunkt ausgeführt wird.
Abbildung 10. Anzeigen von CPU-Aktivität und Ablaufverfolgungsereignissen für den Renderthread.
Weitere Informationen zum Überprüfen von System-Trace-Informationen finden Sie im Abschnitt UI-Leistungsprobleme untersuchenabschnitt der systrace
Dokumentation.
Frame-Rendering-Daten überprüfen
Sie können überprüfen, wie lange es dauert, bis Ihre App jeden Frame auf dem Mainthread und RenderThread
rendert, um Engpässe zu untersuchen, die UI-Jank und Lowframerates verursachen.
Um Frame-Rendering-Daten anzuzeigen, zeichnen Sie eine Ablaufverfolgung mit einer Konfiguration auf, mit der Sie Systemaufrufe verfolgen können. Suchen Sie nach der Aufzeichnung des Rennens nach Informationen zu jedem Frame unter der Frames-Timeline im Anzeigebereich, wie in Abbildung 11 gezeigt.
Abbildung 11. Jeder Frame, der länger als 16 m dauert,wird rot angezeigt.