lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Inspecionar Activity de CPU e rastreamentos de métodos com o CPU Profiler

O CPU Profiler ajuda a inspecionar o uso de CPU e as atividades de encadeamentos do aplicativo em tempo real e a gravar os rastreamentos do método, o que permite otimizar e depurar o código do aplicativo.

Para abrir o CPU Profiler, siga estas etapas:

  1. Clique em View > Tool Windows > Android Profiler (você também pode clicar em Android Profiler na barra de ferramentas).
  2. Selecione o dispositivo e o processo do aplicativo para o qual você quer criar o perfil na barra de ferramentas do Android Profiler. Se você estiver conectado a um dispositivo por USB, mas o dispositivo não for exibido na lista, verifique se a depuração de USB foi ativada.
  3. Clique em qualquer lugar da linha do tempo da CPU para abrir o CPU Profiler.

Por que criar o perfil da utilização de CPU

A redução do uso de CPU do aplicativo oferece muitas vantagens, como uma experiência do usuário mais rápida e uniforme e a preservação da duração da bateria do dispositivo. Além disso, também ajuda o aplicativo a ter um bom desempenho em diversos dispositivos novos e antigos. Você pode usar o CPU Profiler para monitorar o uso de CPU e as atividades dos encadeamentos durante a interação com o aplicativo. No entanto, para obter informações mais detalhadas sobre como o aplicativo executa seu código, grave e inspecione rastreamentos do método.

Para cada encadeamento no processo do aplicativo, você poderá descobrir quais métodos são executados em um período e os recursos de CPU consumidos por cada método durante sua execução. Além disso, você pode usar rastreamentos do método para identificar autores e recebedores de chamadas. Um autor da chamada é um método que invoca outro método. Um recebedor da chamada é o método invocado pelo outro método. Você pode usar essas informações para determinar quais métodos são responsáveis por invocar determinadas tarefas com uso intensivo de recursos com muita frequência e tentar otimizar o código do aplicativo para evitar trabalho desnecessário.

Se você quiser coletar dados detalhados do sistema para ajudar na inspeção de processos de sistema nativos e resolver instabilidades de IU causadas por quadros perdidos, use systrace.

Como alternativa, se você quiser exportar arquivos .trace capturados usando a classeDebug, use Traceview.

Visão geral do CPU Profiler

Ao ser aberto, o CPU Profiler começa imediatamente a exibir o uso de CPU e as atividades de encadeamentos do aplicativo. Você deve ver algo semelhante à figura 1.

Figura 1. O CPU Profiler.

