Nachzeichnen von Zusammensetzungen

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:

  1. Öffnen Sie den Profiler:

    Android Studio – Profiling 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. Navigieren Sie in Ihrer App zu der UI, die Sie verfolgen möchten, und wählen Sie System Trace und Record

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

    System Tracing
    Abbildung 5. System-Trace

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

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

    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öß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

  1. Generieren Sie einen Datensatzbefehl mit 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 Abschnitt vor, den Sie nachverfolgen 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 Jetpack MacroBenchmark messen, der Traces als Ergebnisse bereitstellt. 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. 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.