Traces sind oft die beste Informationsquelle, wenn zum ersten Mal ein Leistungsproblem untersucht wird. Sie ermöglichen es Ihnen, eine Hypothese darüber aufzustellen, worin das Problem besteht und wo Sie mit der Suche beginnen können.
Unter Android werden zwei Tracing-Ebenen unterstützt: System-Tracing und Methoden-Tracing.
Da beim System-Tracing nur Bereiche erfasst werden, die speziell für das Tracing gekennzeichnet wurden, entsteht ein geringer Aufwand und die Leistung der Anwendung wird kaum beeinträchtigt. Mit dem System-Tracing lässt sich gut erkennen, wie lange bestimmte Abschnitte Ihres Codes zum Ausführen benötigen.
Mit Methoden-Tracing wird jeder Funktionsaufruf in Ihrer App verfolgt. Dies ist sehr teuer und wirkt sich stark auf die Leistung Ihrer App aus. Sie erhalten damit jedoch ein Gesamtbild dessen, 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 neue Funktionen für das System-Tracing, um zusammensetzbare Funktionen in System-Traces zu zeigen. Dadurch ist das System Tracing wenig aufdringlich und es gibt Details zum Tracing von Methoden bei der Zusammensetzung.
Für Kompositions-Tracing einrichten
Wenn Sie das Tracing der Neuzusammensetzung in Ihrem Projekt testen möchten, müssen Sie mindestens auf die folgenden Versionen aktualisieren:
- Android Studio Flamingo
- Erstellungsoberfläche: 1.3.0
- Compose Compiler: 1.3.0
Das Gerät oder der Emulator, auf dem Sie den Trace ausführen, muss ebenfalls mindestens API-Level 30 haben.
Darüber hinaus müssen Sie eine neue Abhängigkeit von Compose Runtime Tracing hinzufügen:
implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")
Bei dieser Abhängigkeit können Sie die zusammensetzbaren Funktionen automatisch sehen, wenn Sie einen System-Trace verwenden, der Neuzusammensetzung enthält.
System-Trace durchführen
Gehen Sie so vor, um ein System-Trace auszuführen und das neue Tracing der Neuzusammensetzung in Aktion zu sehen:
Öffnen Sie den Profiler:
Klicken Sie auf CPU-Zeitachse.
Gehen Sie in Ihrer App zu der UI, die Sie verfolgen möchten, und wählen Sie dann System Trace und Record aus.
Verwenden Sie Ihre App, um eine Neuzusammensetzung zu veranlassen und die Aufzeichnung zu beenden. Sobald der Trace verarbeitet wurde und angezeigt wird, sollten Sie die zusammensetzbaren Funktionen im Trace für die Neuzusammensetzung sehen können. Sie können mit Tastatur und Maus im Trace zoomen und schwenken. Wenn Sie mit dem Navigieren in einem Trace nicht vertraut sind, lesen Sie die Dokumentation Traces aufzeichnen.
Wenn Sie im Diagramm auf eine zusammensetzbare Funktion doppelklicken, wird der zugehörige Quellcode angezeigt.
Sie können im Flame-Diagramm auch zusammensetzbare Funktionen zusammen mit der Datei- und Zeilennummer sehen:
Einschränkungen
APK-Größe-Overhead
Wir haben uns zwar bemüht, den Aufwand der Funktion so weit wie möglich zu minimieren, aber es gibt eine Erhöhung der APK-Größe für Compose-Apps, die aus Tracing-Strings stammen, die vom Compose-Compiler in das APK eingebettet wurden. Diese Erhöhung kann relativ klein ausfallen, wenn Ihre Anwendung nicht viel von der Funktion "Compose" verwendet, oder einen größeren Wert für "vollständige"-Anwendungen. Diese Tracing-Strings sind zusätzlich nicht verschleiert, sodass sie in Tracing-Tools erscheinen können, wie oben gezeigt. Der Compiler Compose fügt sie ab Version 1.3.0 in alle Anwendungen 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, aber die Änderungen werden in den Versionshinweisen zu „Compose“ aufgeführt.
Wenn Sie sie beibehalten, obwohl Kosten für die APK-Größe anfallen, ist sichergestellt, dass das APK, für das ein Profil erstellt wird, dasselbe ist, das die Nutzer der App ausführen.
Genaues Timing
Für eine genaue Profilerstellung, wie bei jedem Leistungstest, müssen Sie die Anwendung wie bei Profilfähigen Anwendungen als profileable
und non-debuggable
festlegen.
Trace vom Terminal erfassen
Es ist möglich, ein Kompositions-Trace vom Terminal zu erfassen. Dazu müssen Sie die Schritte ausführen, die Android Studio normalerweise automatisch für Sie 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")
Eintragsbefehl generieren
- Erstellen Sie einen Eintragsbefehl in Perfetto.
Fügen Sie den Bereich „
track_event
“ der Datenquelle wie im folgenden Beispiel manuell hinzu: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 verfolgen möchten.
Aktiviere das Tracing in der App durch Senden eines Broadcasts.
# 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
Der Trace vom Gerät (im Befehl „record“ angegeben) mit
adb pull <location>
.In Perfetto öffnen.
Trace mit Jetpack MacroBenchmark erfassen
Sie können die Leistung mit Jetpack MacroBenchmark messen, das Traces als Ergebnisse bereitstellt. So aktivieren Sie das Kompositions-Tracing 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 vor dem Ausführen von Benchmarks das Instrumentierungsargument
androidx.benchmark.fullTracing.enable=true
hinzu. Weitere Informationen zu MacroBenchmark-Instrumentierungsargumenten finden Sie unter MacroBenchmark-Instrumentierungsargumente.
Feedback
Wir freuen uns auf Ihr Feedback zu dieser Funktion, mögliche Fehler und Ihre Wünsche. Sie können uns über die Problemverfolgung Feedback geben.