Nachzeichnen von Zusammensetzungen

Traces sind oft die beste Informationsquelle, wenn Sie sich zum ersten Mal mit einem Leistungsproblem befassen. Sie können damit eine Hypothese darüber aufstellen, was das Problem ist und wo Sie mit der Suche beginnen sollten.

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 markiert sind, ist der Aufwand gering und die Leistung Ihrer App wird nicht wesentlich beeinträchtigt. Mit dem System-Tracing können Sie 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 beeinträchtigt die Leistung Ihrer App erheblich. Sie erhalten jedoch ein Gesamtbild 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.

Mit dem Kompositions-Tracing werden zusammensetzbare Funktionen in System-Traces angezeigt. Die Funktion bietet die geringe Aufdringlichkeit des System-Tracing, wobei die Detailebenen des Methoden-Tracing in der Zusammensetzung enthalten sind.

Kompositions-Tracing einrichten

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

  • 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.12.1")

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

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

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

Wenn Sie mit dieser Abhängigkeit einen System-Trace erstellen, der eine Neuzusammensetzung enthält, werden die zusammensetzbaren Funktionen automatisch angezeigt.

System-Tracing durchführen

So erstellen Sie einen System-Trace und sehen sich das neue Rekompositions-Tracing an:

  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 Benutzeroberfläche auf, die Sie verfolgen möchten, und wählen Sie dann System-Trace und Aufzeichnen aus.

    Trace-Optionen – System-Trace
    Abbildung 4: Trace-Optionen – System-Trace
  4. Verwenden Sie Ihre App, um eine Neuzusammensetzung auszulösen, und beenden Sie die Aufzeichnung. Sobald der Trace verarbeitet wurde und angezeigt wird, sollten Sie die Composables im Rekompositions-Trace sehen können. Sie können mit der Tastatur und der Maus im Trace zoomen und schwenken. Wenn Sie mit der Navigation in einem Trace nicht vertraut sind, lesen Sie die Dokumentation zu Traces aufzeichnen.

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

    Wenn Sie im Diagramm auf ein Composable doppelklicken, gelangen Sie zum zugehörigen Quellcode.

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

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

Vorsichtsmaßnahmen

Beachten Sie bei der Verwendung von Composition Tracing die folgenden Einschränkungen hinsichtlich APK-Größe und Leistung.

APK-Größen-Overhead

Wir haben versucht, den Overhead der Funktion so weit wie möglich zu minimieren. Dennoch erhöht sich die APK-Größe für Compose-Apps aufgrund von Tracing-Strings, die vom Compose-Compiler in das APK eingebettet werden. Diese Größenzunahme kann relativ gering sein, wenn Ihre App nicht viel Compose verwendet, oder größer, wenn es sich um eine vollständige Compose-App handelt. Diese Tracing-Strings sind außerdem nicht verschleiert, sodass sie wie oben gezeigt in Tracing-Tools angezeigt werden können. 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, erhöht sich zwar die APK-Größe, aber Sie können sicher sein, dass das APK, für das ein Profil erstellt wird, mit dem APK übereinstimmt, das die App-Nutzer ausführen.

Genaues Timing

Für ein genaues Profiling müssen Sie die App wie bei jedem Leistungstest gemäß Profilierbare Anwendungen profileable und non-debuggable machen.

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 erledigt.

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")

Befehl zum Aufzeichnen generieren

  1. Generieren Sie einen Aufzeichnungsbefehl in Perfetto.
  2. Fügen Sie den Datenquellenabschnitt 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

  1. Öffnen Sie die App und bereiten Sie den Bereich vor, den Sie verfolgen möchten.
  2. Tracing in der App durch Senden eines Broadcasts aktivieren.

    # 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 (Speicherort im Befehl „record“ angegeben).

  2. Öffnen Sie die Datei in Perfetto.

Trace mit Jetpack Macrobenchmark erfassen

Die Leistung lässt sich mit Jetpack Macrobenchmark messen. Als Ergebnis werden Traces ausgegeben. So aktivieren Sie das Kompositions-Tracing mit Makro-Benchmarks:

  1. Fügen Sie dem Macrobenchmark-Testmodul die folgenden 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 den Instrumentierungsargumenten für Macrobenchmark finden Sie unter Instrumentierungsargumente für Macrobenchmark.

Feedback

Wir freuen uns über Ihr Feedback zu dieser Funktion, über Fehler, die Sie finden, und über Ihre Anfragen. Sie können uns Feedback über den Issue Tracker senden.