Systrace es una herramienta de trazado del sistema Android que recopila datos sobre el kernel de Linux, la CPU, la GPU y todos los procesos del sistema en un período corto de tiempo. A diferencia de Traceview, que se centra en los métodos dentro de la aplicación, Systrace muestra la imagen del sistema: carga de cada núcleo de CPU, funcionamiento de SurfaceFlinger, llamadas Binder y ciclos de GC. Según Google, 2024, la herramienta es indispensable para diagnosticar fotogramas perdidos, recolecciones de basura frecuentes y anomalías en el subproceso de UI.
Puntos clave
Systrace es una utilidad de línea de comandos del SDK de Android que captura y combina datos de múltiples fuentes de trazado del kernel (ftrace) y del espacio de usuario (atrace) en un único informe HTML. La herramienta apareció en Android 4.1 (Jelly Bean) como reemplazo de la antigua utilidad traceview para la creación de perfiles del sistema y durante mucho tiempo siguió siendo la herramienta estándar de diagnóstico de rendimiento en la plataforma Android.
Systrace se basa en ftrace, un mecanismo de trazado del kernel de Linux disponible en Android desde la versión 4.1. Cuando Systrace se inicia, activa las categorías de traza especificadas: sched (planificador de tareas), freq (frecuencia de CPU), idle (estados inactivos), workq (colas de trabajo), binder, gfx y otras. Los datos se recopilan en el búfer circular del kernel y, tras la detención, se fusionan en un único archivo trace.html que se puede abrir en cualquier navegador.
A partir de Android Studio 3.1, Systrace está integrado en el CPU Profiler. En el modo Trace System Calls
, el generador de perfiles ejecuta Systrace en el dispositivo conectado y muestra los resultados directamente en la ventana de Android Studio. Esto elimina la necesidad de trabajar con la línea de comandos para casos básicos, manteniendo al mismo tiempo toda la funcionalidad: todas las categorías de traza, filtrado y línea de tiempo interactiva. El rendimiento del dispositivo durante el trazado disminuye de manera insignificante, ya que ftrace está diseñado para una sobrecarga mínima.
Systrace utiliza dos mecanismos de recopilación de datos: ftrace a nivel de kernel para eventos del sistema y atrace en el espacio de usuario para etiquetas específicas de Android. ftrace registra los cambios de contexto (sched_switch), los cambios de frecuencia de la CPU (cpu_frequency), las interrupciones (irq_handler_entry) y otros eventos. atrace añade etiquetas del framework de Android: el inicio y el fin del renderizado de fotogramas, las llamadas a SurfaceFlinger y las transacciones Binder.
La característica clave de Systrace es la visualización de la cadena de renderizado de cada fotograma: aplicación → BufferQueue → SurfaceFlinger → HWC (compositor) → Pantalla. Si se produce un retraso en alguna etapa, Systrace muestra la causa exacta: la aplicación no preparó el búfer a tiempo, SurfaceFlinger esperaba VSync o HWC no pudo componer las capas. El ciclo de vida del fotograma en la línea de tiempo tiene un código de colores según el estado: verde (a tiempo), amarillo (retrasado), rojo (perdido). Esta visualización es la herramienta principal para optimizar el rendimiento de la UI.
Systrace admite más de 20 categorías de traza, cada una de las cuales incluye un conjunto de eventos relacionados. Las categorías importantes incluyen: gfx (renderizado de gráficos), input (procesamiento de entrada), view (sistema View), webview (WebView), power (consumo de energía), hal (capa de abstracción de hardware). Para la creación de perfiles de juegos, es útil la categoría gfx con detalle de comandos de GPU a través de AGI (Android GPU Inspector).
Systrace proporciona un conjunto único de capacidades para Android que no están disponibles en otros generadores de perfiles: línea de tiempo del sistema, métricas a nivel de kernel y detección automática de problemas.
El informe HTML de Systrace contiene una línea de tiempo multinivel donde cada carril corresponde a un proceso o subproceso. Puede acercar y alejar la escala de tiempo, hacer clic en los eventos para ver los detalles (duración, proceso iniciador, argumentos adicionales). El código de colores ayuda a navegar rápidamente: bloques verdes — proceso en ejecución, azules — esperando, naranjas — interrupción, blancos — inactivo.
Systrace analiza automáticamente la traza y muestra mensajes de alerta que indican áreas problemáticas. Por ejemplo: Buffer underrun — SurfaceFlinger no recibió el búfer antes de VSync
o Long Binder transaction — 42 ms en el subproceso Binder_1
. Cada alerta contiene un enlace a la sección correspondiente de la línea de tiempo y una recomendación para solucionar el problema. Esto ahorra horas de análisis manual y es una de las principales razones para usar Systrace en lugar del registro manual.
Los desarrolladores pueden añadir etiquetas personalizadas a la traza de Systrace mediante la API Trace.beginSection y Trace.endSection. Esto permite rastrear la ejecución de secciones de código críticas directamente en la línea de tiempo del sistema — por ejemplo, marcar el inicio y el final de la carga de datos o el cálculo del diseño. Las etiquetas aparecen como bloques separados en el carril de la aplicación y son visibles junto con los eventos del sistema.
| Categoría | Datos | Uso típico |
|---|---|---|
| sched | Cambios de contexto, estados inactivos | Bloqueos de subprocesos, contención |
| gfx | VSync, preparación de búfer, HWC | Caídas de fotogramas, jank |
| binder | Transacciones Binder, latencia | Retrasos de IPC, llamadas remotas |
| freq | Frecuencia de CPU, gobernador de escalado | Throttling, consumo de energía |
| gfx + AGI | Comandos de GPU, sombreadores | Rendimiento de juegos |
Ejecutar Systrace es posible de dos formas: a través del CPU Profiler de Android Studio (modo Trace System Calls
) o mediante la línea de comandos utilizando el script de Python systrace.py de la carpeta platform-tools. Cada método tiene sus propios casos de uso.
Conecte el dispositivo, abra el Profiler (View → Tool Windows → Profiler), seleccione su proceso, vaya a la pestaña CPU, seleccione el modo Trace System Calls
y haga clic en Record. Después de 5–30 segundos, haga clic en Stop — Android Studio ejecutará Systrace en el dispositivo, esperará a que finalice y cargará el resultado. Limitación: la grabación solo es posible mientras el Profiler esté abierto, lo que resulta incómodo para escenarios largos o automatización.
Para un control más flexible, utilice el script systrace.py. Especifique las categorías de traza, la duración y el nombre del archivo de salida. Ejemplo: captura de datos de gfx, input y sched durante 10 segundos. La ejecución requiere Python 2.7+ y un dispositivo conectado con depuración USB habilitada. En Android 12+, Systrace se reemplaza por Perfetto — el comando sigue siendo el mismo, pero el script redirige las llamadas a perfetto.
# Ejecución básica de systrace durante 10 segundos
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Solo la categoría gfx para análisis de UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Para que su código aparezca en la línea de tiempo de Systrace, envuelva la sección crítica con Trace.beginSection / Trace.endSection. Es importante que beginSection y endSection estén estrictamente emparejados — de lo contrario, Systrace mostrará una línea de tiempo incorrecta. En Kotlin, es conveniente usar una extensión inline para garantizar el cierre de la sección incluso en caso de excepción.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Uso en código
traceSection("load_screen_data") {
fetchData()
updateUI()
}
El informe de Systrace es un archivo HTML autónomo que se puede abrir en Chrome, Edge o Firefox. Contiene una línea de tiempo interactiva, un panel de selección de procesos, una lista de mensajes de alerta y métricas clave (velocidad de fotogramas, uso de CPU, transacciones Binder). Comprender la estructura del informe es una habilidad clave para la creación de perfiles eficaz.
La línea de tiempo muestra el tiempo de izquierda a derecha. Cada proceso y subproceso es un carril separado. Las teclas W/S acercan/alejan, A/D se mueven a través del tiempo. Seleccione un área con el ratón para ampliar una sección. Las líneas de VSync muestran los límites de los fotogramas (cada 16.6 ms a 60 FPS). Si un ciclo de renderizado completo no cabe entre dos líneas de VSync, el fotograma se pierde. Preste atención al carril de SurfaceFlinger: si está ocupado durante mucho tiempo (bloque naranja), la composición de capas está ralentizando el renderizado general.
El panel de Alertas en el lado izquierdo del informe contiene problemas detectados automáticamente. Cada alerta se puede hacer clic — al hacer clic, la línea de tiempo se mueve al momento problemático. Las alertas más comunes: Long Sync
(sincronización larga de subprocesos), Scheduling Delay
(retraso del planificador), Buffer Overrun
(desbordamiento del búfer de SurfaceFlinger). Si una alerta muestra un valor de ~100 ms para Scheduling Delay, indica directamente que el subproceso de UI estaba esperando a la CPU debido a la carga de fondo — los cálculos pesados deben moverse a un Worker Thread.
Para analizar los fotogramas perdidos, active los carriles de SurfaceFlinger y app.gfx. Cada fotograma se muestra como un rectángulo: verde (≤16 ms), amarillo (16–32 ms), rojo (>32 ms). Si ve un rectángulo rojo en el carril de la aplicación, haga clic en él — Systrace mostrará qué método (o llamada al sistema) específico superó el límite. Según Google (Android Performance Patterns, 2023), el 70% de los problemas de jank son causados por un onBindViewHolder lento o GC frecuente.
Perfetto es el sucesor de Systrace, introducido por Google en Android 9 (Pie) como una herramienta experimental y convertido en la solución principal a partir de Android 12. Perfetto utiliza un formato de datos protobuf moderno, admite sesiones largas (horas en lugar de segundos) y tiene una interfaz web para ver trazas. Examinemos las diferencias clave entre los dos sistemas.
| Criterio | Systrace | Perfetto |
|---|---|---|
| Formato | Informe HTML (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Duración | Hasta 60 segundos | Horas, gigabytes de datos |
| Interfaz | HTML integrado | Web UI (ui.perfetto.dev) |
| Categorías | Fijas (ftrace + atrace) | Extensibles (consultas SQL a la traza) |
| Movilidad | Solo Android | Android, Linux, Chrome, Windows |
A pesar de la transición a Perfetto, las habilidades de Systrace siguen siendo relevantes: en dispositivos con Android 11 y versiones anteriores, se utiliza por defecto, y Perfetto mantiene la compatibilidad hacia atrás con las categorías de Systrace. En el CPU Profiler de Android Studio, Perfetto se utiliza para dispositivos nuevos y Systrace para los antiguos — de forma transparente para el usuario. Para CI/CD, se recomienda Perfetto, ya que su formato se puede procesar automáticamente mediante Python y SQL.
Para dominar prácticamente Systrace, consideremos dos escenarios: encontrar la causa de los fotogramas perdidos durante el desplazamiento y diagnosticar GC frecuentes que bloquean el subproceso de UI.
Ejecute Systrace con la categoría gfx durante 10 segundos, desplácese por la lista en la aplicación. En el informe, busque secciones con fotogramas rojos. Haga clic en el fotograma problemático y mire el carril de la aplicación — si hay un bloque inflateLayout
o onBindViewHolder
de más de 16 ms, el problema está en la inflación del diseño o en el enlace de datos. Solución: optimice el diseño (reduzca ViewGroup profundo, ViewStub), descargue la carga de imágenes a Glide con onAttachedToWindow.
Systrace con las categorías freq y sched permite ver con qué frecuencia los ciclos de GC adelantan al subproceso de UI. Busque el carril de la aplicación en la línea de tiempo — si ve bloques periódicos de 20–50 ms denominados Concurrent GC
, el recolector de basura se ejecuta con demasiada frecuencia. Añada la categoría dalvik
para un análisis detallado. Solución: convierta Bitmap a ByteBuffer, utilice un grupo de objetos (ObjectPool) para asignaciones frecuentes, reduzca la fragmentación del heap mediante argumentos de ART.
# Ejecución con categorías para análisis de UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Captura con duración de 30 segundos para prueba reproducible
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Preguntas frecuentes
Sí, para ejecutar Systrace no se requiere acceso root. La herramienta utiliza atrace, que está disponible en cualquier dispositivo con depuración USB habilitada. Algunas categorías (power, freq) pueden requerir la firma del sistema, pero las principales (gfx, sched, input) funcionan en todos los dispositivos.
El límite de 60 segundos está relacionado con la capacidad del búfer circular de ftrace — durante una grabación larga, el búfer se sobrescribe. Perfetto elimina esta limitación: puede grabar durante horas y obtener trazas de hasta varios gigabytes mediante transferencia USB o transmisión a disco.
Posibles causas: la aplicación no está en modo depurable, no se ha establecido el indicador android:debuggable=true
en el manifiesto, o se está utilizando una compilación de lanzamiento. Compruebe también que ha especificado --app=com.example.app en las categorías — de lo contrario, Systrace solo captura los procesos del sistema.
Para C++, utilice ATRACE_BEGIN y ATRACE_END de la biblioteca libcutils. Incluya el archivo de cabecera y envuelva la sección deseada. La etiqueta aparecerá en Systrace en el carril de su proceso, lo que es especialmente útil para analizar motores de juegos (Unity, Unreal).
En Android 12 y versiones superiores, utilice Perfetto. Instale el agente de perfetto en el dispositivo a través de ADB, inicie la grabación en formato JSON. Para una visualización rápida, use la interfaz web de Perfetto (ui.perfetto.dev), y para CI — exportación por línea de comandos con TraceProcessor en Python.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también