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.
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.
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.
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.
Para usar os filtros para mostrar todos os métodos e campos dentro de uma classe, faça o seguinte:
- Na lista File, selecione o arquivo
classes.dex
. - Na lista Class, navegue até uma classe e selecione-a.
- Abra a classe selecionada.
- Ative ou desative Show fields para mostrar ou ocultar os campos de classe.
- Ative ou desative Show methods para mostrar ou ocultar os métodos de classe.
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étodoprintln()
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.
Para carregar os arquivos de mapeamento do ProGuard, faça o seguinte:
- Clique em Load ProGuard Mappings....
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
eusage.txt
. Em seguida, ele verifica nomes de arquivos que contenham o textomapping
,usage
ouseeds
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 comoa
,b
,c
emMyClass
,MainActivity
emyMethod()
.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:
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:
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.
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.
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.
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:
- Carregue a versão do app que você está prestes a publicar no APK Analyzer.
- No canto superior direito do APK Analyzer, clique em Compare with previous APK....
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.