Como indicado na figura 1, a visualização padrão do CPU Profiler inclui:

  1. Linha do tempo de eventos: mostra as atividades do aplicativo à medida que passam por estados diferentes do seu ciclo de vida e indica as interações do usuário com o dispositivo, incluindo eventos de rotação de tela. Para saber mais sobre a linha do tempo de eventos, incluindo como ela é ativada, leia Ativar criação de perfil avançada.
  2. Linha do tempo da CPU: mostra em tempo real o uso da CPU pelo aplicativo como porcentagem do tempo total de CPU disponível e o número total de encadeamentos usado pelo aplicativo. Além disso, a linha do tempo também mostra o uso da CPU por outros processos (como processos de sistema ou outros aplicativos) para que você possa compará-lo ao uso do aplicativo. É possível inspecionar dados históricos de uso de CPU movendo o mouse ao longo do eixo horizontal da linha do tempo.
  3. Linha do tempo de atividade de encadeamentos: lista cada encadeamento que pertence ao processo do aplicativo e indica suas atividades juntamente com uma linha do tempo com as cores mostradas abaixo. Após gravar o rastreamento de um método, você poderá selecionar um encadeamento dessa linha do tempo para inspecionar seus dados no painel de rastreamento.
    • Verde: o encadeamento está ativo ou pronto para usar a CPU. Ou seja, está no estado "executando" ou "executável".
    • Amarelo: o encadeamento está ativo, mas aguarda uma operação de E/S, como E/S de disco ou rede, para poder concluir seu trabalho.
    • Cinza: o encadeamento está suspenso e não está consumindo nenhum tempo de CPU. Às vezes, isso ocorre quando o encadeamento precisa acessar um recurso ainda não disponível. O encadeamento entra em suspensão voluntária ou é suspenso pelo kernel até que o recurso necessário fique disponível.
  4. Configurações de gravação: permite selecionar uma das opções a seguir para determinar como o criador de perfil grava rastreamentos de um método.
    • Sampled: uma configuração padrão que captura a pilha de chamadas a intervalos frequentes durante a execução do aplicativo. O criador de perfil compara conjuntos de dados capturados para obter informações de uso de tempo e uso de recursos pela execução do código do aplicativo. Uma questão inerente ao rastreamento baseado em amostra é que, se o aplicativo entrar em um método após a captura da pilha de chamadas e sair desse método antes da próxima captura, essa chamada ao método não será registrada pelo criador de perfil. Se você estiver interessado em métodos de rastreamento com ciclos de vida curtos, use o rastreamento instrumentado.
    • Instrumented: uma configuração padrão que instrumenta o aplicativo em tempo de execução para gravar um timestamp no início e no término de cada chamada de método. Os timestamps coletados e comparados para gerar dados de rastreamento de métodos, incluindo informações sobre tempo e uso de CPU. Observe que a sobrecarga associada à instrumentação de cada método afeta o desempenho do tempo de execução e pode influenciar os dados de criação do perfil, o que será ainda mais perceptível para métodos com ciclos de vida relativamente breves. Além disso, se o aplicativo executar um grande número de métodos em um breve período, o criador de perfil poderá esgotar rapidamente o limite de tamanho de arquivo e deixar de gravar dados de rastreamento adicionais.
    • Edit configurations: permite alterar alguns padrões das configurações de gravação amostrada e instrumentada descritos acima e salvá-los como configuração personalizada. Para saber mais, vá para a seção sobre criação de configurações de gravação.
  5. Botão Record: inicia e interrompe a gravação de rastreamento de um método. Para saber mais, acesse a seção sobre gravação e inspeção de rastreamento de métodos.

Observação: o criador de perfil também relata o uso de CPU dos encadeamentos adicionados pelo Android Studio e pela plataforma do Android ao processo do aplicativo, como JDWP, Profile Saver, Studio:VMStats, Studio:Perfa e Studio:Heartbeat (embora os nomes exatos exibidos na linha do tempo de atividade de encadeamentos possam variar). Isso significa que o uso de CPU do aplicativo na linha do tempo da CPU também relata o tempo de CPU usado por esses encadeamentos. Você pode ver alguns desses encadeamentos na linha do tempo de atividades de encadeamentos, bem como monitorar suas atividades. (No entanto, como os encadeamentos do criador de perfil executam código nativo, não é possível gravar dados de rastreamento de métodos para eles.) O Android Studio relata esses dados para que você possa identificá-los facilmente quanto as atividades e o uso de CPU pelos encadeamentos são realmente causados pelo código do aplicativo.

Gravar e inspecionar rastreamentos de métodos

Para começar a gravar o rastreamento de um método, selecione a configuração de gravação Sampled ou Instrumented, ou uma configuração de gravação personalizada que você criou no menu suspenso e clique em Record . Interaja com o aplicativo e clique em Stop recording quando concluir. O criador de perfil seleciona automaticamente o quadro do tempo gravado e exibe as informações de rastreamento no painel de rastreamento de métodos, como mostrado na figura 2. Se você quiser inspecionar o rastreamento do método para um encadeamento diferente, basta selecioná-lo na linha do tempo de atividade de encadeamentos.

