Nachzeichnen von Zusammensetzungen

Traces sind oft die beste Informationsquelle, wenn Sie sich zum ersten Mal mit einem Leistungsproblem befassen. Sie ermöglichen es Ihnen, eine Hypothese zu formulieren, was das Problem ist und wo Sie mit der Suche beginnen sollten.

Unter Android werden zwei Arten von Tracing unterstützt: System-Tracing und Methoden-Tracing.

Da beim System-Tracing nur Bereiche erfasst werden, die speziell für das Tracing markiert sind, ist der Aufwand gering und die Leistung Ihrer App wird nicht wesentlich beeinträchtigt. Das System-Tracing eignet sich hervorragend, um zu sehen, wie lange die Ausführung bestimmter Abschnitte Ihres Codes dauert.

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 System-Traces keine einzelnen zusammensetzbaren Funktionen. Sie sind in Methoden-Traces verfügbar.

Beim Kompositions-Tracing werden zusammensetzbare Funktionen in System-Traces angezeigt. Die Funktion bietet die geringe Intrusivität des System-Tracing mit der Detailgenauigkeit des Methoden-Tracing bei der Komposition.

Kompositions-Tracing einrichten

Wenn Sie das Recomposition-Tracing in Ihrem Projekt ausprobieren möchten, müssen Sie mindestens auf die folgenden Versionen aktualisieren:

  • Android Studio Flamingo
  • Compose UI: 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 für Compose Runtime Tracing hinzufügen:

implementation("androidx.compose.runtime:runtime-tracing:1.11.1")

Wenn Sie die Compose BOM verwenden, müssen Sie die Version nicht angeben:

val composeBom = platform("androidx.compose:compose-bom:2026.05.00")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

Mit dieser Abhängigkeit können Sie die zusammensetzbaren Funktionen automatisch sehen, wenn Sie einen System-Trace erstellen, der Recomposition enthält.

System-Trace erstellen

So erstellen Sie einen System-Trace und sehen das neue Recomposition-Tracing in Aktion:

  1. Öffnen Sie den Profiler:

    Android Studio – Profilerstellung starten
    Abbildung 2. Android Studio – Profilerstellung starten
  2. Klicken Sie auf CPU-Zeitachse.

    Android Studio Profiler – CPU-Zeitachse
    Abbildung 3. Android Studio Profiler – CPU-Zeitachse
  3. Rufen Sie in Ihrer App die UI auf, die Sie verfolgen möchten, und wählen Sie dann System-Trace und Aufzeichnen aus.

    Trace-Optionen – System Tracing
    Abbildung 4. Trace-Optionen – System-Trace
  4. Verwenden Sie Ihre App, um Recomposition zu verursachen, und beenden Sie die Aufzeichnung. Sobald der Trace verarbeitet wurde und angezeigt wird, sollten Sie die zusammensetzbaren Funktionen im Recomposition-Trace sehen können. Sie können mit der Tastatur und der Maus in den Trace hinein- und herauszoomen und ihn verschieben . Wenn Sie mit der Navigation in einem Trace nicht vertraut sind, lesen Sie die Dokumentation zu Traces aufzeichnen.

    Ein Beispiel für eine System-Trace-Visualisierung in Android Studio.
    Abbildung 5. System-Trace

    Wenn Sie im Diagramm auf eine zusammensetzbare Funktion doppelklicken, gelangen Sie zu ihrem Quellcode.

  5. Sie können zusammensetzbare Funktionen auch im Flame-Diagramm zusammen mit der Datei- und Zeilennummer sehen:

    Beispiel für ein Flame-Diagramm mit zusammensetzbaren Funktionen.
    Abbildung 6. Flame-Diagramm

Vorsichtsmaßnahmen

Beachten Sie bei der Verwendung des Kompositions-Tracing die folgenden Vorsichtsmaßnahmen in Bezug auf APK-Größe und Leistung.

Zusätzlicher Aufwand für die APK-Größe

Wir haben versucht, den Aufwand der Funktion so gering wie möglich zu halten. Es gibt jedoch eine Zunahme der APK-Größe für Compose-Apps, die auf Tracing-Strings zurückzuführen ist, die vom Compose-Compiler in die APK eingebettet werden. Diese Zunahme kann relativ gering sein, wenn Ihre App nicht viel Compose verwendet, oder größer für vollständige Compose-Apps. Diese Tracing-Strings sind außerdem nicht verschleiert, sodass sie in Tracing-Tools angezeigt werden können, wie bereits gezeigt. Der Compose-Compiler fügt sie ab Version 1.3.0 in alle Apps ein.

Die Tracing-Strings können in Ihrem Produktions-Build entfernt werden, 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 die Funktionen beibehalten, entstehen zwar einige Kosten für die APK-Größe, aber so ist sichergestellt, dass die APK, die profiliert wird, mit der APK identisch ist, die von den App-Nutzern ausgeführt wird.

Genaue Zeitangaben

Für eine genaue Profilerstellung müssen Sie wie bei jedem Leistungstest die App profileable und non-debuggable gemäß Profilierbare Anwendungen festlegen.

Trace über das Terminal erfassen

Es ist möglich, einen Kompositions-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 zuerst die zusätzlichen Abhängigkeiten zu Ihrer App hinzu.

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

Aufzeichnungsbefehl generieren

  1. Generieren Sie mit in Perfetto einen Aufzeichnungsbefehl.
  2. Fügen Sie den Datenquellenabschnitt track_event manuell gemäß dem folgenden Beispiel 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

  1. Starten Sie die App und bereiten Sie den Abschnitt vor, den Sie verfolgen möchten.
  2. 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
    
  3. Starten Sie den zuvor erstellten Aufzeichnungsbefehl.

Trace öffnen

  1. adb pull <location> den Trace vom Gerät ab (der Speicherort wird im Aufzeichnungsbefehl angegeben).

  2. Öffnen Sie ihn in Perfetto.

Trace mit Jetpack Macrobenchmark erfassen

Sie können die Leistung mit Jetpack Macrobenchmark, das Traces als Ergebnisse liefert. So aktivieren Sie das Kompositions-Tracing mit Macrobenchmarks:

  1. Fügen Sie dem Testmodul Macrobenchmark diese zusätzlichen Abhängigkeiten hinzu:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. 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 Ihr Feedback zu dieser Funktion, alle Fehler, die Sie finden, und alle Anfragen, die Sie haben. Sie können uns Feedback über die Problemverfolgung senden.