Nachzeichnen von Zusammensetzungen

Wenn Sie sich zum ersten Mal mit einem Leistungsproblem befassen, sind Protokolle oft die beste Informationsquelle. Sie ermöglichen es Ihnen, eine Hypothese zu dem Problem aufzustellen und zu überlegen, wo Sie anfangen sollen.

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 des System-Tracings 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.

Für Zusammensetzungs-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
  • 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 von Compose Runtime Tracing hinzufügen:

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

Wenn Sie mit dieser Abhängigkeit einen System-Trace mit Neuzusammensetzung erstellen, 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. Verwende die App, um eine neue Komposition 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:

    Flame-Diagramm
    Abbildung 6: Flame-Diagramm

Einschränkungen

APK-Größen-Overhead

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 Tracingstrings sind zusätzlich nicht verschleiert, sodass sie in Tracingtools angezeigt werden können, wie zuvor 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 Zeitangaben

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 musst du die Schritte ausführen, die Android Studio normalerweise automatisch für dich ausführt.

Abhängigkeiten hinzufügen

Fügen Sie Ihrer App zuerst die zusätzlichen Abhängigkeiten 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 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 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

Trace mit Jetpack MacroBenchmark erfassen

Sie können die Leistung mit dem Jetpack Macrobenchmark 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 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.