Figura 2. O CPU Profiler após a gravação do rastreamento do método.

  1. Quadro de tempo selecionado: determina a parte do quadro de tempo gravado que você quer inspecionar no painel de rastreamento. Na primeira gravação de rastreamento de um método, o CPU Profiler seleciona automaticamente toda a duração da gravação na linha do tempo da CPU. Se você quiser inspecionar apenas os dados de rastreamento de métodos de parte do quadro de tempo gravado, poderá clicar e arrastar as arestas da região destacada para modificar seu comprimento.
  2. Timestamp: indica o horário de início e de término do rastreamento gravado de um método (em relação ao momento em que o criador de perfil começou a coletar informações de uso de CPU do dispositivo). Você pode clicar no timestamp e hora para selecionar automaticamente toda a gravação como quadro de tempo selecionado, o que é especialmente útil quando há várias gravações e você quer alternar entre elas.
  3. Painel de rastreamento: exibe dados de rastreamento de métodos para o quadro de tempo e o encadeamento selecionados. Esse painel é exibido somente após a gravação do rastreamento de pelo menos um método. Nese painel, é possível selecionar a forma de visualização de cada rastreamento de pilha (usando as guias de rastreamento) e como você quer medir o tempo de execução (usando o menu suspenso de referência de tempo).
  4. Escolha a exibição do rastreamento do método como árvore Top Down, árvore Bottom Up, Call Chart ou Flame Chart. Saiba mais sobre cada guia do painel de rastreamento nas seções a seguir.
  5. Selecione uma das seguintes opções no menu suspenso para determinar como as informações de tempo de cada chamada de método são medidas:
    • Wall clock time: as informações de tempo representam o tempo decorrido real.
    • Thread time: as informações de tempo representam o tempo decorrido real menos qualquer parte desse tempo em que o encadeamento não consumiu recursos de CPU. Para qualquer método, o Thread time será sempre menor ou igual ao Wall clock time. O uso do Thread time oferece uma melhor compreensão da forma como a maior parte do uso real de CPU por um encadeamento é consumida por um determinado método.

Inspecionar rastreamentos usando a guia Call Chart

A guia Call Chart oferece uma representação gráfica do rastreamento de um método onde o período e o tempo de uma chamada de método (ou autor da chamada) é representado no eixo horizontal e os recebedores da chamada são mostrados ao longo do eixo vertical. As chamadas do método para APIs do sistema são mostradas em laranja, as chamadas aos próprios métodos do aplicativo são mostradas em verde e as chamadas do método para APIs de terceiros (incluindo APIs da linguagem Java) são mostradas em azul. A figura 3 abaixo mostra um exemplo de gráfico de chamadas e ilustra os conceitos de tempo próprio, tempo secundário e tempo total para um determinado método. Você pode saber mais sobre esses conceitos na seção sobre como inspecionar rastreamentos usando gráficos Top Down e Bottom Up.

Figura 3. Um exemplo de gráfico de chamadas que ilustra o tempo próprio, o tempo secundário e o tempo total para o método D.

Dica: para acessar o código-fonte de um método, clique com o botão direito no método e selecione Jump to Source. Esse acesso funciona em qualquer guia do painel de rastreamentos.

Inspecionar rastreamentos usando a guia Flame Chart

A guia Flame Chart oferece um gráfico de chamadas invertido que agrega pilhas de chamadas idênticas. Ou seja, métodos idênticos que compartilham a mesma sequência de autores da chamada são coletados e representados como uma barra mais longa em um diagrama de chamas (em vez de serem exibidos como várias barras mais curtas, como mostrado em um gráfico de chamada). Dessa forma, é mais fácil ver quais comandos consomem a maior quantidade de tempo. No entanto, isso também significa que o eixo horizontal não representa mais uma linha do tempo. Em vez disso, indica a quantidade relativa de tempo da execução de cada método.

Para ajudar a ilustrar esse conceito, considere o gráfico de chamadas na figura 4 abaixo. Observe que o método D faz várias chamadas para B (B1, B2 e B3), e que algumas chamadas para B chamam C (C1 e C3).

Figura 4. Um gráfico de chamadas com várias chamadas de métodos que compartilham uma sequência comum de autores da chamada.

Como B1, B2 e B3 compartilham a mesma sequência de autores da chamada (A → D → B), eles são agregados, como mostrado abaixo. De forma similar, C1 e C3 são agregados porque compartilham a mesma sequência de autores da chamada (A → D → B → C). Observe que C2 não é incluído porque tem uma sequência diferente de autores da chamada (A → D → C).

