Tracciamento della composizione

Le tracce sono spesso la migliore fonte di informazioni quando si esamina per la prima volta un problema di prestazioni. Consentono di formulare un'ipotesi sul problema e su dove iniziare a cercare.

Su Android sono supportati due livelli di tracciamento: tracciamento del sistema e tracciamento dei metodi.

Poiché il tracciamento del sistema monitora solo le aree contrassegnate specificamente per il tracciamento, ha un overhead ridotto e non influisce in modo significativo sulle prestazioni dell'app. Il tracciamento del sistema è ottimo per vedere quanto tempo impiegano sezioni specifiche del codice per l'esecuzione.

La traccia metodo monitora ogni chiamata di funzione nella tua app. Questa operazione è molto costosa e influisce notevolmente sulle prestazioni dell'app, ma ti offre un quadro completo di ciò che sta accadendo, di quali funzioni vengono chiamate e della frequenza con cui vengono chiamate.

Per impostazione predefinita, il tracciamento del sistema non include singole funzioni componibili. Sono disponibili nelle tracce metodo.

Il tracciamento della composizione mostra le funzioni componibili all'interno dei tracciamenti del sistema. La funzionalità offre la bassa invasività del tracciamento del sistema, con livelli di dettaglio del tracciamento dei metodi nella composizione.

Configurazione del tracciamento della composizione

Per provare il tracciamento della composizione nel tuo progetto, devi eseguire l'aggiornamento almeno alle seguenti versioni:

  • Android Studio Flamingo
  • Compose UI: 1.3.0
  • Compilatore Compose: 1.3.0

Anche il dispositivo o l'emulatore su cui esegui la traccia deve avere un livello API minimo pari a 30.

Inoltre, devi aggiungere una nuova dipendenza per Compose Runtime Tracing:

implementation("androidx.compose.runtime:runtime-tracing:1.12.1")

Se utilizzi la BOM di Compose, non devi specificare la versione:

val composeBom = platform("androidx.compose:compose-bom:2026.09.00")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

Con questa dipendenza, quando esegui un tracciamento del sistema che include la ricomposizione, puoi visualizzare automaticamente le funzioni componibili.

Esegui un tracciamento del sistema

Per eseguire un tracciamento del sistema e vedere il nuovo tracciamento della composizione in azione, segui questi passaggi:

  1. Apri il profiler:

    Android Studio - Avvia profilazione
    Figura 2. Android Studio - Avvia profilazione
  2. Fai clic su Cronologia CPU.

    Profiler di Android Studio - Cronologia della CPU
    Figura 3. Profiler di Android Studio - Cronologia della CPU
  3. Vai alla UI dell'app che vuoi tracciare, quindi seleziona Tracciamento del sistema e Registra.

    Opzioni di tracciamento - Tracciamento del sistema
    Figura 4. Opzioni di traccia - Tracciamento del sistema
  4. Utilizza l'app per attivare la ricomposizione e interrompere la registrazione. Una volta che la traccia è stata elaborata e viene visualizzata, dovresti essere in grado di vedere i componibili nella traccia di composizione. Puoi utilizzare la tastiera e il mouse per aumentare lo zoom e spostarti nella traccia. Se non hai dimestichezza con la navigazione di una traccia, consulta la documentazione Registra tracce.

    Un esempio di visualizzazione del tracciamento del sistema in Android Studio.
    Figura 5. Tracciamento del sistema

    Se fai doppio clic su un composable nel grafico, viene visualizzato il relativo codice sorgente.

  5. Puoi anche visualizzare i componibili nel flame chart insieme al file e al numero di riga:

    Esempio di flame chart che mostra le funzioni componibili.
    Figura 6. Flame chart

Precisazioni

Quando utilizzi il tracciamento della composizione, tieni presente i seguenti aspetti relativi alle dimensioni e alle prestazioni dell'APK.

Overhead delle dimensioni dell'APK

