Nachzeichnen von Zusammensetzungen

Traces sind oft die beste Informationsquelle, wenn zum ersten Mal ein Leistungsproblem untersucht wird. Sie ermöglichen es Ihnen, eine Hypothese darüber aufzustellen, worin das Problem besteht und wo Sie mit der Suche beginnen können.

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 gekennzeichnet wurden, entsteht ein geringer Aufwand und die Leistung der Anwendung wird kaum beeinträchtigt. Mit dem System-Tracing lässt sich gut erkennen, wie lange bestimmte Abschnitte Ihres Codes zum Ausführen benötigen.

Mit Methoden-Tracing wird jeder Funktionsaufruf in Ihrer App verfolgt. Dies ist sehr teuer und wirkt sich stark auf die Leistung Ihrer App aus. Sie erhalten damit jedoch ein Gesamtbild dessen, 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.

Wir testen derzeit neue Funktionen für das System-Tracing, um zusammensetzbare Funktionen in System-Traces zu zeigen. Dadurch ist das System Tracing wenig aufdringlich und es gibt Details zum Tracing von Methoden bei der Zusammensetzung.

Für Kompositions-Tracing einrichten

Wenn Sie das Tracing der Neuzusammensetzung in Ihrem Projekt testen möchten, müssen Sie mindestens auf die folgenden Versionen aktualisieren:

  • Android Studio Flamingo
  • Erstellungsoberfläche: 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 30 haben.

Darüber hinaus müssen Sie eine neue Abhängigkeit von Compose Runtime Tracing hinzufügen:

implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")

Bei dieser Abhängigkeit können Sie die zusammensetzbaren Funktionen automatisch sehen, wenn Sie einen System-Trace verwenden, der Neuzusammensetzung enthält.

System-Trace durchführen

Gehen Sie so vor, um ein System-Trace auszuführen und das neue Tracing der Neuzusammensetzung in Aktion zu sehen:

  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. Gehen Sie in Ihrer App zu der UI, die Sie verfolgen möchten, und wählen Sie dann System Trace und Record aus.

    Trace-Optionen – System-Trace
    Abbildung 4: Trace-Optionen – System-Trace
  4. Verwenden Sie Ihre App, um eine Neuzusammensetzung zu veranlassen und die Aufzeichnung zu beenden. Sobald der Trace verarbeitet wurde und angezeigt wird, sollten Sie die zusammensetzbaren Funktionen im Trace für die Neuzusammensetzung sehen können. Sie können mit Tastatur und Maus im Trace zoomen und schwenken. Wenn Sie mit dem Navigieren in einem Trace nicht vertraut sind, lesen Sie die Dokumentation Traces aufzeichnen.

    System Tracing
    Abbildung 5: System-Trace

    Wenn Sie im Diagramm auf eine zusammensetzbare Funktion doppelklicken, wird der zugehörige Quellcode angezeigt.

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

    Flammendiagramm
    Abbildung 6: Flame-Diagramm

Einschränkungen

APK-Größe-Overhead

Wir haben uns zwar bemüht, den Aufwand der Funktion so weit wie möglich zu minimieren, aber es gibt eine Erhöhung der APK-Größe für Compose-Apps, die aus Tracing-Strings stammen, die vom Compose-Compiler in das APK eingebettet wurden. Diese Erhöhung kann relativ klein ausfallen, wenn Ihre Anwendung nicht viel von der Funktion "Compose" verwendet, oder einen größeren Wert für "vollständige"-Anwendungen. Diese Tracing-Strings sind zusätzlich nicht verschleiert, sodass sie in Tracing-Tools erscheinen können, wie oben gezeigt. Der Compiler Compose fügt sie ab Version 1.3.0 in alle Anwendungen ein.

Sie können die Tracing-Strings in Ihrem Produktions-Build 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, aber die Änderungen werden in den Versionshinweisen zu „Compose“ aufgeführt.

Wenn Sie sie beibehalten, obwohl Kosten für die APK-Größe anfallen, ist sichergestellt, dass das APK, für das ein Profil erstellt wird, dasselbe ist, das die Nutzer der App ausführen.

Genaues Timing

Für eine genaue Profilerstellung, wie bei jedem Leistungstest, müssen Sie die Anwendung wie bei Profilfähigen Anwendungen als profileable und non-debuggable festlegen.

Trace vom Terminal erfassen

Es ist möglich, ein Kompositions-Trace vom 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 Anwendung hinzu.

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

Eintragsbefehl generieren

  1. Erstellen Sie einen Eintragsbefehl in Perfetto.
  2. Fügen Sie den Bereich „track_event“ der 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 verfolgen möchten.
  2. Aktiviere das Tracing in der App durch Senden eines Broadcasts.

    # 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 Aufzeichnungsbefehl, den Sie zuvor erstellt haben.

Trace öffnen

  1. Der Trace vom Gerät (im Befehl „record“ angegeben) mit adb pull <location>.

  2. In Perfetto öffnen.

Trace mit Jetpack MacroBenchmark erfassen

Sie können die Leistung mit Jetpack MacroBenchmark messen, das Traces als Ergebnisse bereitstellt. So aktivieren Sie das Kompositions-Tracing mit Makro-Benchmarks:

  1. Fügen Sie dem MacroBenchmark-Testmodul 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 vor dem Ausführen von Benchmarks das Instrumentierungsargument androidx.benchmark.fullTracing.enable=true hinzu. Weitere Informationen zu MacroBenchmark-Instrumentierungsargumenten finden Sie unter MacroBenchmark-Instrumentierungsargumente.

Feedback

Wir freuen uns auf Ihr Feedback zu dieser Funktion, mögliche Fehler und Ihre Wünsche. Sie können uns über die Problemverfolgung Feedback geben.