O post de hoje foi pesquisado e escrito por mim, mas com as técnicas descobertas e aplicadas pelo meu colega de serviço Cleber Henriques, líder técnico de Android no Banco Agiplan. Com essas técnicas ele conseguiu reduzir o tamanho do nosso apk em torno de 50% usando as técnicas abaixo descritas.
Tem pouco mais de um mês que estou trabalhando no Banco Agiplan. Somos um banco com um foco muito grande no mobile banking, uma vez que não possuímos agências físicas, sendo puramente um banco digital. Como um banco de varejo com um grande foco nas classes C e D, temos muitos correntistas com smartphones extremamente simples, sem grandes recursos e isso inclui armazenamento interno, que concorremos com o espaço consumido pelo Whatsapp, jogos e é claro, o Facebook, o devorador de armazenamento!
Conseguir gerar um apk pequeno, que não consuma muitos recursos do smartphone do nosso cliente, é uma garantia que teremos de que a) ele vai conseguir baixar o app rapidamente, talvez até com 3G e b) ele não vai desinstalar nosso app caso fique sem espaço no smartphone. Ele vai desinstalar apps que realmente ocupem um espaço grande.
Se o app que você trabalha também possui um público semelhante, usar as dicas abaixo podem ajudá-lo enormemente. Obviamente o ganho com estas técnicas pode variar para mais ou para menos, dependendo dos assets que você possui e que serão otimizados.
#1 – Otimize suas imagens com o ImageOptim
Na maior parte das vezes, o “inchaço” dos apps é devido à grande quantidade de imagens necessárias para se construir um app bonito e com boa usabilidade. Claro que isso não é uma regra, mas é o que geralmente acontece.
Assim como na web, focar seus esforços de otimização nas imagens é atacar 20% do app que geram 80% do tamanho de seu app, como no bom e velho princípio de Pareto.
Comece usando o ImageOptim, uma aplicação gratuita e de código aberto disponível para várias plataformas que diminui o tamanho de imagens JPG, PNG e GIF sem perda de qualidade usando diversas técnicas e aplicações diferentes (AdvPNG, AdvanceCOMP, OptiPNG, Pngcrush, JpegOptim, jpegtran, Gifsicle e PNGOUT).
Não tem bruxaria aqui, apenas matemática. Através do descarte de informações “inúteis” para o app como comentários e perfis de cor, consegue-se reduzir de 20-60% do tamanho original de imagens não otimizadas. Para quem já usou o recurso “Save for the Web” do Photoshop, sabe que os ganhos são bem expressivos, pois a mecânica aqui é a mesma.
O uso é muito simples: você apenas arrasta as imagens para dentro da janela do software e elas são otimizadas.
#2 – Converta suas imagens para WebP
Imagens que não possuam transparência podem ser convertidas para o formato WebP, que é um formato de imagem criado pelo Google que fornece imagens extremamente comprimidas sem perdas de qualidade aparente (assim como JPG), em um algoritmo de compressão muito superior ao JPG tradicional. Imagens WebP são suportadas a partir do Android 4.0 (API 14) sendo possível usar este formato para imagens com transparência se definir o SDK mínimo do seu projeto como 4.3 (API 18).
O Android Studio pode converter PNG, JPG, BMP ou imagens GIF estáticas para o formato WebP. Você pode converter imagens individuais ou pastas de imagens. Para converter uma imagem ou pasta de imagens, faça o seguinte:
- Clique com o botão direito do mouse em uma imagem ou pasta de imagens, e então escolha a opção “Convert to WebP”.
- A janela “Converting Images to WebP” vai se abrir, sendo que as configurações default dependem do SDK mínimo que estiver usando no app:
- Selecione tanto lossy quanto lossless, sendo que lossless (sem perdas de qualidade) está disponível apenas com SDK mínimo 18+. Se você selecionar lossy (com perdas), defina a qualidade da codificação e se deseja ou não ver um preview da imagem convertida antes de salvar.
Você também pode escolher pular a conversão de quaisquer imagens cuja versão final fique com tamanho maior da versão original, ou ainda imagens com transparência. Uma vez que o Android Studio somente permite criar imagens WebP transparentes se seu SDK mínimo for 18+, o checkbox “Skip images with transparency/alpha channel”é automaticamente selecionado se seu SDK mínimo for menor de 18. - Click OK para iniciar a conversão. Se você está convertendo mais de uma imagem, a conversão é um passo único que não pode ser desfeito, tenha isso em mente.
Se você selecionou a conversão lossless, a mesma acontecerá imediatamente. Suas imagens serão convertidas no lugar das originais. Se você selecionou lossy, continue lendo os passos abaixo. - Se você selecionou lossy, e escolheu ver o preview de cada imagem convertida antes de salvar, o Android Studio vai lhe mostrar cada imagem durante a conversão para que você inspecione o resultado. Caso contrário, ele fará a compressão de todas imagens automaticamente. Durante a etapa de preview, você pode ajustar a configuração de qualidade de cada imagem, como abaixo.
Na esquerda temos a imagem original, e na direita a comprimida, exibindo o tamanho dos arquivos (note um ganho de 68% nesse exemplo). Ajustando o slider você vê em tempo real as mudanças na imagem comprimida, sendo que na área central aparecem os pixels diferentes nelas.
#3 – Exporte seu apk por densidade de tela
Por padrão, o Android trabalha com as imagens para diferentes resoluções de tela tendo diferentes versões de cada imagem, certo? Isso é feito na pasta drawables, onde temos subpastas para densidades de tela como ldp, mdpi, hdpi, etc, conforme aumentam o tamanho e densidade das telas. Não é raro ter três versões de cada imagem o que, mesmo otimizadas, consome um grande espaço dentro do seu app.
Não seria muito legal se o seu app tivesse somente as imagens necessárias para o “tipo” de dispositivo no qual ele está sendo instalado? Assim, quem tem um Android low-end teria apenas pequenas imagens, enquanto que os usuários felizes de Androids high-end teriam apenas as imagens grandes.
Isso é possível de ser feito, usando o próprio Android Studio, mais especificamente usando o Gradle adequadamente. O Gradle é tão poderoso e versátil que não permite apenas criar apps com imagens diferentes, mas com código diferente também (usando ABI – Application Binary Interface)! Além disso, embora eu esteja mencionando aqui o recurso de exportar vários apks baseados em densidade de tela, você exportar vários apks baseado em variáveis de build também (mas isso fica para outro tutorial).
Para configurar seu build para múltiplos apks, adicione um bloco ‘splits’ no seu arquivo build.gradle a nível de módulo. Dentro do bloco ‘splits’, forneça um bloco ‘density’ que especifique como o Gradle deve gerar APKs por densidade. No seu bloco density, forneça uma lista de densidades de tela desejadas e tamanhos de tela compatíveis.
A lista de tamanhos de tela compatíveis deve somente ser usada se você precisa de elementos <compatible-screens> no manifesto de cada APK.
As opções seguintes do Gradle são usadas para configurar múltiplos APKs baseados em densidade de tela:
- enable: se true, Gradle gera múltiplos APKs baseados nas densidades de tela que você definir. O valor default é false.
- exclude/include: uma lista de densidades separadas por vírgula que o Gradle deve ignorar ou adicionar na geração de múltiplos APKs (serve para excluir as densidades que seu app não suporta).
- reset(): limpa a lista default de densidades de tela. Use somente em conjunto com o elemento include. O exemplo a seguir define a lista de densidades para somente ldpi e xxhdpi chamando reset() para limpar a lista e depois usando include.
1 2 3 4 |
reset() // limpa a lista default de densidades. include "ldpi", "xxhdpi" // especifica duas densidades que queremos gerar apks. |
- compatibleScreens: especifica uma lista de tamanhos de tela compatíveis separados por vírgula, injetando nós <compatible-screens> no manifesto de cada APK. Esta configuração fornece um jeito conveniente de gerenciar tanto densidade de tela quanto tamanho na mesma seção. Entretanto, tenha em mente que usar <compatible-screens> pode limitar os tipos de dispositivos nos quais o seu app irá funcionar.
Para garantir o máximo de compatibilidade, o Gradle sempre irá gerar um APK universal, mais “inchado”, que contém todos os recursos, independente de densidade, que servirá de fallback para os dispositivos que não se encaixem nos padrões estabelecidos. Esta versão universal deve ser publicada juntamente com as demais.
O exemplo seguinte gera um APK separado para cada densidade listada, exceto ldpi, xxhdpi, e xxxhdpi. Isto é feito usando exclude para remover três densidades da lista default.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
android { ... splits { // configura múltiplos apks baseados na densidade de tela density { // habilita esta configuração. enable true // especifica a lista de densidades de tela que devem ser ignoradas. exclude "ldpi", "xxhdpi", "xxxhdpi" // especifica a lista de telas compatíveis que devem ser incluídas no manifesto. compatibleScreens 'small', 'normal', 'large', 'xlarge' } } } |
Para mais detalhes de como distribuir o seu app para tipos específicos de telas e dispositivos, consulte este artigo.
Uma vez que você configure o seu build.gradle a nível de módulo para compilar múltiplos APKs, clique em Build > Build APK para compilar todos os apks para o módulo selecionado no painel Project. Para mais informações, consulte a documentação oficial.
E aí, o que achou do artigo de hoje? Conseguiu alguma economia no seu app? Coloque outras técnicas que você conhece nos comentários!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.