Genera log di traccia strumentando la tua app

Per generare una traccia del metodo dell'esecuzione della tua app, puoi instrumentare l'app utilizzando la classe Debug. La strumentazione della tua app in questo modo ti offre un maggiore controllo su quando il dispositivo avvia e interrompe la registrazione delle informazioni di tracciamento. Inoltre, il dispositivo salva i log di traccia utilizzando i nomi specificati, in modo da poter identificare facilmente i log in un secondo momento. Puoi quindi visualizzare ogni log di traccia utilizzando lo strumento CPU Profiler di Android Studio.

Puoi anche avviare e interrompere il tracciamento nel Profiler CPU senza strumentare il codice della tua app.

Prima di iniziare a generare i log di traccia, assicurati che l'app abbia aggiunto una logica per salvare i log di traccia nella relativa directory specifica dell'app.

Strumenta la tua app

Per creare i log di traccia, chiama startMethodTracing() dove vuoi che il sistema inizi a registrare i dati di tracciamento.

Nella chiamata, puoi specificare il nome del file .trace e il sistema lo salva in una directory specifica del pacchetto destinata ai dati dell'app permanenti sul dispositivo di destinazione. Si tratta della stessa directory restituita da getExternalFilesDir() e che si trova nella directory ~/sdcard/ sulla maggior parte dei dispositivi. Questo file contiene i dati di traccia del metodo binario e una tabella di mappatura con i nomi di thread e metodi. Per interrompere il tracciamento, chiama stopMethodTracing().

Il seguente esempio avvia e interrompe la registrazione di un log di traccia con il nome sample.trace:

Kotlin

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample")

// The system begins buffering the generated trace data, until your
// application calls <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing()

Java

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample");
...
// The system begins buffering the generated trace data, until your
// application calls <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing();

Tieni presente che se l'app chiama di nuovo startMethodTracing() senza modificare il nome del log di traccia, il log esistente salvato nel dispositivo verrà sovrascritto. Per informazioni su come modificare in modo dinamico il nome di ogni log di traccia, vai alla sezione relativa al salvataggio di più log.

Se il sistema raggiunge la dimensione massima del buffer prima della chiamata a stopMethodTracing(), interrompe il tracciamento e invia una notifica alla console. I metodi che avviano e interrompono le tracce funzionano in tutto il processo dell'app. In altre parole, puoi chiamare startMethodTracing() nel metodo onCreate(Bundle) dell'attività e chiamare stopMethodTracing() con il metodo onDestroy() dell'attività.

Tieni presente che l'app viene eseguita più lentamente quando è attiva la profilazione. In altre parole, non devi utilizzare i dati di profilazione per determinare tempi assoluti (ad esempio, l'esecuzione del "metodo foo() richiede 2,5 secondi"). Le informazioni sulle tempistiche nei log di traccia sono utili solo quando le confronti con i log di traccia precedenti, perciò puoi verificare se le modifiche recenti rendono l'app più veloce o più lenta.

Quando esegui il deployment su dispositivi con Android 5.0 (livello API 21) e versioni successive, puoi utilizzare la profilazione basata su campioni per profilare con un impatto minore sulle prestazioni di runtime. Per abilitare la profilazione di esempio, chiama startMethodTracingSampling() (anziché startMethodTracing()) con un intervallo di campionamento specificato. Il sistema raccoglie periodicamente campioni finché l'app non chiama stopMethodTracing().

Salva più log

Se l'app avvia e interrompe una traccia del metodo più volte senza specificare un nuovo nome per il log di traccia, il dispositivo sovrascrive il log di traccia precedente con quello nuovo, ovvero conserva solo il log di traccia più recente. Per salvare più log di traccia sul dispositivo, rinomina il log di traccia in modo dinamico ogni volta che l'app chiama startMethodTracing(). L'esempio riportato di seguito utilizza la classe SimpleDateFormat per includere la data e l'ora correnti durante la denominazione di ogni log di traccia:

Kotlin

// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
val dateFormat: DateFormat = SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault())
val logDate: String = dateFormat.format(Date())
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing("sample-$logDate")

Java

// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
SimpleDateFormat dateFormat =
        new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault());
String logDate = dateFormat.format(new Date());
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing(
        "sample-" + logDate);

Accedere ai log di traccia sul dispositivo

Dopo che il sistema ha creato il log di traccia sul dispositivo, puoi accedere al file in uno dei seguenti modi:

  • Utilizza Esplora dispositivi. Per aprire Esplora dispositivi, fai clic su Visualizza > Finestre degli strumenti > Esplora dispositivi (oppure fai clic sul pulsante Esplora dispositivi nella barra della finestra degli strumenti). Come mostrato nella figura 1, puoi individuare i file .trace passando alla directory specifica del pacchetto dell'app.

    Figura 1. Individuazione dei log di traccia mediante Esplora dispositivi.

  • Copia il file sul computer locale utilizzando il comando adb pull. Il comando seguente copia un log di traccia denominato sample.trace dal dispositivo alla directory ~/Documents/trace-logs/ della macchina locale.

    adb pull path-on-device/sample.trace ~/Documents/trace-logs/

Potrai quindi importare il file di traccia con il Profiler CPU.