Resolver problemas de desempenho do build com o Build Analyzer

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Você pode usar o Build Analyzer para inspecionar o desempenho do build do projeto. O desempenho do build pode ser afetado por vários fatores que podem mudar entre os builds. Para cada build realizado, o Build Analyzer tenta apresentar as informações mais importantes para que você possa identificar e resolver rapidamente as regressões no desempenho.

Esta página apresenta uma visão geral do Build Analyzer e algumas orientações sobre como usar a ferramenta para melhorar o desempenho do build do projeto. Para outras estratégias sobre como melhorar o desempenho do build, leia Otimizar a velocidade do build.

Os dados que o Analyzer apresenta mudam com base em cada build. Especialmente com builds grandes e complexos, muitos fatores podem mudar entre os builds, mudando os dados que o Analyzer mostra como fatores importantes na duração do build. Por esse motivo, pode ser útil criar seu projeto várias vezes e comparar os dados no Analyzer para identificar padrões.

Começar

Cada vez que você cria seu app, o Build Analyzer gera um relatório e mostra dados do relatório mais recente na janela Build.

Para começar, faça o seguinte:

  1. Caso ainda não tenha feito isso, crie seu app de uma destas maneiras:
    • Clique em Build > Make Project na barra de menu.
    • Para criar um Android App Bundle ou APK, clique em Build > Build Bundle(s) / APK(s) > Build Bundle(s) ou Build > Build Bundle(s) / APK(s) > Build APK(s) na barra de menus.
  2. Para abrir a janela Build, selecione View > Tool Windows > Build na barra de menus.
  3. Para conferir o relatório do build no Build Analyzer, clique na guia Build Analyzer na janela Build.

Conferir plug-ins com tarefas que determinam a duração do build

Quando você abre o Build Analyzer pela primeira vez depois de concluir um build, a janela mostra uma visão geral da análise do build, como na figura 1.

Figura 1. A página de visão geral do Build Analyzer mostra um resumo das descobertas.

Para um detalhamento de plug-ins com tarefas que determinam a duração do build, clique em Plugins with tasks impacting build duration na página de visão geral. Você também pode selecionar Tasks na lista suspensa e confirmar se Group by plugin está selecionado.

Figura 2. O Build Analyzer oferece um detalhamento dos plug-ins que mais afetam a duração do build.

O painel mostra as tarefas que contribuem para a duração do build. Todas as tarefas com problemas têm um ícone de aviso ao lado.

O gráfico mostra o quanto a tarefa está contribuindo para a duração geral do build.

O painel de detalhes mostra mais informações sobre os problemas detectados para a tarefa selecionada.

Cada nó mostra o tempo total necessário para executar os filhos diretos dele. Essas durações ajudam você a se concentrar na inspeção das tarefas com maior impacto na duração do build.

Conferir tarefas que determinam a duração do build

Para um detalhamento das tarefas que contribuem para a duração do build, clique em Tasks impacting build duration na página de visão geral. Você também pode selecionar Tasks na lista suspensa e confirmar se Group by plugin está desmarcado.

Figura 3. O Build Analyzer oferece um detalhamento das tarefas que mais afetam a duração do build.

O Gradle determina a execução de tarefas por interdependências de tarefas, estrutura do projeto e carga de CPU e executa as tarefas de forma sequencial ou em paralelo. Para um build determinado, o Build Analyzer destaca o conjunto de tarefas executadas sequencialmente que determinou a duração da compilação atual. Solucionar as ineficiências nessas tarefas destacadas é o melhor ponto de partida para reduzir o tempo de compilação total.

Você pode conferir um conjunto diferente de tarefas que determinam a duração de cada build executado. Por exemplo, se você fizer mudanças na configuração do build, executar um build com um conjunto diferente de tarefas, como um build incremental, ou executar um build com restrições diferentes, a janela "Build Speed" talvez destaque um conjunto diferente de tarefas que mais afetaram a duração desse build. Devido a essa variabilidade, convém usar a janela "Build Speed" em vários builds para reduzir de forma consistente a duração deles.

Cada tarefa listada é codificada por cores desta maneira:

  • Azul claro: a tarefa pertence ao Plug-in do Android para Gradle, ao plug-in do Java para Gradle ou ao plug-in do Gradle para Kotlin.
  • Azul: a tarefa pertence a um plug-in personalizado ou de terceiros, como um plug-in que você aplicou depois de criar um novo projeto usando o Android Studio.
  • Roxo: a tarefa não pertence a um plug-in, mas é usada para modificar dinamicamente as propriedades do projeto durante a execução. Por exemplo, tarefas que você pode definir nos arquivos build.gradle.
  • Cinza: a tarefa não tem um impacto alto na duração do build em comparação a outras tarefas destacadas pelo Analyzer.

