Analisar seu build com o APK Analyzer

O Android Studio inclui o APK Analyzer, que fornece insights imediatos sobre a composição do APK ou do Android App Bundle após a conclusão do processo de build. Usando o APK Analyzer, é possível reduzir o tempo gasto na depuração de problemas com arquivos e recursos DEX no seu app e reduzir o tamanho do APK. O APK Analyzer também está disponível na linha de comando com apkanalyzer.


Com o APK Analyzer, é possível:

  • Conferir o tamanho absoluto e relativo dos arquivos no app, como os arquivos de recursos DEX e Android.
  • Entender a composição dos arquivos DEX.
  • Ver rapidamente as versões finais dos arquivos no app, como o arquivo AndroidManifest.xml.
  • Fazer uma comparação lado a lado de dois APKs ou pacotes de app.

Há três maneiras de acessar o APK Analyzer quando um projeto está aberto:

  • Arraste um APK ou pacote de app para a janela Editor do Android Studio.
  • Alterne para a visualização Project na janela Project e clique duas vezes no APK no diretório build/output/apks/ padrão.
  • Selecione Build > Analyze APK na barra de menus e selecione seu APK ou pacote de app.

Conferir informações de arquivo e tamanho

Os APKs são arquivos que seguem o formato de arquivo ZIP. O APK Analyzer mostra cada arquivo ou pasta como uma entidade que pode ser aberta para navegar em pastas. A hierarquia das entidades espelha a estrutura dos arquivos e pastas do arquivo do APK.

O APK Analyzer mostra o tamanho do arquivo compactado (ou "tamanho do arquivo bruto") e os valores de tamanho do arquivo de download para cada entidade, conforme mostrado na Figura 1. A coluna Raw File Size representa a contribuição da entidade para o tamanho total do APK. Download Size representa o tamanho compactado estimado da entidade como entregue pelo Google Play. A coluna % of Total Download Size indica a porcentagem do tamanho total de download do APK que a entidade representa.

Figura 1. Tamanhos de arquivo no APK Analyzer.

Conferir o AndroidManifest.xml

Caso seu projeto inclua vários arquivos AndroidManifest.xml, como para variações do produto ou bibliotecas que também forneçam um arquivo de manifesto, eles serão mesclados em um único arquivo no seu app. Esse arquivo de manifesto normalmente é um arquivo binário dentro do APK ou pacote de app, mas quando selecionado no APK Analyzer, o formato XML dessa entidade é reconstruído e apresentado.

Esse visualizador ajuda você a entender as mudanças que podem ter sido feitas no app durante o build. Por exemplo, você pode conferir como o arquivo AndroidManifest.xml de uma biblioteca de que seu app depende é mesclado com o arquivo AndroidManifest.xml final.

Além disso, o visualizador fornece alguns recursos de lint. Avisos ou erros aparecem no canto superior direito. A Figura 2 mostra um erro sendo relatado para o arquivo de manifesto selecionado.

Figura 2. Um ícone de erro aparece no canto superior direito do arquivo de manifesto selecionado.

Conferir arquivos DEX

O visualizador de arquivos DEX do APK Analyzer oferece acesso imediato às informações dos arquivos DEX no seu app. As contagens de classes, pacotes, referências totais e declarações são fornecidas no visualizador, o que pode ajudar a decidir se compensa ou não usar multidex ou como remover dependências para ficar abaixo do limite de 64 mil métodos em um arquivo DEX.

A Figura 3 mostra um app de tamanho médio que está abaixo do limite de 64 mil métodos no arquivo DEX. Cada pacote, classe e método dentro do arquivo DEX tem contagens listadas nas colunas Defined Methods e Referenced Methods.

A coluna Referenced Methods conta todos os métodos referenciados pelo arquivo DEX. Isso normalmente inclui métodos definidos no código, bibliotecas de dependência e métodos definidos nos pacotes Java e Android padrão usados pelo código. Esses são os métodos que contam para o limite de 64 mil métodos em cada arquivo DEX.

A coluna Defined Methods conta apenas os métodos definidos em um dos arquivos DEX. Portanto, esse número é um subconjunto de Referenced Methods.

Figura 3. Um aplicativo de tamanho médio.

Filtrar a visualização em árvore do arquivo DEX

Logo acima da lista Class, o APK Analyzer oferece filtros para visualizar o conteúdo do arquivo DEX selecionado, como mostrado na figura 4.

Figura 4. Filtros de DEX definidos para mostrar campos e métodos para BuildConfig.

Para usar os filtros para mostrar todos os métodos e campos dentro de uma classe, faça o seguinte:

  1. Na lista File, selecione o arquivo classes.dex.
  2. Na lista Class, navegue até uma classe e selecione-a.
  3. Abra a classe selecionada.
  4. Ative ou desative Show fields para mostrar ou ocultar os campos de classe.
  5. Ative ou desative Show methods para mostrar ou ocultar os métodos de classe.
  6. Ative ou desative Show all referenced methods or fields para mostrar ou ocultar pacotes, classes, métodos e campos referenciados.

    Na visualização em árvore, os nós em itálico são referências que não têm uma definição no arquivo DEX selecionado. Um arquivo DEX pode referenciar métodos e campos que são definidos em um arquivo diferente. Por exemplo, System.out.println() é uma referência ao método println() no framework do Android.

Carregar mapeamentos do ProGuard.

