Inspecionar registros de rastreamento com o Traceview

O Traceview é uma ferramenta que apresenta representações gráficas de registros de rastreamento. É possível gerar os registros instrumentando o código com a classe Debug. Esse método de rastreamento é muito preciso, porque você pode especificar exatamente onde no código quer iniciar e interromper o registro de dados de rastreamento. Se você ainda não gerou esses registros de rastreamento e os salvou do dispositivo conectado para a máquina local, acesse Gerar registros de rastreamento com a instrumentação do app. Inspecionar esses registros usando o Traceview ajuda a depurar o app e analisar o desempenho dele.

Se você não precisar ver os registros de rastreamento que gravou ao instrumentar seu app com a classe Debug, use o CPU Profiler incluído no Android Studio 3.0 e versões mais recentes para inspecionar as linhas de execução do app e gravar rastreamentos de método.

Abrir um registro de rastreamento usando o Traceview

Para abrir um registro de rastreamento com o Traceview do Android Studio, faça o seguinte:

  1. Inicie o Android Device Monitor.
  2. No Android Device Monitor, selecione File > Open File.
  3. Vá até o arquivo .trace que você quer inspecionar.
  4. Clique em Abrir.

Visão geral do Traceview

Depois de abrir um registro de rastreamento, o Traceview mostra dados de registro usando os dois painéis abaixo:

  • Um painel de linha do tempo que descreve quando cada linha de execução entra e sai de um método.
  • Um painel de perfil que resume a execução de cada linha de execução durante o período do registro de rastreamento.

As seções abaixo fornecem mais informações sobre os painéis de saída do Traceview.

Painel da linha do tempo

A Figura 1 mostra o painel da linha do tempo de perto. A execução de cada linha de execução é exibida na própria fileira, com o tempo decorrido aumentando para a direita. Cada método é exibido em cores variadas. Os traços finos abaixo da primeira fileira mostram os filhos (da entrada à saída) do método selecionado.

Painel da linha do tempo do Traceview mostrando a execução da linha de execução ao longo do tempo

Figura 1. Painel da linha do tempo do Traceview.

Painel de perfil

Como mostrado na figura 2, o painel de perfil fornece uma lista de todos os métodos que o sistema executou durante o período do registro de rastreamento e o tempo gasto na execução desses métodos. Um método que chama outro é chamado de pai, e os métodos que um pai chama são chamados de filhos. Ao clicar em um método para o selecionar, os pais e filhos dele são mostrados em dois nós separados.

Para cada método (nó de nível superior), a tabela informa as seguintes informações de tempo (em milissegundos), bem como a porcentagem do tempo total:

  • Tempos inclusivo e exclusivo: o tempo exclusivo é o tempo gasto na execução do código do método, enquanto o tempo inclusivo é o tempo gasto na execução do código do método mais o tempo gasto na execução dos filhos.
  • CPU e tempo real: o tempo de CPU considera apenas o tempo em que a linha de execução está usando ativamente o tempo de CPU, e o tempo real fornece informações de tempo absolutas desde o momento em que o app entra em um método até o momento em que ele sai desse método, independentemente de a linha de execução estar ativa ou suspensa.

Para cada nó de nível superior no painel de perfil, a coluna Calls + Rec, Calls/Total na tabela (não apresentada na Figura 2) informa o número de chamadas para o método e o número de chamadas recorrentes. Ou, para os métodos pai e filho, essa coluna mostra o número de chamadas em que o método era filho ou pai do método no nó de nível superior.

Painel de perfil do Traceview mostrando tempos de método inclusivos e exclusivos

Figura 2. Painel de perfil do Traceview.

Problemas conhecidos do Traceview

O registro do Traceview não lida bem com linhas de execução, o que resulta nos problemas a seguir:

  • Se uma linha de execução for encerrada durante a criação de perfil, o nome dela não será emitido (corrigido no Android 5.1 e versões mais recentes).
  • A VM reutiliza os IDs de linha de execução. Se uma linha de execução for interrompida e outra for iniciada, elas poderão receber o mesmo ID.