Systrace é uma ferramenta de rastreamento do sistema Android que coleta dados sobre o kernel Linux, CPU, GPU e todos os processos do sistema em um curto período de tempo. Ao contrário do Traceview, que foca nos métodos dentro do aplicativo, o Systrace mostra a imagem do sistema: carga de cada núcleo de CPU, operação do SurfaceFlinger, chamadas Binder e ciclos de GC. De acordo com Google, 2024, a ferramenta é indispensável para diagnosticar quadros perdidos, coleta de lixo frequente e anomalias na thread de UI.
Principais conclusões
Systrace é um utilitário de linha de comando do Android SDK que captura e combina dados de várias fontes de rastreamento do kernel (ftrace) e espaço do usuário (atrace) em um único relatório HTML. A ferramenta apareceu no Android 4.1 (Jelly Bean) como substituto do antigo utilitário traceview para criação de perfil do sistema e permaneceu por muito tempo a ferramenta padrão de diagnóstico de desempenho na plataforma Android.
Systrace depende do ftrace — um mecanismo de rastreamento do kernel Linux disponível no Android desde a versão 4.1. Quando o Systrace é iniciado, ele ativa as categorias de rastreamento especificadas: sched (agendador de tarefas), freq (frequência da CPU), idle (estados ociosos), workq (filas de trabalho), binder, gfx e outras. Os dados são coletados no buffer circular do kernel e, após a parada, são mesclados em um único arquivo trace.html que pode ser aberto em qualquer navegador.
A partir do Android Studio 3.1, o Systrace está integrado ao CPU Profiler. No modo Trace System Calls
, o criador de perfil executa o Systrace no dispositivo conectado e exibe os resultados diretamente na janela do Android Studio. Isso elimina a necessidade de trabalhar com a linha de comando para casos básicos, mantendo toda a funcionalidade — todas as categorias de rastreamento, filtragem e linha do tempo interativa. O desempenho do dispositivo durante o rastreamento diminui insignificantemente, pois o ftrace é projetado para sobrecarga mínima.
Systrace usa dois mecanismos de coleta de dados: ftrace no nível do kernel para eventos do sistema e atrace no espaço do usuário para tags específicas do Android. ftrace registra trocas de contexto (sched_switch), mudanças de frequência da CPU (cpu_frequency), interrupções (irq_handler_entry) e outros eventos. atrace adiciona tags do framework Android — início e fim da renderização de quadros, chamadas SurfaceFlinger e transações Binder.
O principal recurso do Systrace é a visualização do pipeline de renderização de cada quadro: aplicativo → BufferQueue → SurfaceFlinger → HWC (compositor) → Display. Se ocorrer um atraso em qualquer estágio, o Systrace mostra a causa exata: o aplicativo não preparou o buffer a tempo, o SurfaceFlinger estava aguardando VSync ou o HWC não conseguiu compor as camadas. O ciclo de vida do quadro na linha do tempo é codificado por cores por status: verde (no prazo), amarelo (atrasado), vermelho (perdido). Essa visualização é a principal ferramenta para otimizar o desempenho da UI.
Systrace suporta mais de 20 categorias de rastreamento, cada uma incluindo um conjunto de eventos relacionados. Categorias importantes incluem: gfx (renderização de gráficos), input (processamento de entrada), view (sistema View), webview (WebView), power (consumo de energia), hal (camada de abstração de hardware). Para criação de perfil de jogos, a categoria gfx com detalhes de comandos GPU via AGI (Android GPU Inspector) é útil.
Systrace fornece um conjunto único de recursos para Android que não estão disponíveis em outros criadores de perfil: linha do tempo do sistema, métricas no nível do kernel e detecção automática de problemas.
O relatório HTML do Systrace contém uma linha do tempo multinível onde cada faixa corresponde a um processo ou thread. Você pode ampliar e reduzir a escala de tempo, clicar em eventos para ver detalhes (duração, processo iniciador, argumentos adicionais). A codificação de cores ajuda a navegar rapidamente: blocos verdes — processo em execução, azuis — aguardando, laranjas — interrupção, brancos — ocioso.
O Systrace analisa automaticamente o rastreamento e exibe mensagens de alerta indicando áreas problemáticas. Por exemplo: Buffer underrun — SurfaceFlinger não recebeu o buffer antes do VSync
ou Long Binder transaction — 42 ms na thread Binder_1
. Cada alerta contém um link para a seção correspondente da linha do tempo e uma recomendação para corrigir o problema. Isso economiza horas de análise manual e é uma das principais razões para usar o Systrace em vez do registro manual.
Os desenvolvedores podem adicionar tags personalizadas ao rastreamento do Systrace através da API Trace.beginSection e Trace.endSection. Isso permite rastrear a execução de seções críticas de código diretamente na linha do tempo do sistema — por exemplo, marcar o início e o fim do carregamento de dados ou cálculo de layout. As tags aparecem como blocos separados na faixa do aplicativo e são visíveis ao lado dos eventos do sistema.
| Categoria | Dados | Uso típico |
|---|---|---|
| sched | Trocas de contexto, estados ociosos | Bloqueios de thread, contenção |
| gfx | VSync, preparação de buffer, HWC | Quedas de quadro, jank |
| binder | Transações Binder, latência | Atrasos IPC, chamadas remotas |
| freq | Frequência da CPU, governador de escalonamento | Throttling, consumo de energia |
| gfx + AGI | Comandos GPU, shaders | Desempenho de jogos |
Executar o Systrace é possível de duas maneiras: através do CPU Profiler do Android Studio (modo Trace System Calls
) ou através da linha de comando usando o script Python systrace.py da pasta platform-tools. Cada método tem seus próprios casos de uso.
Conecte o dispositivo, abra o Profiler (View → Tool Windows → Profiler), selecione seu processo, vá para a aba CPU, selecione o modo Trace System Calls
e clique em Record. Após 5–30 segundos, clique em Stop — o Android Studio executará o Systrace no dispositivo, aguardará a conclusão e carregará o resultado. Limitação: a gravação só é possível enquanto o Profiler estiver aberto, o que é inconveniente para cenários longos ou automação.
Para um controle mais flexível, use o script systrace.py. Especifique as categorias de rastreamento, duração e nome do arquivo de saída. Exemplo: captura de dados gfx, input e sched por 10 segundos. A execução requer Python 2.7+ e um dispositivo conectado com depuração USB ativada. No Android 12+, o Systrace é substituído pelo Perfetto — o comando permanece o mesmo, mas o script redireciona as chamadas para perfetto.
# Execução básica do systrace por 10 segundos
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Apenas categoria gfx para análise de UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Para fazer seu código aparecer na linha do tempo do Systrace, envolva a seção crítica com Trace.beginSection / Trace.endSection. É importante que beginSection e endSection sejam estritamente pareados — caso contrário, o Systrace mostrará uma linha do tempo incorreta. Em Kotlin, é conveniente usar uma extensão inline para garantir o fechamento da seção mesmo em caso de exceção.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Uso no código
traceSection("load_screen_data") {
fetchData()
updateUI()
}
O relatório do Systrace é um arquivo HTML autocontido que pode ser aberto no Chrome, Edge ou Firefox. Ele contém uma linha do tempo interativa, um painel de seleção de processos, uma lista de mensagens de alerta e métricas principais (taxa de quadros, uso de CPU, transações Binder). Entender a estrutura do relatório é uma habilidade fundamental para a criação de perfil eficaz.
A linha do tempo exibe o tempo da esquerda para a direita. Cada processo e thread é uma faixa separada. As teclas W/S ampliam/reduzem, A/D movem pelo tempo. Selecione uma área com o mouse para ampliar uma seção. As linhas VSync mostram os limites dos quadros (a cada 16,6 ms a 60 FPS). Se um ciclo de renderização completo não couber entre duas linhas VSync — o quadro é perdido. Preste atenção na faixa SurfaceFlinger: se estiver ocupada por muito tempo (bloco laranja), a composição de camadas está desacelerando a renderização geral.
O painel de Alertas no lado esquerdo do relatório contém problemas detectados automaticamente. Cada alerta é clicável — ao clicar, a linha do tempo se move para o momento problemático. Os alertas mais comuns: Long Sync
(sincronização longa de thread), Scheduling Delay
(atraso do agendador), Buffer Overrun
(estouro de buffer do SurfaceFlinger). Se um alerta mostrar um valor de ~100 ms para Scheduling Delay, isso indica diretamente que a thread de UI estava esperando pela CPU devido à carga de fundo — os cálculos pesados devem ser movidos para uma Worker Thread.
Para analisar quadros perdidos, ative as faixas SurfaceFlinger e app.gfx. Cada quadro é exibido como um retângulo: verde (≤16 ms), amarelo (16–32 ms), vermelho (>32 ms). Se você vir um retângulo vermelho na faixa do aplicativo, clique nele — o Systrace mostrará qual método específico (ou chamada de sistema) excedeu o limite. De acordo com o Google (Android Performance Patterns, 2023), 70% dos problemas de jank são causados por onBindViewHolder lento ou GC frequente.
Perfetto é o sucessor do Systrace, introduzido pelo Google no Android 9 (Pie) como uma ferramenta experimental e tornando-se a solução principal a partir do Android 12. O Perfetto usa um formato de dados protobuf moderno, suporta sessões longas (horas em vez de segundos) e tem uma interface web para visualizar rastreamentos. Vamos examinar as principais diferenças entre os dois sistemas.
| Critério | Systrace | Perfetto |
|---|---|---|
| Formato | Relatório HTML (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Duração | Até 60 segundos | Horas, gigabytes de dados |
| Interface | HTML integrado | Web UI (ui.perfetto.dev) |
| Categorias | Fixas (ftrace + atrace) | Extensíveis (consultas SQL ao rastreamento) |
| Mobilidade | Apenas Android | Android, Linux, Chrome, Windows |
Apesar da transição para o Perfetto, as habilidades do Systrace permanecem relevantes: em dispositivos com Android 11 e inferior, ele é usado por padrão, e o Perfetto mantém compatibilidade reversa com as categorias do Systrace. No CPU Profiler do Android Studio, o Perfetto é usado para dispositivos novos e o Systrace para os antigos — de forma transparente para o usuário. Para CI/CD, o Perfetto é recomendado, pois seu formato pode ser automaticamente processado via Python e SQL.
Para dominar praticamente o Systrace, vamos considerar dois cenários: encontrar a causa de quadros perdidos durante a rolagem e diagnosticar GC frequente que bloqueia a thread de UI.
Execute o Systrace com a categoria gfx por 10 segundos, role a lista no aplicativo. No relatório, encontre seções com quadros vermelhos. Clique no quadro problemático e olhe a faixa do aplicativo — se houver um bloco inflateLayout
ou onBindViewHolder
com mais de 16 ms, o problema está na inflação do layout ou na vinculação de dados. Solução: otimize o layout (reduza ViewGroup profundo, ViewStub), descarregue o carregamento de imagens para o Glide com onAttachedToWindow.
O Systrace com as categorias freq e sched permite ver com que frequência os ciclos de GC antecipam a thread de UI. Encontre a faixa do aplicativo na linha do tempo — se você vir blocos periódicos de 20–50 ms chamados Concurrent GC
, o coletor de lixo está sendo executado com muita frequência. Adicione a categoria dalvik
para análise detalhada. Solução: converta Bitmap em ByteBuffer, use um pool de objetos (ObjectPool) para alocações frequentes, reduza a fragmentação do heap através de argumentos ART.
# Execução com categorias para análise de UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Captura com duração de 30 segundos para teste reproduzível
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Perguntas frequentes
Sim, para executar o Systrace não é necessário acesso root. A ferramenta usa atrace, que está disponível em qualquer dispositivo com depuração USB ativada. Algumas categorias (power, freq) podem exigir assinatura do sistema, mas as principais (gfx, sched, input) funcionam em todos os dispositivos.
O limite de 60 segundos está relacionado à capacidade do buffer circular ftrace — durante a gravação longa, o buffer é sobrescrito. O Perfetto remove essa limitação: você pode gravar por horas e obter rastreamentos de até vários gigabytes via transferência USB ou transmissão para disco.
Causas possíveis: o aplicativo não está em modo depurável, a flag android:debuggable=true
não foi definida no manifesto, ou uma compilação de lançamento está sendo usada. Verifique também se você especificou --app=com.example.app nas categorias — caso contrário, o Systrace captura apenas processos do sistema.
Para C++, use ATRACE_BEGIN e ATRACE_END da biblioteca libcutils. Inclua o arquivo de cabeçalho e envolva a seção desejada. A tag aparecerá no Systrace na faixa do seu processo, o que é especialmente útil para analisar mecanismos de jogos (Unity, Unreal).
No Android 12 e superior, use Perfetto. Instale o agente perfetto no dispositivo via ADB, inicie a gravação em formato JSON. Para visualização rápida, use a interface web do Perfetto (ui.perfetto.dev), e para CI — exportação por linha de comando com TraceProcessor em Python.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também