Utilizza la tracciatura per registrare eventi e contatori sul sistema e visualizzarli su una cronologia. Lo strumento di tracciatura standard in Android è Perfetto. Per saperne di più, consulta Nozioni di base sulla tracciatura.
Strumentare il codice
Per ottenere gli eventi dall'app, è necessario instrumentarla aggiungendo punti di traccia nel codice. Le sezioni non instrumentate non vengono visualizzate nelle tracce.
L'esempio di tracciamento SDV è una demo dell'integrazione del tracciamento, insieme alle istruzioni e
a un esempio di configurazione del tracciamento. Si trova in
system/software_defined_vehicle/core_services/samples/tracing/.
Ruggine
L'approccio consigliato per Rust è utilizzare il crate tracing per emettere eventi ATrace. Perfetto supporta ATrace come origine dati. Prevediamo di passare all'SDK Perfetto quando saranno disponibili i binding Rust e a seconda dell'evoluzione dei casi d'uso.
Aggiungi i valori predefiniti di tracciamento a Android.bp:
rust_binary {
...
defaults: [
...
"sdv_tracing@rust_defaults",
],
...
}
Inizializza l'abbonato. Questa operazione può essere eseguita una sola volta per processo:
fn main() {
// Initialize the subscriber, panic if it fails.
// sdv_tracing::try_init_tracing() is the version that returns a Result.
sdv_tracing::init_tracing()
...
}
Puoi omettere la chiamata di inizializzazione. In questo modo, la traccia non viene inizializzata e Perfetto non raccoglie gli eventi di strumentazione dall'app.
Aggiungi punti di tracciamento. Puoi trovare altri esempi in
system/software_defined_vehicle/core_services/samples/tracing/rust_tracing_api_demo/tracing.rs.
use tracing::{instrument, info_span};
// #[tracing::instrument] wraps the method into a tracing span and records arguments.
// Use #[instrument(skip(num))] if you don't want to record the argument.
#[instrument]
fn mul_by_100(num: i32) -> i32 {
// Create and enter a span with INFO verbosity, name, and a debug field annotation.
// The span will exit when dropped.
let _span = info_span!("This is a span", var=123).entered();
let result = num * 100;
// Emit an instant INFO event that records the result value.
// We recommend to fully qualify the crate when using events to avoid confusion with log records.
tracing::info!(result, "Completed");
result
}
C++
Il tracciamento C++ utilizza l'SDK Perfetto per monitorare gli eventi. Aggiungi i valori predefiniti
di tracciamento a Android.bp:
cc_binary {
...
defaults: [
...
"sdv_tracing@cc_defaults",
],
...
}
Definisci le categorie. Se utilizzi le categorie in più moduli, spostale
in una libreria comune. Ad esempio,
system/software_defined_vehicle/core_services/samples/tracing/cpp_service/tracing_categories.h.
Nell'intestazione:
#include "perfetto/tracing/tracing.h"
#include "perfetto/tracing/track_event.h"
PERFETTO_DEFINE_CATEGORIES(
perfetto::Category("sample")
.SetTags("tag")
.SetDescription("Sample events"));
Inserisci la macro di archiviazione statica in un file sorgente .cpp non in un metodo. Se
condividi le categorie tra i componenti, utilizza il file sorgente che
corrisponde all'intestazione con le categorie.
PERFETTO_TRACK_EVENT_STATIC_STORAGE();
int main() {
...
}
Per inizializzare Perfetto, inizializza il backend del sistema e registra gli eventi di traccia:
#include <sdv/tracing_init.h>
int main() {
...
android::sdv::InitPerfettoWithTrackEvents<perfetto::TrackEvent>();
...
}
Aggiungi l'instrumentazione. Scopri altri esempi in
system/software_defined_vehicle/core_services/samples/tracing/cpp_service/client.cpp.
int32_t mulBy100(int32_t num) {
// Start a slice that will get closed at the end of the scope.
TRACE_EVENT("client", "mulBy100", "num", num);
TRACE_EVENT("client", "This is a slice", "var", 123);
int32_t result = num * 100;
// Instant events have zero duration. They are drawn as markers on the track.
TRACE_EVENT_INSTANT("client", "Completed", "result", result);
return result;
}
Come nell'esempio di Rust, questo codice produce due slice nidificati e un indicatore per l'evento istantaneo nell'interfaccia utente. I valori degli argomenti di debug vengono visualizzati quando viene selezionato un evento.
Raccogliere una traccia
Utilizza lo script della riga di comando record\_android\_trace per registrare una traccia e
l'interfaccia utente web di Perfetto per visualizzarla.
Configurare l'acquisizione
Devi fornire una configurazione per record_android_trace in formato textproto. Per saperne di più, consulta
questo documento.
Il repository SDV contiene una configurazione di esempio
(system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx).
Questo file include diverse origini dati e può essere personalizzato o utilizzato così com'è.
Utilizzare la UI di Perfetto per generare una configurazione
Puoi configurare una configurazione personalizzata ed esplorare le opzioni disponibili andando su Registra nuova traccia nell'UI di Perfetto, modificando le impostazioni di registrazione e i probe. A questo punto puoi aprire la visualizzazione "Recording command" per visualizzare il comando generato e ottenere i contenuti della configurazione.
Configurare la visibilità della strumentazione in-app
La strumentazione Rust utilizza
ATrace. È
configurato nella sezione ftrace_config del documento. I componenti
SDV hanno il tag ATRACE_TAG_APP e possono essere abilitati
per app. La configurazione di esempio abilita tutte le app.
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
# Setting atrace_apps to "*" enable ATrace events for all apps.
# You can set it to a pattern to match specific processes by name.
# Use multiple atrace_apps entries to enable multiple processes.
atrace_apps: "*"
}
}
}
Utilizziamo gli eventi di traccia nell'SDK C++ Perfetto. Questa è un'origine dati
track_event
(doc).
Puoi attivare o disattivare categorie e tag nel campo
track_event_config. Per impostazione predefinita, tutti i tag di chiusura delle categorie sono abilitati, ad eccezione dei tag speciali slow e debug.
Se vuoi attivare solo categorie specifiche, devi disattivare tutte
le altre, ad esempio con disabled_categories: "*" come qui:
data_sources: {
config {
name: "track_event"
track_event_config {
enabled_categories: "the_best_category_in_the_world"
disabled_categories: "*"
}
}
}Registrare una traccia
Apri un terminale nella radice del repository Android. Non è necessario fare envsetup. Il
copione della registrazione è in external/perfetto/tools/record_android_trace.
Esegui lo script con la configurazione di esempio:
external/perfetto/tools/record_android_trace --config system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx
Per interrompere la registrazione in anticipo, seleziona Ctrl + C.
In questo modo, adb shell perfetto registra una traccia e la trasferisce all'host, di solito in ~/traces. Una volta raccolto il trace, lo strumento
apre una finestra del browser per visualizzarlo.
Argomenti utili:
-s SERIALper utilizzare il dispositivo con un determinato numero di serie. Ad esempio,-s 0.0.0.0:6520--no-open-browsercreerebbe un URL per pubblicare la traccia, ma non aprirebbe il browser. È utile per le sessioni remote quando è configurato il port forwarding (di solito 9001).-n, --no-opennon aprirà il browser né creerà l'URL per pubblicare la traccia dopo la sessione di tracciamento. Puoi comunque aprire i file nell'interfaccia utente di Perfetto facendo clic su "Apri file di traccia" e selezionando il file.-o <path>per impostare il percorso di output.
Dettagli di utilizzo
Questa sezione fornisce dettagli che possono essere utili quando si utilizza il sistema di tracciamento.
Instrumentazione delle tracce nei componenti SDV
Negli agenti con strumentazione di tracciamento, il tracciamento è disponibile per impostazione predefinita nelle build di cui è possibile eseguire il debug (-eng, -userdebug), se non diversamente specificato. Quando
raccogli una traccia, dovresti visualizzare gli eventi per i processi senza configurazione
aggiuntiva.
In genere, le librerie non inizializzano automaticamente la tracciabilità. In Rust, il binario
che utilizza la libreria deve inizializzare la tracciabilità per il processo utilizzando
sdv_tracing::init_tracing(). Per saperne di più, consulta Instrumentare il tuo codice.
Middleware
Libreria di pubblicazione/iscrizione: libsdv_middleware_dt
Eventi:
- Publisher: pubblicazione e registrazione di argomenti.
- Iscritti: abbonamento e sondaggi.
Abilitazione: chiama sdv_tracing::init_tracing() o
sdv_tracing::try_init_tracing() nel binario.
Libreria gRPC: libsdvmiddleware_rpc_grpc_transport
Eventi:
- Client RPC: avvio, connessione al server e chiamate di metodi RPC.
- Server RPC: avvio, registrazione con Service Discovery, aggiunta e chiamata dei metodi RPC.
Abilitazione: chiama sdv_tracing::init_tracing() o
sdv_tracing::try_init_tracing() in formato binario.
SOME/IP
- Procedura:
sdv_someip_broker_agent. \ - Eventi: elaborazione e traduzione dei messaggi, iscrizione agli eventi.
Gestore del ciclo di vita
- Procedura:
sdv_lifecycle_agent. \ - Eventi: operazioni di servizio: avvio, arresto, registrazione, annullamento della registrazione.
Modalità di alimentazione del veicolo
- Procedura:
sdv_vpm_agent. \ - Eventi: modifiche allo stato di alimentazione e abbonamenti.
Tunnel di dati
Abbiamo in programma di supportare l'integrazione del tracciamento in futuro.
Overhead delle prestazioni del tracciamento
Le misurazioni del sovraccarico sono accompagnate dal consueto avviso che le prestazioni possono variare a seconda dei sistemi e soprattutto tra l'emulatore e l'hardware reale.
Ruggine
I dati di benchmark non elaborati sono disponibili in AOSP. I dati sono stati raccolti su una VM Cuttlefish.
- Singola campata:
tracing::info_span!(),#[tracing::instrument]e simili:- Tracciamento non inizializzato: 1 ns.
- Tracciamento inizializzato e disattivato (nessuna registrazione della traccia in corso): 30 ns.
- Tracciamento attivato: 3 µs. Le annotazioni dei campi di debug possono aggiungere 1-2 µs, a seconda della complessità della conversione in stringa.
- Singolo evento:
tracing::info!()e simili:- Tracciamento non inizializzato: 1 ns.
- Tracciamento inizializzato e disattivato: 30 ns.
- Tracciamento attivato: 1,5 µs. Le annotazioni dei campi di debug possono aggiungere 0,5-1 µs,
a seconda della complessità di
stringification.
C++
I numeri relativi alle prestazioni provengono dalla sezione Prestazioni del documento Traccia eventi in Perfetto. I tempi per Pixel 3 nella tabella sono coerenti con le nostre osservazioni sulla VM Cuttlefish.
Singola fetta: TRACE_EVENT() e simili. Tracciamento:
- Disabilitato: 2 secondi.
- Attivato: 300 ns. L'utilizzo delle annotazioni dei campi di debug può aggiungere 50-100 ns.