Traces sind oft die beste Informationsquelle bei der ersten Untersuchung eines Leistungsproblems. Sie ermöglichen es Ihnen, eine Hypothese zu dem Problem aufzustellen und zu überlegen, wo Sie anfangen sollen.
Unter Android werden zwei Tracing-Ebenen unterstützt: System-Tracing und Methoden-Tracing.
Da bei der Systemverfolgung nur Bereiche nachverfolgt werden, die speziell für das Tracing markiert sind, ist der Aufwand gering und die Leistung Ihrer Anwendung wird nicht wesentlich beeinträchtigt. Die Systemverfolgung eignet sich hervorragend, um zu sehen, wie lange die Ausführung bestimmter Abschnitte Ihres Codes dauert.
Mit dem Methoden-Tracing wird jeder Funktionsaufruf in Ihrer App nachverfolgt. Dies ist sehr teuer und wirkt sich daher stark auf die Leistung Ihrer App aus. Sie erhalten jedoch einen Gesamteindruck davon, was passiert, welche Funktionen aufgerufen werden und wie oft sie aufgerufen werden.
Standardmäßig enthalten System-Traces keine einzelnen zusammensetzbaren Funktionen. Sie sind in Methoden-Traces verfügbar.
Wir testen derzeit eine neue Funktion für das System-Tracing, um zusammensetzbare Funktionen in System-Traces darzustellen. Sie bietet die geringe Aufdringlichkeit der Systemverfolgung mit Detailebenen für die Methodenverfolgung in der Zusammensetzung.
Für Zusammensetzungs-Tracing einrichten
Wenn Sie das Tracing der Neuzusammensetzung in Ihrem Projekt ausprobieren möchten, müssen Sie mindestens auf die folgenden Versionen aktualisieren:
- Android Studio Flamingo
- Benutzeroberfläche zum Schreiben: 1.3.0
- Compose-Compiler: 1.3.0
Das Gerät oder der Emulator, auf dem Sie den Trace ausführen, muss außerdem mindestens das API-Level 30 haben.
Außerdem müssen Sie eine neue Abhängigkeit für Compose Runtime Tracing hinzufügen:
implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")
Aufgrund dieser Abhängigkeit können Sie die zusammensetzbaren Funktionen automatisch sehen, wenn Sie einen System-Trace erstellen, der eine Neuzusammensetzung enthält.
System-Trace erstellen
Um ein System-Trace zu erstellen und das neue Tracing der Neuzusammensetzung in Aktion zu sehen, gehen Sie so vor:
Öffnen Sie den Profiler:
Klicken Sie auf CPU-Zeitachse.
Rufen Sie in Ihrer App die UI auf, die Sie verfolgen möchten, und wählen Sie Systemtrace und Record aus.
Verwende die App, um eine Neuzusammensetzung vorzunehmen und die Aufnahme zu beenden. Sobald der Trace verarbeitet wurde und angezeigt wird, sollten Sie die zusammensetzbaren Funktionen im Trace für die Neuzusammensetzung sehen. Sie können den Trace mit Tastatur und Maus zoomen und schwenken. Informationen zum Navigieren in einem Trace finden Sie in der Dokumentation Traces aufzeichnen.
Wenn Sie im Diagramm auf eine zusammensetzbare Funktion doppelklicken, gelangen Sie zum zugehörigen Quellcode.
Sie können zusammen mit der Datei- und Zeilennummer auch zusammensetzbare Funktionen im Flame-Diagramm sehen:
Einschränkungen
APK-Größen-Overhead
Wir wollten den Aufwand für die Funktion so weit wie möglich minimieren. Es gibt jedoch eine APK-Größenerhöhung für Compose-Apps, die durch das Tracing von Strings entsteht, die vom Compose-Compiler in das APK eingebettet sind. Diese Größe kann relativ gering sein, wenn Ihre Anwendung Compose nur wenig verwendet, oder größer für vollständige Compose-Anwendungen. Diese Tracingstrings sind zusätzlich nicht verschleiert, sodass sie in Tracingtools angezeigt werden können, wie zuvor gezeigt. Der Compose-Compiler fügt sie in alle Anwendungen ab Version 1.3.0 ein.
Sie können die Tracing-Strings in Ihrem Produktions-Build entfernen, indem Sie die folgende Proguard-Regel hinzufügen:
-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
boolean isTraceInProgress();
void traceEventStart(int,int,int,java.lang.String);
void traceEventStart(int,java.lang.String);
void traceEventEnd();
}
Diese Funktionen können sich in Zukunft ändern. Alle Änderungen werden jedoch in den Versionshinweisen zu „Compose“ erwähnt.
Wenn Sie sie beibehalten und gleichzeitig Kosten für die APK-Größe verursachen, wird garantiert, dass das APK, für das ein Profil erstellt wird, dem APK entspricht, das die App-Nutzer ausführen.
Genaues Timing
Für eine genaue Profilerstellung müssen Sie wie bei allen Leistungstests die Anwendung profileable
und non-debuggable
gemäß den profilierbaren Anwendungen festlegen.
Trace vom Terminal erfassen
Es ist möglich, einen Kompositions-Trace vom Terminal zu erfassen. Dazu musst du die Schritte ausführen, die Android Studio normalerweise automatisch für dich ausführt.
Abhängigkeiten hinzufügen
Fügen Sie zuerst die zusätzlichen Abhängigkeiten zu Ihrer Anwendung hinzu.
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
Befehl zum Aufnehmen generieren
- Generieren Sie einen Datensatzbefehl mit in Perfetto.
Fügen Sie den Datenquellenbereich
track_event
manuell hinzu, wie im folgenden Beispiel gezeigt:adb shell perfetto \ -c - --txt \ -o /data/misc/perfetto-traces/trace \ <<EOF buffers: { size_kb: 63488 fill_policy: RING_BUFFER } buffers: { size_kb: 2048 fill_policy: RING_BUFFER } data_sources: { config { name: "track_event" } } duration_ms: 10000 flush_period_ms: 30000 incremental_state_config { clear_period_ms: 5000 } EOF
Trace erfassen
- Starten Sie die App und bereiten Sie den Abschnitt vor, den Sie nachverfolgen möchten.
Aktivieren Sie das Tracing in der App, indem Sie einen Broadcast ausgeben.
# set app package variable, e.g. com.google.samples.apps.nowinandroid.debug # can be found through `adb shell ps -ef` or `adb shell cmd package list packages` package=<your app process> # issue a broadcast to enable tracing adb shell am broadcast \ -a androidx.tracing.perfetto.action.ENABLE_TRACING \ $package/androidx.tracing.perfetto.TracingReceiver
Starten Sie den Aufzeichnungsbefehl, den Sie zuvor erstellt haben.
Trace öffnen
adb pull <location>
ist der Trace vom Gerät (im Aufzeichnungsbefehl angegebener Standort).Öffnen Sie Perfetto.
Trace mit Jetpack MacroBenchmark erfassen
Sie können die Leistung mit Jetpack MacroBenchmark messen, die Traces als Ergebnisse bereitstellt. So aktivieren Sie das Tracing von Zusammensetzungen mit Makro-Benchmarks:
Fügen Sie dem MacroBenchmark-Testmodul diese zusätzlichen Abhängigkeiten hinzu:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
Fügen Sie das Instrumentierungsargument
androidx.benchmark.fullTracing.enable=true
hinzu, bevor Sie Benchmarks ausführen. Weitere Informationen zu MacroBenchmark-Instrumentierungsargumenten finden Sie unter MacroBenchmark-Instrumentierungsargumente
Feedback
Wir freuen uns über Feedback zu dieser Funktion, zu Fehlern, die Sie finden, sowie über Ihre Anfragen. Über die Problemverfolgung können Sie uns Feedback geben.