Nachzeichnen von Zusammensetzungen

Traces sind oft die beste Informationsquelle bei der ersten Untersuchung eines Leistungsproblems. Sie ermöglichen es Ihnen, eine Hypothese zu dem Problem aufzustellen und zu überlegen, wo Sie anfangen sollen.

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

Da bei der Systemverfolgung nur Bereiche nachverfolgt werden, die speziell für das Tracing markiert sind, ist der Aufwand gering und die Leistung Ihrer Anwendung wird nicht wesentlich beeinträchtigt. Die Systemverfolgung eignet sich hervorragend, um zu sehen, wie lange die Ausführung bestimmter Abschnitte Ihres Codes dauert.

Mit dem Methoden-Tracing wird jeder Funktionsaufruf in Ihrer App nachverfolgt. Dies ist sehr teuer und wirkt sich daher stark auf die Leistung Ihrer App aus. Sie erhalten jedoch einen Gesamteindruck 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.

Wir testen derzeit eine neue Funktion für das System-Tracing, um zusammensetzbare Funktionen in System-Traces darzustellen. Sie bietet die geringe Aufdringlichkeit der Systemverfolgung mit Detailebenen für die Methodenverfolgung in der Zusammensetzung.

Für Zusammensetzungs-Tracing einrichten

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

  • Android Studio Flamingo
  • Benutzeroberfläche zum Schreiben: 1.3.0
  • Compose-Compiler: 1.3.0

Das Gerät oder der Emulator, auf dem Sie den Trace ausführen, muss außerdem mindestens das 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.0.0-beta01")

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

System-Trace erstellen

Um ein System-Trace zu erstellen und das neue Tracing der Neuzusammensetzung in Aktion zu sehen, gehen Sie so vor:

  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 Systemtrace und Record aus.

    Trace-Optionen – System-Trace
    Abbildung 4: Trace-Optionen – System-Trace
  4. Verwende die App, um eine Neuzusammensetzung vorzunehmen und die Aufnahme zu beenden. Sobald der Trace verarbeitet wurde und angezeigt wird, sollten Sie die zusammensetzbaren Funktionen im Trace für die Neuzusammensetzung sehen. Sie können den Trace mit Tastatur und Maus zoomen und schwenken. Informationen zum Navigieren in einem Trace finden Sie in der Dokumentation Traces aufzeichnen.

    System Tracing
    Abbildung 5: System-Trace

    Wenn Sie im Diagramm auf eine zusammensetzbare Funktion doppelklicken, gelangen Sie zum zugehörigen Quellcode.

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

    Flame-Diagramm
    Abbildung 6: Flame-Diagramm

Einschränkungen

APK-Größen-Overhead

Wir wollten den Aufwand für die Funktion so weit wie möglich minimieren. Es gibt jedoch eine APK-Größenerhöhung für Compose-Apps, die durch das Tracing von Strings entsteht, die vom Compose-Compiler in das APK eingebettet sind. Diese Größe kann relativ gering sein, wenn Ihre Anwendung Compose nur wenig verwendet, oder größer für vollständige Compose-Anwendungen. Diese Tracingstrings sind zusätzlich nicht verschleiert, sodass sie in Tracingtools angezeigt werden können, wie zuvor gezeigt. Der Compose-Compiler fügt sie in alle Anwendungen ab Version 1.3.0 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. Alle Änderungen werden jedoch in den Versionshinweisen zu „Compose“ erwähnt.

Wenn Sie sie beibehalten und gleichzeitig Kosten für die APK-Größe verursachen, wird garantiert, dass das APK, für das ein Profil erstellt wird, dem APK entspricht, das die App-Nutzer ausführen.

Genaues Timing

Für eine genaue Profilerstellung müssen Sie wie bei allen Leistungstests die Anwendung profileable und non-debuggable gemäß den profilierbaren Anwendungen festlegen.

Trace vom Terminal erfassen

Es ist möglich, einen Kompositions-Trace vom Terminal zu erfassen. Dazu musst du die Schritte ausführen, die Android Studio normalerweise automatisch für dich 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 Datenquellenbereich 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. 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 einen Broadcast ausgeben.

    # 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. adb pull <location> ist der Trace vom Gerät (im Aufzeichnungsbefehl angegebener Standort).

  2. Öffnen Sie Perfetto.

Trace mit Jetpack MacroBenchmark erfassen

Sie können die Leistung mit Jetpack MacroBenchmark messen, die Traces als Ergebnisse bereitstellt. So aktivieren Sie das Tracing von Zusammensetzungen 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 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 Feedback zu dieser Funktion, zu Fehlern, die Sie finden, sowie über Ihre Anfragen. Über die Problemverfolgung können Sie uns Feedback geben.