Traces sind oft die beste Informationsquelle bei der ersten Untersuchung eines oder Leistungsproblem. Sie können damit eine Hypothese dazu aufstellen, was das Problem ist und wo Sie mit der Suche beginnen sollten.
Unter Android werden zwei Ebenen der Aufrufabfolge unterstützt: System- und Methodenaufrufabfolge.
Da beim System-Tracing nur Bereiche erfasst werden, die speziell für das Tracing gekennzeichnet sind, ist der Overhead gering und die Leistung Ihrer App wird nicht stark beeinträchtigt. Mithilfe von System-Tracing können Sie sehen, wie lange bestimmte Codeabschnitte ausgeführt werden.
Beim Methoden-Tracing wird jeder Funktionsaufruf in Ihrer App erfasst. Das ist sehr aufwendig und wirkt sich daher stark auf die Leistung Ihrer App aus. Sie erhalten jedoch ein vollständiges Bild davon, was passiert, welche Funktionen aufgerufen werden und wie oft sie aufgerufen werden.
Standardmäßig enthalten Systemaufzeichnungen keine einzelnen zusammensetzbaren Funktionen. Sie sind in Methodenaufzeichnungen verfügbar.
Wir testen derzeit eine neue Funktion zur Systemverfolgung, um zusammensetzbare Funktionen anzuzeigen. Funktionen in System-Traces. Das System ist so wenig aufdringlich, Tracing mit Methoden-Tracing-Detailebenen in der Zusammensetzung.
Komposition-Tracing einrichten
Um das Neuzusammensetzungs-Tracing in Ihrem Projekt auszuprobieren, müssen Sie auf unter mindestens die folgenden Versionen:
- Android Studio Flamingo
- Benutzeroberfläche zum Verfassen: Version 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 haben 30.
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")
Wenn Sie einen System-Trace erstellen, der Neuzusammensetzung enthält, werden die zusammensetzbaren Funktionen automatisch angezeigt.
System-Trace erstellen
Um ein System-Trace zu erstellen und die neu zusammengesetzten Tracing in Aktion zu sehen, folgen Sie diese Schritte:
Öffnen Sie den Profiler:
Klicken Sie auf CPU-Zeitachse.
Navigieren Sie in Ihrer App zu der UI, die Sie verfolgen möchten, und wählen Sie System Trace und Record
Verwenden Sie die App, um die Neuzusammensetzung zu veranlassen und die Aufnahme zu beenden. Sobald der Trace verarbeitet wurde und angezeigt wird, sollten Sie die Composeables im Recomposition-Trace sehen können. Du kannst mit Tastatur und Maus zoomen und schwenken um den Trace herum; Wenn Sie mit dem Navigieren in einem Trace nicht vertraut sind, sehen Sie in der Dokumentation zu Traces aufzeichnen
Wenn Sie im Diagramm auf ein Kompositionselement doppelklicken, gelangen Sie zum Quellcode.
Sie können zusammen mit der Datei und der Zeile auch zusammensetzbare Funktionen im Flame-Diagramm sehen. Nummer:
Einschränkungen
Overhead der APK-Größe
Wir haben zwar versucht, den Overhead der Funktion so weit wie möglich zu minimieren, aber die APK-Größe von Compose-Apps ist aufgrund von Trace-Strings gestiegen, die vom Compose-Compiler in das APK eingebettet wurden. Diese Größenerhöhung kann Relativ klein, wenn Ihre App nicht viel „Schreiben“ verwendet, oder größer für das vollständige Schreiben von „Schreiben“ Apps. Diese Trace-Strings sind außerdem nicht verschleiert, damit sie in Trace-Tools angezeigt werden können, wie oben gezeigt. Der Compose-Compiler fügt sie in alle ab Version 1.3.0.
Sie können die Tracing-Strings in Ihrem Produktions-Build entfernen, indem Sie den Parameter folgende Proguard-Regel:
-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. Sämtliche Änderungen sind jedoch unter in den Versionshinweisen zu „Compose“.
Wenn Sie sie beibehalten, obwohl dadurch die APK-Größe etwas zunimmt, ist sichergestellt, dass das APK, das profiliert wird, dasselbe ist, das die App-Nutzer ausführen.
Genaue Zeitangaben
Für eine genaue Profilerstellung müssen Sie wie bei allen Leistungstests
App profileable
und non-debuggable
gemäß Profilierbarer Anwendungen.
Traces über das Terminal erfassen
Es ist möglich, einen Kompositions-Trace vom Terminal zu erfassen. Dazu müssen Sie um die Schritte auszufü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")
Befehl zum Aufnehmen generieren
- Generieren Sie einen Datensatzbefehl mit in Perfetto.
Fügen Sie den Abschnitt
track_event
für die 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 nachverfolgen möchten.
Aktivieren Sie das Tracing in der App, indem Sie eine Broadcast-Nachricht senden.
# 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 zuvor erstellten Befehl zum Aufzeichnen.
Trace öffnen
adb pull <location>
die Spur vom Gerät (Speicherort, der im Befehl „record“ angegeben ist).In Perfetto öffnen
Einen Trace mit Jetpack Macrobenchmark erfassen
Sie können die Leistung mit Jetpack MacroBenchmark messen, der Traces als Ergebnisse bereitstellt. So aktivieren Sie das Zusammensetzungs-Tracing mit Makro-Benchmarks:
Fügen Sie dem Testmodul Macrobenchmark die folgenden zusätzlichen Abhängigkeiten hinzu:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
Instrumentierungsargument
androidx.benchmark.fullTracing.enable=true
hinzufügen bevor Sie Benchmarks durchführen. Weitere Informationen zu Instrumentierungsargumenten für Macrobenchmarks finden Sie unter Instrumentierungsargumente für Macrobenchmarks.
Feedback
Wir freuen uns auf Ihr Feedback zu dieser Funktion, zu Fehlern, die Sie finden, und alle Ihre Wünsche. Sie können uns über das Problem Tracker.