Ao lado dos ícones de filtragem estão os ícones de mapeamento do ProGuard. Os ícones do ProGuard ficam esmaecidos até que você carregue um conjunto de arquivos de mapeamento do ProGuard que adicionam funcionalidade ao visualizador de DEX, como desofuscar nomes (mapping.txt), que mostram os nós removidos (usage.txt) e indicar nós que não podem ser removidos (seeds.txt).

O arquivo de mapeamento ProGuard importado precisa ser resultado do mesmo build que produziu os arquivos DEX com a redução de código ativada.

Figura 5. Carregar mapeamentos do ProGuard...

Para carregar os arquivos de mapeamento do ProGuard, faça o seguinte:

  1. Clique em Load ProGuard Mappings....
  2. Navegue até a pasta do projeto que contém os arquivos de mapeamento e carregue todos os arquivos, qualquer combinação dos arquivos ou a pasta que contém os arquivos.

    Os arquivos de mapeamento costumam estar em project/app/build/outputs/mappings/release/. Por padrão, o seletor de arquivos usará a pasta release se detectar essa estrutura do projeto.

    Primeiro, o seletor de arquivos verifica nomes de arquivo que correspondam exatamente a mapping.txt, seeds.txt e usage.txt. Em seguida, ele verifica nomes de arquivos que contenham o texto mapping, usage ou seeds em algum lugar e terminem com .txt. Por exemplo, release-seeds-1.10.15.txt é uma correspondência.

A lista a seguir descreve os arquivos de mapeamento:

  • seeds.txt: os nós que a configuração do ProGuard impede de serem removidos durante a redução são mostrados em negrito.
  • mapping.txt: ativa Deobfuscate names para que seja possível restaurar os nomes originais dos nós que foram ofuscados pelo R8. Por exemplo, você pode restaurar nomes de nós ofuscados como a, b, c em MyClass, MainActivity e myMethod().
  • usage.txt: ativa Show removed nodes para que seja possível mostrar classes, métodos e campos que foram removidos pelo R8 durante a redução. Os nós restaurados são mostrados riscados.

    Para saber mais sobre como usar o R8 para ofuscar e minimizar seu código, consulte Reduzir, ofuscar e otimizar o app.

Mostrar bytecode, encontrar usos e gerar regra Keep

Os nós na visualização em lista Class têm um menu de contexto com as opções abaixo que permitem analisar o bytecode, encontrar usos e mostrar uma caixa de diálogo com regras do ProGuard que podem ser copiadas e coladas no nó selecionado. Clique com o botão direito do mouse em qualquer nó da visualização em lista Class para mostrar o menu de contexto correspondente.

Show bytecode: descompila a classe, método ou campo selecionado e mostra a representação do bytecode smali em uma caixa de diálogo desta maneira:

Figura 6. Bytecode DEX para o método init.

Find usages: mostra as outras partes do código DEX que têm referências à classe ou ao método selecionado, como mostrado na figura 7. Se seeds.txt estiver carregado, os nós mostrados em negrito indicarão que a configuração do ProGuard impedirá que eles sejam removidos durante a redução:

Figura 7. Referências a MyClass.

Generate ProGuard Keep rule: mostra as regras do ProGuard que você pode copiar e colar no arquivo de configuração do ProGuard do seu projeto, como mostrado na figura 8. Isso impede que um determinado pacote, classe, método ou campo seja removido durante a fase de redução de código. Para mais informações, consulte Personalizar o código a ser mantido.

Figura 8. Regras do ProGuard que você pode copiar da caixa de diálogo para o arquivo de configuração do ProGuard.

Consultar entidades de código e recurso

Várias tarefas de build mudam as entidades finais em um app. Por exemplo, as regras de redução do ProGuard podem alterar seu código final, e os recursos de imagem podem ser substituídos por recursos em uma variação de produto.

Para conferir a versão final dos arquivos com o APK Analyzer, clique na entidade para ter uma prévia da entidade de texto ou imagem, conforme mostrado na figura 9.

Figura 9. Uma visualização do recurso de imagem final.

O APK Analyzer também pode mostrar vários arquivos de texto e binários. Por exemplo, o visualizador de entidades resources.arsc permite que você confira os valores específicos da configuração, como traduções de idiomas, para um recurso de string. Na Figura 10, você pode conferir as traduções para cada recurso de string.

Figura 10. Visualização dos recursos de string traduzidos.

Comparar arquivos

O APK Analyzer pode comparar o tamanho das entidades em dois arquivos diferentes de APK ou pacote de app. Isso é útil quando você precisa entender por que seu app aumentou de tamanho em comparação com uma versão anterior.

Antes de publicar um app atualizado, faça o seguinte:

  1. Carregue a versão do app que você está prestes a publicar no APK Analyzer.
  2. No canto superior direito do APK Analyzer, clique em Compare with previous APK....
  3. Na caixa de diálogo de seleção, encontre o artefato que foi publicado pela última vez para seus usuários e clique em OK.

    Uma caixa de diálogo semelhante à da Figura 11 aparece para ajudar a avaliar o impacto que a atualização pode ter sobre os usuários.

A Figura 11 mostra a diferença entre os builds de depuração e de lançamento de um app específico. Diferentes opções estão em uso entre esses tipos de build, que alteram as entidades de maneira diferente.

Figura 11. A diferença entre um APK de depuração e um de lançamento.