Sebbene abbiamo cercato di ridurre al minimo l'overhead della funzionalità, le dimensioni dell'APK per le app Compose aumentano a causa delle stringhe di tracciamento incorporate nell'APK dal compilatore Compose. Questo aumento delle dimensioni può essere relativamente ridotto se la tua app non utilizza molto Compose o più grande per le app Compose complete. Queste stringhe di tracciamento non sono inoltre offuscate, in modo che possano 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 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.

Tieni presente che mantenere le funzioni, pur comportando un costo in termini di dimensioni dell'APK, garantisce che l'APK di cui viene eseguito il profiling sia lo stesso eseguito dagli utenti dell'app.

Tempistica precisa

Per una profilazione accurata, come per qualsiasi test delle prestazioni, devi rendere l'app profileable e non-debuggable come descritto in Applicazioni profilabili.

Acquisisci una traccia dal terminale

È possibile acquisire una traccia di composizione dal terminale. Per farlo, devi eseguire i passaggi che Android Studio normalmente esegue automaticamente per te.

Aggiungi dipendenze

Innanzitutto, aggiungi le dipendenze aggiuntive alla tua app.

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

Genera un comando di registrazione

  1. Genera un comando di registrazione utilizzando Perfetto.
  2. Aggiungi manualmente la sezione dell'origine dati track_event come 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

Acquisisci una traccia

  1. Avvia l'app e prepara la sezione che vuoi tracciare.
  2. Attiva il tracciamento nell'app trasmettendo un broadcast.

    # 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 creato in precedenza.

Apri la traccia

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

  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 i 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 l'argomento di strumentazione androidx.benchmark.fullTracing.enable=true prima di eseguire i benchmark. Per saperne di più sugli argomenti di strumentazione di Macrobenchmark, consulta Argomenti di strumentazione di Macrobenchmark.

Tracciamento della ricomposizione

Il tracciamento della ricomposizione aggiunge alla traccia le letture e le scritture dello stato che causano la ricomposizione delle funzioni componibili, oltre alle funzioni componibili del tracciamento della composizione. In questo modo puoi trovare la modifica dello stato che ha attivato una ricomposizione.

Il tracciamento della ricomposizione ha un overhead maggiore rispetto al tracciamento della composizione, quindi utilizzalo per eseguire il debug delle ricomposizioni, non per misurare le prestazioni.

Configurazione del tracciamento della ricomposizione

Aggiungi una dipendenza da Compose Runtime Tracing 1.13.0 o versioni successive al modulo dell'app:

// Compose BOM 2026.11.00+ (runtime-tracing 1.13.0+)
implementation("androidx.compose.runtime:runtime-tracing")

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

Acquisisci una traccia di ricomposizione

Utilizza lo script record_recomposition_trace.py per acquisire una traccia di ricomposizione dal terminale.

  1. Avvia l'app e prepara la sezione che vuoi tracciare.
  2. Avvia la registrazione:

    ./record_recomposition_trace.py -p <your app package>
  3. Utilizza l'app per attivare la ricomposizione, quindi premi Ctrl+C per interrompere la registrazione. Per registrare per una durata fissa, passa la durata in secondi con -t, ad esempio -t 10.

Lo script attiva il tracciamento della composizione e della ricomposizione nell'app, registra un tracciamento del sistema, quindi disattiva il tracciamento e salva tutti i tracciamenti in un unico file <package>-recompose-<timestamp>.zip nella directory corrente. Apri il file in Perfetto.

Selezionando una scrittura di stato, viene visualizzato lo stack di chiamate che ha modificato lo stato e una freccia di flusso punta alla ricomposizione che ha causato:

Una traccia di ricomposizione in Perfetto con una scrittura di stato selezionata, il relativo stack di chiamate e una freccia di flusso verso la ricomposizione che ha causato.
Figura 7. Traccia di ricomposizione in Perfetto

Esegui lo script con --help per visualizzare tutte le opzioni, ad esempio una configurazione Perfetto personalizzata o la dimensione del buffer di traccia.

Feedback

Ci piacerebbe ricevere il tuo feedback su questa funzionalità, su eventuali bug che riscontri e su eventuali richieste che hai. Puoi inviarci un feedback utilizzando Issue Tracker.