Wenn Sie sich zum ersten Mal mit einem Leistungsproblem befassen, sind Protokolle oft die beste Informationsquelle. 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. Mit dem 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 neue Funktionen für die Systemaufzeichnung, um zusammensetzbare Funktionen in Systemaufzeichnungen anzuzeigen. Es bietet die geringe Intrusivität des System-Tracings mit der Detailgenauigkeit des Methoden-Tracings in der Zusammensetzung.
Komposition-Tracing einrichten
Wenn Sie die Recomposition-Analyse in Ihrem Projekt ausprobieren möchten, müssen Sie mindestens auf die folgenden Versionen aktualisieren:
- Android Studio Flamingo
- Compose-Benutzeroberfläche: 1.3.0
- Compose Compiler: 1.3.0
Das Gerät oder der Emulator, auf dem Sie den Trace ausführen, muss mindestens API-Level 30 haben.
Außerdem müssen Sie eine neue Abhängigkeit von Compose Runtime Tracing hinzufügen:
implementation("androidx.compose.runtime:runtime-tracing:1.7.5")
Wenn Sie Compose BOM verwenden, müssen Sie die Version nicht angeben:
val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
Wenn Sie mit dieser Abhängigkeit einen System-Trace mit Neuzusammensetzung erstellen, werden die zusammensetzbaren Funktionen automatisch angezeigt.
System-Trace erstellen
So erstellen Sie einen System-Trace und sehen sich die neue Recomposition-Funktion in Aktion an:
Öffnen Sie den Profiler:
Klicken Sie auf CPU-Zeitachse.
Rufen Sie in Ihrer App die Benutzeroberfläche auf, die Sie erfassen möchten, und wählen Sie dann System > Trace > Record aus.
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. Mit der Tastatur und der Maus können Sie den Trace heranzoomen und schwenken. Wenn Sie nicht wissen, wie Sie sich in einem Trace bewegen, lesen Sie die Dokumentation Traces aufzeichnen.
Wenn Sie im Diagramm auf ein Kompositionselement doppelklicken, gelangen Sie zum Quellcode.
Im Flammendiagramm werden auch Composables zusammen mit der Datei- und Zeilennummer angezeigt:
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ößenzunahme kann relativ gering sein, wenn Ihre App Compose nicht viel verwendet, oder größer für Apps, die Compose vollständig nutzen. 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 ab Version 1.3.0 in alle Apps ein.
Sie können die Trace-Strings aus Ihrem Produktionsbuild 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 in den Versionshinweisen zu Compose erwähnt.
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 Zeitmessung
Für eine genaue Profilierung müssen Sie die App wie bei allen Leistungstests profileable
und non-debuggable
gemäß Profilebare Anwendungen konfigurieren.
Traces über das Terminal erfassen
Es ist möglich, einen Zusammenstellungs-Trace über das 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 Ihrer App zuerst die zusätzlichen Abhängigkeiten hinzu.
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
Befehl zum Erstellen eines Datensatzes generieren
- Erstelle einen Eintragsbefehl 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 Bereich vor, den Sie skizzieren 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 dem Jetpack-Makrobenchmark messen, der als Ergebnis Traces liefert. 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")
Fügen Sie das Instrumentierungsargument
androidx.benchmark.fullTracing.enable=true
hinzu, bevor Sie Benchmarks ausführen. Weitere Informationen zu den Instrumentierungsargumenten für Macrobenchmarks finden Sie unter Instrumentierungsargumente für Macrobenchmarks.
Feedback
Wir würden uns über Feedback zu dieser Funktion, über gefundene Fehler und über Ihre Wünsche freuen. Sie können uns Feedback über den Problem-Tracker senden.