Tracciamento della composizione

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

Su Android sono supportati due livelli di monitoraggio: monitoraggio di sistema e monitoraggio metodi.

Poiché il monitoraggio del sistema monitora solo le aree contrassegnate specificamente per il monitoraggio, ha un overhead ridotto e non influisce in modo significativo sul rendimento dell'app. Il monitoraggio del sistema è ottimo per vedere il tempo di esecuzione di determinate sezioni del codice.

Il monitoraggio dei metodi tiene traccia di ogni chiamata di funzione nella tua app. Si tratta di un'operazione molto dispendiosa, che influisce notevolmente sulle prestazioni dell'app, ma che ti offre un quadro completo di cosa sta succedendo, quali funzioni vengono chiamate e con quale frequenza.

Per impostazione predefinita, le tracce di sistema non includono le singole funzioni componibili. Sono disponibili nelle tracce dei metodi.

Al momento stiamo testando una nuova funzionalità di monitoraggio del sistema per mostrare le funzioni composable all'interno delle tracce di sistema. Offre la bassa invasività della tracciabilità del sistema, con i livelli di dettaglio della tracciabilità dei metodi nella composizione.

Configurazione per il monitoraggio della composizione

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

  • Android Studio Flamingo
  • Interfaccia utente di Compose: 1.3.0
  • Compose Compiler: 1.3.0

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

Inoltre, devi aggiungere una nuova dipendenza dal monitoraggio del runtime di Compose:

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

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

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

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

Con questa dipendenza, quando acquisisci una traccia di sistema che include la ricompozione, puoi vedere automaticamente le funzioni componibili.

Acquisisci una traccia di sistema

Per acquisire una traccia di sistema e vedere in azione il nuovo monitoraggio della ricostituzione, segui questi passaggi:

  1. Apri il profiler:

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

    Android Studio Profiler - Sequenza temporale della CPU
    Figura 3. Android Studio Profiler - Sequenza temporale della CPU
  3. Vai all'interfaccia utente che vuoi monitorare nell'app, quindi seleziona Monitoraggio sistema e Registra.

    Opzioni di traccia - Traccia di sistema
    Figura 4. Opzioni di traccia - Traccia di sistema
  4. Utilizza l'app per causare la ricompozione e interrompere la registrazione. Una volta elaborata e visualizzata la traccia, dovresti essere in grado di vedere i componenti nella traccia di ricompozione. Puoi utilizzare la tastiera e il mouse per eseguire lo zoom e la panoramica della traccia. Se non hai dimestichezza con la navigazione in una traccia, consulta la documentazione relativa alla registrazione delle tracce.

    Tracciamento del sistema
    Figura 5. Traccia di sistema

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

  5. Nel grafico a forma di fiamma puoi anche vedere i composabili, oltre al numero di file e riga:

    Grafico a fiamme
    Figura 6. Grafico a fiamme

Limitazioni

Overhead delle dimensioni dell'APK

Anche se abbiamo cercato di ridurre al minimo l'overhead della funzionalità, si è verificato un aumento delle dimensioni dell'APK per le app Compose proveniente dalle stringhe di monitoraggio incorporate nell'APK dal compilatore di Compose. Questo aumento delle dimensioni può essere relativamente ridotto se la tua app non utilizza molto Componi o maggiore per le app con Componi completo. Inoltre, queste stringhe di monitoraggio non sono offuscate, quindi possono essere visualizzate negli strumenti di monitoraggio, come mostrato in precedenza. Il compilatore Compose li inietta 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 indicate nelle note di rilascio di Scrivi.

Tieni presente che, se li mantieni, pur con un costo aggiuntivo per le dimensioni dell'APK, hai la garanzia che l'APK di cui viene eseguito il profilo sia lo stesso che viene eseguito dagli utenti dell'app.

Tempistiche precise

Per un profilo accurato, come per qualsiasi test delle prestazioni, devi impostare l'app su profileable e non-debuggable come indicato in App profilabili.

Acquisire una traccia dal terminale

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

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 registrazione

  1. Genera un comando di registrazione utilizzando 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
    

Acquisisci una traccia

  1. Avvia l'app e prepara la sezione che vuoi tracciare.
  2. Attiva il monitoraggio nell'app emettendo 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 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 il rendimento con Jetpack Macrobenchmark, che fornisce le tracce come risultati. Per attivare il monitoraggio 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 misurazione androidx.benchmark.fullTracing.enable=true prima di eseguire i benchmark. Consulta Argomenti di misurazione del benchmark per ulteriori informazioni sugli argomenti di misurazione del benchmark.

Feedback

Ci farebbe piacere ricevere il tuo feedback su questa funzionalità, eventuali bug rilevati e le tue richieste. Puoi inviarci un feedback tramite il tracker dei problemi.