Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Analisar sua compilação com o APK Analyzer

O Android Studio inclui um APK Analyzer que informações imediatas sobre a composição do APK 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. Ele também está disponível 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 APK, como os arquivos de recursos DEX e Android.
  • Entender a composição dos arquivos DEX.
  • Ver rapidamente as versões finais dos arquivos no APK, como o AndroidManifest.xml.
  • Fazer uma comparação lado a lado de dois APKs.

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

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

Importante: ao analisar as compilações de depuração, use o APK criado selecionando Build > Build APK ou nos comandos do Gradle. Clicar em Run na barra de ferramentas resulta em APKs ativados para o Instant Run. Não é recomendado usar esses APKs com o APK Analyzer para tarefas de otimização, porque são voltados apenas para desenvolvimento e carregam a maioria dos recursos de forma dinâmica. Você pode identificar um APK do Instant Run pela presença de um arquivo instant-run.zip incorporado no APK.

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 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 APK. Esse arquivo de manifesto normalmente é um arquivo binário dentro do APK, mas quando selecionado no APK Analyzer, o formato XML dessa entidade é reconstruído e apresentado. Esse visualizador permite que você entenda as alterações que podem ter sido feitas no aplicativo durante a compilação. Por exemplo, você pode ver como o arquivo AndroidManifest.xml de uma biblioteca da qual seu aplicativo 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 arquivos DEX do APK Analyzer oferece acesso imediato às informações subjacentes dos arquivos DEX do seu aplicativo. 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 aplicativo 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ê compacta uma dependência no APK, 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 do Proguard também podem alterar 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:

  1. Na lista File, selecione o arquivo classes.dex.
  2. Na lista Class, navegue até uma classe e selecione-a.
  3. Expanda 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. Eles ficam destacados em cinza até que você carregue um conjunto de arquivos de mapeamento do Proguard que adicionam 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). Os arquivos de mapeamento do Proguard se aplicam aos APKs que foram criados com o Proguard ativado e precisam ser da mesma versão em que o APK foi produzido.

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 estão normalmente em project/app/build/outputs/mappings/release/. O seletor de arquivos usará por padrão 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 procura nomes de arquivo 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 Proguard. Por exemplo, é possível restaurar nomes de nó ofuscados como a, b, c para 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 Proguard durante a redução. Os nós restaurados são mostrados riscados.

    Para mais informações sobre como usar o Proguard para ofuscar e minimizar seu código, consulte Reduzir código e recursos.

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 que mostra regras do Proguard que podem ser copiadas e coladas para o 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: decompila 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 de DEX para o método init

Find usages: mostra as outras partes do código DEX que tem referências à classe ou ao método selecionado (figura 7). Se você tiver seeds.txt carregado, os nós exibidos em negrito indicarão que a configuração do Proguard impede a remoção deles 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 do Proguard (figura 8). Para mais informações, consulte Personalizar qual código manter.

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 alteram as entidades finais em um arquivo do APK. 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 do 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 do APK

O APK Analyzer pode comparar o tamanho das entidades em dois arquivos do APK diferentes. 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 APK atualizado, faça o seguinte:

  1. Carregue a versão do APK que você está prestes a publicar no APK Analyzer.
  2. No canto superior direito do APK Analyzer, clique em Compare With.
  3. Na caixa de diálogo de seleção, encontre o APK 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 as compilações de depuração e lançamento de um aplicativo específico. Diferentes opções estão em uso entre esses tipos de compilação, que alteram as entidades subjacentes de maneira diferente.

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