Tirar o máximo do analisador APK

>
Wojtek Kaliciński

Follow

23 de Novembro, 2016 – 6 min. lido

Uma das minhas adições recentes favoritas ao Android Studio é o APK Analyzer, que você pode encontrar no menu superior em Build → Analyze APK.

>

Pro-tip: você também pode arrastar e soltar arquivos APK no editor para abri-los

APK Analyzer permite que você abra e inspecione o conteúdo de qualquer arquivo APK que você tenha no seu computador, seja construído a partir do seu projeto Android Studio local ou adquirido do seu servidor de construção ou outro repositório de artefatos. Ele não precisa ser construído a partir de qualquer projeto que você tenha aberto no Android Studio e você não precisa do código fonte para aquele APK.

Note: APK Analyzer funciona melhor com builds de lançamento. Se você precisa analisar um build debug da sua aplicação, certifique-se de que você está usando um APK que não é instrumentado para execução instantânea. Para obtê-lo, você pode usar o Build → Build APKcommand. Você pode ver se você abriu um APK instrumentado para Execução Instantânea verificando a presença de um arquivo instant-run.zip dentro do arquivo.

Usar o analisador APK é uma ótima maneira de dar uma olhada nos arquivos APK e aprender sobre sua estrutura, verificar o conteúdo do arquivo antes de liberar ou depurar alguns problemas comuns, incluindo tamanho do APK e problemas DEX.

O analisador APK pode lhe dar muitas informações úteis e acionáveis sobre o tamanho da aplicação. No topo da tela, você pode ver o Raw File Size que é apenas o tamanho do APK no disco. O Tamanho do Download mostra uma estimativa de quantos dados serão usados para baixar seu aplicativo levando em conta a compressão aplicada pela Play Store.

A lista de arquivos e pastas é ordenada por tamanho total em ordem decrescente. Isso faz com que seja ótimo para identificar o fruto de baixa pendência da otimização do tamanho do APK. Cada vez que você detalha em uma pasta, você pode ver os recursos e outras entidades que ocupam o maior espaço no seu APK.

Recursos ordenados em ordem decrescente de acordo com o tamanho

Neste exemplo, ao examinar um APK para possíveis reduções de tamanho, pude notar imediatamente que uma animação PNG de 3 quadros é a única coisa maior em nossos recursos sorteáveis, pesando em 1.5MB, e isso é apenas para a densidade xxhdpi!

Desde que essas imagens parecem ser candidatos perfeitos para armazenar como vetores, nós encontramos os arquivos fonte para a arte e os importamos como VectorDrawables usando o novo suporte PSD na ferramenta de importação de Vector Asset no Android Studio 2.2.

Ao passar pelo mesmo processo para as outras animações restantes (instruction_touch_*.png) e remover esses arquivos PNG em todas as densidades, nós conseguimos salvar mais de 5MB. Para manter a compatibilidade com versões anteriores, usamos VectorDrawableCompat da biblioteca de suporte.

Olhando para outras pastas de recursos, foi fácil identificar alguns arquivos WAV não compactados que poderiam ser convertidos para OGG, o que significou ainda mais economia sem tocar em uma linha de código.

Navegando outras pastas no APK

Próximo na lista de coisas a verificar foi a pasta lib/, que contém bibliotecas nativas para as três ABIs que suportamos.

Foi tomada a decisão de usar o suporte a partições do APK na nossa compilação Gradle para criar versões separadas do aplicativo para cada ABI.

Eu rapidamente olhei sobre o AndroidManifest.xml a seguir e notei que <aplicação> está faltando o atributo android:extractNativeLibs. Definindo este atributo como falso pode poupar algum espaço no dispositivo, pois impede a cópia das bibliotecas nativas do APK para o sistema de ficheiros. O único requisito é que os arquivos estejam alinhados à página e armazenados sem compressão dentro do APK, que é suportado com o novo empacotador no plugin Android Gradle versão 2.2.0+.

O AndroidManifest.xml completo como visto no APK Analyzer

Após ter feito estas modificações, fiquei curioso em ver como a nova versão do app se compara com a anterior. Para fazer isso, eu verifiquei o fonte do git commit com o qual eu comecei, compilei o APK e salvei em outra pasta. Depois usei a função Comparar com… para ver uma quebra de diferenças de tamanho entre os builds antigo e novo.

APK comparison – acesse através do botão no canto superior direito

Fizemos um grande progresso nos recursos e bibliotecas nativas, salvando um total de 17MB com muito poucas mudanças no aplicativo. Entretanto, posso ver que nosso tamanho do DEX regrediu, com as classes2.dex crescendo 400KB.

Debugging DEX issues

Neste caso, a diferença veio de atualizar nossas dependências para versões mais recentes e adicionar novas bibliotecas. Proguard e Multidex já estavam habilitados para nossos builds, então não há muito que possa ser feito sobre o tamanho do nosso DEX. Ainda assim, o analisador APK é uma ótima ferramenta para depurar qualquer problema com esta configuração, especialmente quando você está habilitando Multidex ou Proguard para seu projeto pela primeira vez.

Explorar o conteúdo das classes.dex

Quando você clica em qualquer arquivo DEX, você verá um resumo de quantas classes e métodos ele define, e quantas referências totais ele contém (são referências que contam contra o limite de 64K em um único arquivo DEX). Neste exemplo de screenshot, a aplicação está prestes a atingir o limite, o que significa que precisará do MultiDex para dividir as classes em ficheiros separados num futuro próximo.

Pode pesquisar nos pacotes para ver quais deles estão a usar todas as referências. Neste caso, podemos ver que a biblioteca de suporte e os serviços Google Play são as principais causas para esta situação:

Contas de referência por pacote

Após ter ativado o MultiDex e compilado sua aplicação, você notará uma segunda classe2.arquivo dex (e possivelmente classes3.dex, e assim por diante). A solução MultiDex no plugin gradle do Android calcula quais classes são necessárias para iniciar sua aplicação e as coloca no arquivo primário classes.dex, mas no raro caso em que não funciona e você obtém uma ClassNotFoundException, você pode usar o APK Analyzer para inspecionar os arquivos DEX, e então forçar as classes ausentes a serem colocadas no arquivo primário DEX.

Você encontrará problemas similares ao habilitar o Proguard e usar classes ou métodos por reflexão ou a partir de layouts XML. O APK Analyzer pode ajudá-lo a verificar se a configuração do seu Proguard está correcta, permitindo-lhe verificar facilmente se os métodos e classes que necessita estão presentes no APK e se estão a ser renomeados (ofuscados). Você também pode ter certeza de que as classes que você quer que desapareçam são realmente removidas, e não retomando sua preciosa contagem de métodos de referência.

Estamos curiosos para saber que outros usos você encontra para o APK Analyzer e que outras características você gostaria de ver integradas na ferramenta!

Deixe um comentário