Tracciamento della composizione

Quando si analizza per la prima volta un problema di rendimento, le tracce sono spesso la migliore fonte di informazioni. Consentono di formulare un'ipotesi sul problema e su dove iniziare a cercare.

Android supporta due livelli di tracciamento: sistema e tracciamento dei metodi.

Poiché il tracciamento del sistema tiene traccia solo di aree contrassegnate in modo specifico per il tracciamento, ha un overhead ridotto e non influisce molto sulle prestazioni dell'app. Il tracciamento del sistema è ottimo per vedere quanto tempo è necessario per l'esecuzione di sezioni specifiche del tuo codice.

Il tracciamento del metodo tiene traccia di ogni chiamata di funzione nell'app. Si tratta di una chiamata molto costosa e influisce notevolmente sulle prestazioni dell'app, ma ti offre un quadro totale di ciò che sta accadendo, delle funzioni chiamate e della frequenza con cui vengono chiamate.

Per impostazione predefinita, le tracce del sistema non includono singole funzioni componibili. Sono disponibili nelle tracce del metodo.

Al momento stiamo testando una nuova funzionalità di tracciamento del sistema per mostrare le funzioni componibili all'interno delle tracce del sistema. Questo riduce l'invasività del tracciamento del sistema, con il tracciamento dei livelli di dettaglio nella composizione.

Configura il tracciamento della composizione

Per provare il tracciamento della ricomposizione nel tuo progetto, devi eseguire l'aggiornamento ad almeno le seguenti versioni:

  • Android Studio Flamingo
  • UI di composizione: 1.3.0
  • Compose Compiler: 1.3.0

Il dispositivo o l'emulatore su cui esegui la traccia deve avere almeno il livello API 30.

Inoltre, devi aggiungere una nuova dipendenza su Compose Runtime Tracciamento:

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

Con questa dipendenza, quando esegui una traccia di sistema che include la ricomposizione, puoi visualizzare automaticamente le funzioni componibili.

Esegui un controllo del sistema

Per eseguire una traccia del sistema e vedere come funziona il nuovo tracciamento di ricomposizione, procedi nel seguente modo:

  1. Apri Profiler:

    Android Studio - Avvia la profilazione
    Figura 2. Android Studio - Avvia la profilazione
  2. Fai clic su Sequenza temporale CPU.

    Android Studio Profiler - Sequenza temporale della CPU
    Figura 3. Android Studio Profiler: sequenza temporale della CPU
  3. Passa all'app nell'interfaccia utente che vuoi tracciare, quindi seleziona Tracciamento del sistema e Registra

    Opzioni di Trace - Traccia del sistema
    Figura 4. Opzioni di Trace - Traccia del sistema
  4. Utilizza l'app per causare la ricomposizione e interrompere la registrazione. Una volta che la traccia è stata elaborata e visualizzata, dovresti essere in grado di visualizzare i componibili nella traccia di ricomposizione. Puoi utilizzare la tastiera e il mouse per eseguire lo zoom e la panoramica della traccia. Se non hai dimestichezza con l'esplorazione di una traccia, consulta la documentazione Registra tracce.

    Tracciamento del sistema
    Figura 5. Traccia del sistema

    Se fai doppio clic su un componibile nel grafico, accedi al relativo codice sorgente.

  5. Puoi anche vedere i componibili nel diagramma a fiamma insieme al file e al numero di riga:

    Grafico a fiamme
    Figura 6. Grafico a fiamme

Precisazioni

Overhead per dimensioni APK

Sebbene il nostro obiettivo sia ridurre al minimo l'overhead della funzionalità il più possibile, abbiamo riscontrato un aumento delle dimensioni degli APK per le app Compose, provenienti dal tracciamento di stringhe incorporate nell'APK dal compilatore di Compose. L'aumento delle dimensioni può essere relativamente ridotto se l'app non utilizza Compose o un valore superiore per le app Compose complete. Queste stringhe di tracciamento non sono offuscate e possono essere visualizzate negli strumenti di tracciamento, come mostrato in precedenza. Il compilatore Compose li inserisce in tutte le app, a partire dalla versione 1.3.0.

Le stringhe di tracciamento possono essere rimosse nella build di produzione aggiungendo la seguente regola di ProGuard:

-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();

}

Queste funzioni potrebbero cambiare in futuro, ma eventuali modifiche verranno menzionate nelle note di rilascio di Compose.

Tienile presenti, anche se ti vengono addebitati dei costi legati alle dimensioni degli APK, che garantiscono che l'APK profilato sia lo stesso eseguito dagli utenti dell'app.

Tempestività precisa

Per una profilazione precisa, come per qualsiasi test delle prestazioni, devi rendere le app profileable e non-debuggable come Applicazioni profilabili.

Acquisisci una traccia dal terminale

È possibile acquisire una traccia di composizione dal terminale. Per farlo, devi eseguire automaticamente la procedura standard di Android Studio.

Aggiungi dipendenze

Innanzitutto, aggiungi le dipendenze aggiuntive all'app.

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

Genera un comando di record

  1. Genera un comando record usando Perfetto.
  2. Aggiungi manualmente la sezione dell'origine dati track_event, come indicato nell'esempio seguente:

    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
    

Acquisire una traccia

  1. Avvia l'app e prepara la sezione che vuoi tracciare.
  2. Attiva il tracciamento nell'app inviando una trasmissione.

    # 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. Avvia il comando di registrazione che hai creato in precedenza.

Apri la traccia

  1. adb pull <location> la traccia dal dispositivo (posizione specificata nel comando record).

  2. Apri in Perfetto.

Acquisisci una traccia con Jetpack Macrobenchmark

Puoi misurare le prestazioni con Jetpack Macrobenchmark, che fornisce tracce come risultati. Per abilitare il tracciamento della composizione con macrobenchmark, devi:

  1. Aggiungi queste dipendenze aggiuntive al modulo di test Macrobenchmark:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. Aggiungi androidx.benchmark.fullTracing.enable=true argomento di strumentazione prima di eseguire i benchmark. Consulta gli argomenti di strumentazione di Macrobenchmark per ulteriori informazioni sugli argomenti di strumentazione di Macrobenchmark.

Feedback

Ci piacerebbe ricevere il tuo feedback su questa funzionalità, eventuali bug riscontrati al suo interno ed eventuali richieste. Puoi inviarci un feedback tramite il tracker dei problemi.