Nachzeichnen von Zusammensetzungen

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. 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 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 erstellen, der eine Neuzusammensetzung enthält, 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:

  1. Öffnen Sie den Profiler:

    Android Studio – Profiling starten
    Abbildung 2: Android Studio – Profiling 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 erfassen möchten, und wählen Sie dann System > Trace > Record aus.

    Trace-Optionen – System-Trace
    Abbildung 4: Trace-Optionen – System-Trace
  4. 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.

    System Tracing
    Abbildung 5. System-Trace

    Wenn Sie im Diagramm auf ein Kompositionselement doppelklicken, gelangen Sie zum Quellcode.

  5. Im Flammendiagramm werden auch zusammensetzbare Elemente zusammen mit der Datei- und Zeilennummer angezeigt:

    Flammendiagramm
    Abbildung 6. Flame-Diagramm

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 mit Compose-Unterstützung. 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 Profilerstellung 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 zuerst die zusätzlichen Abhängigkeiten Ihrer App hinzu.

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

Befehl zum Erstellen eines Datensatzes generieren

  1. Erstelle einen Eintragsbefehl in Perfetto.
  2. 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

  1. Starten Sie die App und bereiten Sie den Bereich vor, den Sie skizzieren 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 Befehl zum Aufzeichnen.

Trace öffnen

  1. adb pull <location> die Spur vom Gerät (Speicherort, der im Befehl „record“ angegeben ist).

  2. 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:

  1. 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")
    
  2. 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.