Usa el registro para grabar eventos y contadores en el sistema, y visualiza cada uno en un cronograma. La herramienta de registro estándar en Android es Perfetto. Para obtener más información, consulta Introducción al registro.
Instrumenta tu código
Para obtener eventos de la app, se debe instrumentar agregando puntos de seguimiento al código. Las secciones que no se instrumentan no aparecerán en los registros.
La muestra de seguimiento de SDV es una demostración de la integración del seguimiento, junto con instrucciones y un ejemplo de la configuración del seguimiento. Se encuentra en system/software_defined_vehicle/core_services/samples/tracing/.
Rust
El enfoque recomendado para Rust es usar el crate tracing para emitir eventos ATrace. Perfetto admite ATrace como fuente de datos. Planeamos cambiar al SDK de Perfetto cuando las vinculaciones de Rust estén disponibles y según cómo evolucionen los casos de uso.
Agrega los valores predeterminados de seguimiento a Android.bp:
rust_binary {
...
defaults: [
...
"sdv_tracing@rust_defaults",
],
...
}
Inicializa el suscriptor. Esto solo se puede hacer una vez por proceso:
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()
...
}
Puedes omitir la llamada de inicialización. Si lo haces, el registro de seguimiento no se inicializará y Perfetto no recopilará eventos de instrumentación de la app.
Agrega puntos de seguimiento. Puedes encontrar más muestras en 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++
El seguimiento de C++ usa el SDK de Perfetto para hacer un seguimiento de los eventos. Agrega los valores predeterminados de seguimiento a Android.bp:
cc_binary {
...
defaults: [
...
"sdv_tracing@cc_defaults",
],
...
}
Define las categorías. Si usas las categorías en varios módulos, muévelas a una biblioteca común. Por ejemplo, system/software_defined_vehicle/core_services/samples/tracing/cpp_service/tracing_categories.h.
En el encabezado:
#include "perfetto/tracing/tracing.h"
#include "perfetto/tracing/track_event.h"
PERFETTO_DEFINE_CATEGORIES(
perfetto::Category("sample")
.SetTags("tag")
.SetDescription("Sample events"));
Coloca la macro de almacenamiento estático en un archivo fuente .cpp que no esté en un método. Si compartes las categorías entre componentes, usa el archivo fuente que corresponde al encabezado con categorías.
PERFETTO_TRACK_EVENT_STATIC_STORAGE();
int main() {
...
}
Para inicializar Perfetto, inicializa el backend del sistema y registra los eventos de seguimiento:
#include <sdv/tracing_init.h>
int main() {
...
android::sdv::InitPerfettoWithTrackEvents<perfetto::TrackEvent>();
...
}
Agrega la instrumentación. Consulta más ejemplos en 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;
}
Al igual que en el ejemplo de Rust, este código produce dos segmentos anidados y un marcador para el evento instantáneo en la IU. Los valores de los argumentos de depuración se muestran cuando se selecciona un evento.
Recopila un registro
Usa la secuencia de comandos de línea de comandos record\_android\_trace para registrar un seguimiento y la IU web de Perfetto para verlo.
Configura la captura
Debes proporcionar una configuración para record_android_trace en formato textproto. Consulta el documento de Perfetto para obtener más información.
El repositorio de SDV contiene una configuración de muestra (system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx). Este archivo incluye varias fuentes de datos y se puede personalizar o usar tal como está.
Usa la IU de Perfetto para generar una configuración
Puedes configurar una configuración personalizada y explorar las opciones disponibles en Record new trace en la IU de Perfetto, y ajustar la configuración de grabación y los sondeos. Luego, puedes abrir la vista "Comando de grabación" para ver el comando generado y obtener el contenido de la configuración desde allí.
Configura la visibilidad de la instrumentación integrada en la app
La instrumentación de Rust usa ATrace. Se configura en la sección ftrace_config del documento. Los componentes de SDV tienen la etiqueta ATRACE_TAG_APP y se pueden habilitar por app. La configuración de muestra habilita todas las apps.
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: "*"
}
}
}
Usamos eventos de seguimiento en el SDK de Perfetto en C++. Esta es una fuente de datos de track_event (doc).
Puedes habilitar o inhabilitar categorías y etiquetas en el campo track_event_config. De forma predeterminada, todas las etiquetas de cierre de categoría están habilitadas, excepto las etiquetas especiales slow y debug.
Si solo deseas habilitar categorías específicas, debes inhabilitar todas las demás, por ejemplo, con disabled_categories: "*" como se muestra aquí:
data_sources: {
config {
name: "track_event"
track_event_config {
enabled_categories: "the_best_category_in_the_world"
disabled_categories: "*"
}
}
}Cómo registrar un seguimiento
Abre una terminal en la raíz del repositorio de Android. No es necesario que realices envsetup. La secuencia de comandos de grabación se encuentra en external/perfetto/tools/record_android_trace.
Ejecuta la secuencia de comandos con la configuración de muestra:
external/perfetto/tools/record_android_trace --config system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx
Para detener la grabación antes de tiempo, selecciona Ctrl + C.
Si lo haces, se activará adb shell perfetto para registrar un seguimiento y, luego, extraerlo al host, por lo general, en ~/traces. Cuando se recopila el registro, la herramienta abre una ventana del navegador para mostrarlo.
Argumentos útiles:
-s SERIALpara usar el dispositivo con un número de serie determinado Por ejemplo,-s 0.0.0.0:6520--no-open-browsercrearía una URL para publicar el registro, pero no abriría el navegador. Es útil para las sesiones remotas cuando tienes configurada la redirección de puertos (por lo general, 9001).-n, --no-openno abrirá el navegador ni creará la URL para publicar el registro después de la sesión de registro. Aún puedes abrir archivos en la IU de Perfetto. Para ello, haz clic en "Abrir archivo de registro" y selecciona el archivo.-o <path>para establecer la ruta de salida.
Detalles de uso
En esta sección, se proporcionan detalles que pueden ser útiles cuando se usa el sistema de seguimiento.
Instrumentación de seguimiento en componentes de SDV
En los agentes con instrumentación de seguimiento, el seguimiento está disponible de forma predeterminada en las compilaciones depurables (-eng, -userdebug), a menos que se especifique lo contrario. Cuando recopiles un registro, deberías ver los eventos de los procesos sin configuración adicional.
Por lo general, las bibliotecas no inicializan el seguimiento de forma automática. En Rust, el objeto binario que usa la biblioteca debe inicializar el seguimiento para el proceso con sdv_tracing::init_tracing(). Consulta Instrumenta tu código para obtener más información.
Middleware
Biblioteca de publicación y suscripción: libsdv_middleware_dt
Eventos:
- Publicador: Publica y registra temas.
- Suscriptor: Se suscribe y realiza encuestas.
Habilitación: Llama a sdv_tracing::init_tracing() o sdv_tracing::try_init_tracing() en el binario.
Biblioteca de gRPC: libsdvmiddleware_rpc_grpc_transport
Eventos:
- Cliente de RPC: Inicio, conexión al servidor y llamadas a métodos de RPC
- Servidor de RPC: Inicio, registro con el descubrimiento de servicios, y adición y llamada de métodos de RPC
Habilitación: Llama a sdv_tracing::init_tracing() o sdv_tracing::try_init_tracing() en binario.
SOME/IP
- Proceso:
sdv_someip_broker_agent. \ - Eventos: Procesamiento y traducción de mensajes, suscripción a eventos
Administrador del ciclo de vida
- Proceso:
sdv_lifecycle_agent. \ - Eventos: Operaciones de servicio: inicio, detención, registro y cancelación del registro.
Modo de alimentación del vehículo
- Proceso:
sdv_vpm_agent. \ - Eventos: Cambios de estado de energía y suscripciones.
Túnel de datos
Planeamos admitir la integración del registro de seguimiento en el futuro.
Sobrecarga de rendimiento del registro
Las mediciones de la sobrecarga incluyen la advertencia habitual de que el rendimiento puede diferir entre los distintos sistemas y, en especial, entre el emulador y el hardware real.
Rust
Los datos sin procesar de las comparativas están disponibles en AOSP. Los datos se recopilaron en una VM de Cuttlefish.
- Tramo único:
tracing::info_span!(),#[tracing::instrument]y similares:- El seguimiento no se inicializó: 1 ns.
- El seguimiento se inicializó y se inhabilitó (no se está grabando ningún seguimiento): 30 ns.
- Seguimiento habilitado: 3 µs Las anotaciones de campos de depuración pueden agregar de 1 a 2 µs, según la complejidad de la conversión a cadena.
- Evento único:
tracing::info!()y similares:- El seguimiento no se inicializó: 1 ns.
- El registro se inicializó y se inhabilitó: 30 ns.
- Seguimiento habilitado: 1.5 µs Las anotaciones de campos de depuración pueden agregar entre 0.5 y 1 µs, según la complejidad de
stringification.
C++
Los números de rendimiento provienen de la sección Rendimiento del documento Track events en Perfetto. Los tiempos del Pixel 3 en la tabla coinciden con nuestras observaciones en la VM de Cuttlefish.
Una sola porción: TRACE_EVENT() y similares. Seguimiento:
- Inhabilitado: 2 ns
- Habilitado: 300 ns El uso de anotaciones de campos de depuración puede agregar entre 50 y 100 ns.