Figura 5. Agregação de métodos idênticos que compartilham a mesma pilha de chamadas.

As chamadas de métodos agregadas são usadas para criar o diagrama de chamas, como mostrado na figura 6. Observe que, para qualquer chamada de método em um diagrama de chamas, os recebedores de chamada que consomem a maior parte de tempo de CPU são exibidos primeiro.

Figura 6. Uma representação do diagrama de chamas do gráfico de chamadas mostrado na figura 4.

Inspecionar rastreamentos usando gráficos Top Down e Bottom Up

A guia Top Down exibe uma lista de chamadas de métodos onde a expansão de um nó do método exibe seus recebedores de chamadas. A figura 7 mostra um gráfico de cima para baixo para o gráfico de chamadas da figura 3. Cada seta no gráfico aponta de um autor da chamada para um recebedor da chamada.

Como mostrado na figura 7, a expansão do método A na guia Top Down exibe seus recebedores de chamada, os métodos B e D. Depois disso, a expansão do nó do método D expõe seus receptores da chamada, os métodos B e C, e assim por diante. De forma similar à guia Flame chart , a árvore de cima para baixo agrega informações de rastreamento para métodos idênticos que compartilham a mesma pilha de chamadas. Ou seja, a guia Flame chart oferece uma representação gráfica da guia Top down.

A guia Top Down fornece as informações a seguir para ajudar a descrever o tempo de CPU gasto em cada chamada de método (os tempos também são representados como porcentagem do tempo total do encadeamento em relação à duração do quadro de tempo selecionado):

  • Self: a quantidade de tempo que a chamada do método dispendeu executando seu próprio código e não o código dos recebedores da chamada, como ilustrado no método D da figura 3.
  • Children: a quantidade de tempo que a chamada do método dispendeu executando o código dos recebedores da chamada e não o seu próprio código, como ilustrado no método D da figura 3.
  • Total: a soma dos tempos Self e Children dos métodos. É a representação da quantidade total de tempo dispendida pelo aplicativo executando uma chamada de método, como ilustrado no método D da figura 3.

Figura 7. Uma árvore Top Down.

Figura 8. Uma árvore Bottom Up para o método C da figura 7.

A guia Bottom Up exibe uma lista de chamadas de métodos onde a expansão de um nó do método exibe seus autores da chamada. Usando o rastreamento de exemplo mostrado na figura 7, a figura 8 mostra uma árvore de baixo para cima do método C. A abertura do nó do método C na árvore de baixo para cima exibe cada um de seus autores da chamada exclusivos, os métodos B e D. Observe que, embora B chame C duas vezes, B é exibido apenas uma vez na expansão do nó para o método C na árvore de baixo para cima. Depois disso, a expansão do nó B exibe seu autor da chamada, os métodos A e D.

A guia Bottom Up é útil para classificar métodos de acordo com os que consomem mais (ou menos) tempo de CPU. E você pode inspecionar cada nó para determinar quais autores da chamada dispendem mais tempo de CPU invocando esses métodos. Em comparação com a árvore de cima para baixo, as informações de tempo de cada método em uma árvore de baixo para cima fazem referência ao método na parte superior de cada árvore (nó superior). O tempo de CPU também é representado como porcentagem do tempo total do encadeamento durante a gravação. A tabela a seguir ajuda a explicar como interpretar as informações de tempo do nó principal e de seus métodos de autores da chamada (subnós).