Clique em cada tarefa filha para saber mais sobre a execução dela. Por exemplo, o Analyzer oferece outras informações, como o plug-in pai, o tipo de tarefa, outras tarefas que causaram a execução dessa e se ela foi executada de forma incremental, conforme mostrado na figura 2. O Analyzer também pode gerar avisos que podem ajudar você a configurar a tarefa para que ela seja executada com mais eficiência.

Inspecionar avisos

Se o Build Analyzer detectar que algumas tarefas podem ser configuradas para serem executadas com mais eficiência, ele vai mostrar um aviso.

Por exemplo, uma tarefa que não usa as APIs apropriadas do Gradle para especificar entradas e saídas não pode tirar proveito dos builds incrementais. Caso seu build inclua essas tarefas, o Build Analyzer pode colocar um aviso de Always-run nelas, porque elas precisam ser executadas em todos os builds, independente de mudanças de entradas.

Para conferir todos os avisos que o Analyzer identificou para o build, clique em All warnings na página de visão geral ou selecione Warnings no menu suspenso. A visualização "Warnings" mostra os avisos agrupados por categoria. Por exemplo, o nó Always-run agrupa tarefas que o Analyzer acha que não estão configuradas corretamente para builds incrementais.

Quando você clica em um nó filho, o Analyzer descreve a natureza do aviso e as possíveis etapas para resolver o problema. Além disso, se a tarefa pertencer a um plug-in aplicado ao projeto, o Analyzer vai fornecer um link Generate report, conforme mostrado na figura 4.

Figura 4. Informações detalhadas sobre os avisos do Build Analyzer.

Quando você clica no link Generate report, uma caixa de diálogo é mostrada com mais informações que podem ajudar o desenvolvedor do plug-in a resolver o problema em uma nova versão do plug-in. Clique em Copy para salvar o texto na área de transferência e colar as informações em um relatório de bug para o desenvolvedor do plug-in.

Tipos de aviso

O Build Analyzer informa estes tipos de aviso:

  • Always run tasks: uma tarefa é executada sempre e faz com que outras tarefas sejam executadas em todos os builds, o que é desnecessário. Esse aviso pode ser exibido por dois motivos principais:

    • (Mais comum) Você não declarou entradas e saídas de tarefas corretamente. Nesse caso, você deve declarar corretamente as entradas e saídas para suas tarefas. Ou seja, declare entradas e saídas por conta própria onde possível ou altere as versões do plug-in se as tarefas que acionam o aviso forem de plug-ins de terceiros.

    • (Menos comum) Uma tarefa tem upToDateWhen definido como falso, o que precisa ser evitado. Pode ser que haja uma lógica avaliada como falsa ou que upToDateWhen esteja fixado no código para ser falso. Se houver uma lógica avaliada como falsa, esse resultado pode ser intencional e você pode ignorar o aviso. Se upToDateWhen estiver fixado no código para ser falso, remova-o do código.

  • Task setup issues: esse aviso é gerado para tarefas que declaram o mesmo diretório que as saídas. Isso significa que essas saídas de tarefas provavelmente não são preservadas entre builds e vão ser sempre executadas, mesmo quando não houver alterações. Para resolver esse problema, declare diretórios de saída diferentes para suas tarefas. Isso significa declarar diferentes diretórios de saída por conta própria onde possível ou alterar as versões do plug-in se as tarefas que acionam o aviso forem de plug-ins de terceiros.

  • Non-incremental annotation processor: este aviso é gerado em situações em que um processador de anotações não é incremental e faz com que a tarefa JavaCompile seja sempre executada de modo não incremental. Para resolver esse problema, mude para um processador de anotações incremental.

  • Configuration cache: esse aviso vai ser mostrado se o armazenamento em cache da configuração não estiver ativado para seu projeto. O Build Analyzer usa uma sequência de builds para verificar se o projeto é compatível com o armazenamento em cache da configuração. Se as verificações de compatibilidade forem bem-sucedidas, vai ser possível ativar o armazenamento em cache da configuração no Build Analyzer.

  • Check Jetifier: esse aviso vai ser mostrado se a sinalização enableJetifier estiver presente e ativada no projeto. Ou seja, se você tem android.enableJetifier=true no arquivo gradle.properties. O Build Analyzer pode fazer uma verificação para saber se a sinalização pode ser removida com segurança para permitir que o projeto tenha um melhor desempenho de compilação e possa ser migrado das Bibliotecas de Suporte do Android descontinuadas.