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 compilação.
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. Disponível também
na linha de comando com
apkanalyzer
.
Com o APK Analyzer, você pode realizar as seguintes ações:
- Ver 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 perspectiva 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.
Ver informações de arquivo e tamanho
Os APKs são arquivos que seguem o formato de arquivo ZIP. O APK Analyzer exibe cada arquivo ou pasta como uma entidade com a funcionalidade de expansão disponível para navegar em pastas. A hierarquia das entidades espelha a estrutura dos arquivos e pastas do arquivo do APK.
O APK Analyzer mostra os valores de tamanho do arquivo bruto e tamanho do arquivo de download para cada entidade, conforme mostrado na Figura 1. A coluna Raw File Size representa o tamanho descompactado da entidade no disco, enquanto 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
Ver o AndroidManifest.xml
Se o seu projeto incluir vários arquivos AndroidManifest.xml
(como para
variações do produto) ou incluir 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 permite que você entenda as mudanças que podem ter sido
feitas no app durante o build. Por exemplo, você pode ver como o
arquivo AndroidManifest.xml
de uma biblioteca de que seu app depende foi mesclado
no arquivo AndroidManifest.xml
final.
Além disso, esse visualizador fornece alguns recursos de lint, e 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 na margem direita do arquivo de manifesto selecionado
Ver arquivos DEX
O visualizador de arquivo DEX do APK Analyzer dá acesso imediato às informações subjacentes nos arquivos DEX do 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 você usará multidex ou como remover dependências para ficar abaixo do limite de 64 mil arquivos DEX.
A Figura 3 ilustra um app de tamanho médio que está abaixo do limite de 64 mil arquivos DEX. Cada pacote, classe e método dentro do arquivo DEX tem contagens listadas nas colunas Defined Method 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 contados em relação ao limite de 64 mil arquivos 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. Quando você empacota uma dependência no app, os métodos definidos na dependência são adicionados às duas contagens de método. Além disso, a minificação e a redução de código também podem mudar consideravelmente o conteúdo de um arquivo DEX após o código-fonte ser compilado.
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.
Figura 4. Filtros de DEX definidos para exibir campos e
métodos para BuildConfig
.
Para usar os filtros para exibir 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.
- Expanda 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. Eles ficam
esmaecidos até que você carregue um conjunto de arquivos de mapeamento do ProGuard que adicionam uma funcionalidade
ao visualizador de DEX, como desofuscar nomes (mapping.txt
),
mostrar nós que foram removidos (usage.txt
) e indicar nós
que não podem ser removidos (seeds.txt
).
O arquivo de mapeamento do ProGuard importado precisa ser resultado do mesmo build que
produziu os arquivos DEX em que a redução de código foi ativada. Para saber mais, consulte
Reduzir, ofuscar e otimizar o
app.
Figura 5. Carregar mapeamentos do ProGuard.
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 amapping.txt
,seeds.txt
eusage.txt
. Em seguida, o seletor de arquivos 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 namespara 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
emMyClass
,MainActivity
emyMethod()
.usage.txt
: ativa Show removed nodespara 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 seguintes opções que permitem ver o bytecode, encontrar usos e exibir 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 exibir o menu de contexto correspondente.
Show bytecode: descompila a classe, o método ou o campo selecionado e exibe a representação do bytecode smali (não o código Java) em uma caixa diálogo, da seguinte 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 (Figura 7).
Se seeds.txt
estiver carregado,
os nós exibidos 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 para evitar que determinado pacote, classe, método ou campo seja removido durante a fase de redução de código (Figura 8). Para ver 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
Ver entidades de código e recurso
Várias tarefas de compilação 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. É fácil visualizar a versão final dos arquivos com o APK Analyzer. Basta clicar na entidade, e uma visualização da entidade de texto ou imagem aparecerá abaixo, como mostrado na Figura 9.
Figura 9. Uma visualização do recurso de imagem final
O APK Analyzer também pode exibir vários arquivos de texto e binários.
Por exemplo, o visualizador de entidades resources.arsc
permite que você veja os
valores específicos da configuração, como traduções de idiomas, para um
recurso de string. Na Figura 10, você pode ver as traduções para cada recurso
de string.
Figura 10. Uma visualização de 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:
- 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.
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 subjacentes de maneira diferente.
Figura 11. A diferença entre um APK de depuração e um de lançamento.