Self Children Total
Método na parte superior da árvore de baixo para cima (nó principal) Representa a quantidade total de tempo dispendida pelo método executando seu próprio código e não o de seus recebedores da chamada. Em comparação com a árvore de cima para baixo, essas informações de tempo representam uma soma de todas as chamadas para este método durante a gravação. Representa a quantidade total de tempo dispendida pelo método executando o código de seus receptores da chamada e não o seu próprio código. Em comparação com a árvore de cima para baixo, essas informações de tempo representam uma soma de todas as chamadas para este método durante a gravação. A soma dos tempos próprios e secundários.
Métodos do autor da chamada (subnós) Representa o total do tempo próprio do recebedor da chamada quando chamado pelo autor da chamada. Usando a árvore de baixo para cima na figura 8 como exemplo, o tempo próprio para o método B seria a soma de todos os tempos próprios para cada execução do método C quando chamado por B. Representa o total do tempo secundário do recebedor da chamada quando invocado pelo autor da chamada. Usando a árvore de baixo para cima na figura 8 como exemplo, o tempo próprio para o método B seria a soma de todos os tempos próprios para cada execução do método C quando chamado por B. A soma dos tempos próprios e secundários.

Observação: para uma determinada gravação, o Android Studio deixa de coletar novos dados quando o criador de perfil alcança o limite de tamanho de arquivo (no entanto, a gravação em si continua). Normalmente, isso acontece muito mais rapidamente na execução de rastreamentos instrumentados, porque esse tipo de rastreamento coleta mais dados em um período menor em comparação a um rastreamento por amostra. Se você ampliar o quadro de tempo da inspeção até conter um período da gravação após o limite ser alcançado, os dados de tempo no painel de rastreamento não serão alterados (porque não há novos dados disponíveis). Além disso, o painel de rastreamento exibirá NaN como informações de tempo quando você selecionar apenas a parte da gravação que não tem dados disponíveis.

Criar configurações de gravação

Você pode selecionar uma das configurações de gravação fornecidas pelo Android Studio, como Sampled ou Instrumented, ou criar a sua própria. Para criar ou editar uma configuração personalizada, ou inspecionar uma configuração padrão existente, abra a caixa de diálogo CPU Recording Configurations selecionando Edit configurations no menu suspenso de configurações de gravação.

Figura 9. A caixa de diálogo CPU Recording Configurations permite que você crie ou edite uma configuração de gravação personalizada ou inspecione uma configuração padrão existente.

Você pode inspecionar as definições de uma configuração existente selecionando-a no painel esquerdo, ou criar uma nova configuração de gravação da seguinte forma:

  1. Clique em Add na parte superior esquerda da caixa de diálogo. Será criada uma nova configuração, com algumas definições padrão.
  2. Atribua um nome à configuração.
  3. Selecione Sampled ou Instrumented na seção Trace Technology. Cada uma dessas opções funciona da forma descrita em Visão geral do CPU Profiler.
  4. Nas configurações de gravação personalizada, especifique Sampling interval em microssegundos (μs). Esse valor representa a duração entre cada amostra da pilha de chamadas do aplicativo. Lembre-se de que, quanto menor a duração especificada, mais rapidamente será alcançado o limite de tamanho do arquivo de dados gravados.
  5. Especifique File size limit em megabytes (MB) para os dados gravados no dispositivo conectado. Quando você interromper a gravação, o Android Studio analisará esses dados e os exibirá na janela do criador de perfil. Portanto, se você aumentar o limite e gravar uma grande quantidade de dados, o Android Studio demorará muito mais para analisar o arquivo e poderá parar de responder.

    Observação: se você usar um dispositivo conectado executando a API de nível 26 ou posterior, não haverá limite para o tamanho do arquivo dos dados de rastreamento e este valor será ignorado. No entanto, ainda será necessário tomar cuidado com a quantidade de dados coletada pelo dispositivo em cada gravação. O Android Studio pode ter dificuldades para analisar arquivos de rastreamento volumosos. Por exemplo, se você estiver gravando um rastreamento por amostra com um intervalo de amostragem curto ou um rastreamento instrumentado enquanto o aplicativo chama vários métodos em um curto período, serão gerados rapidamente arquivos de rastreamento volumosos.

  6. Clique em Apply ou OK. Se você alterou outras configurações de gravação, essas alterações também serão aplicadas.

Após criar uma nova configuração, ela será selecionada automaticamente no menu suspenso de configurações de gravação e você poderá usá-la na próxima gravação.