Num post anterior aqui no blog eu comentei sobre a importância de deixar seu app com o menor tamanho possível e como fazer isso no Xamarin com o Linker. É sempre bom tirar quaisquer obstáculos que façam um usuário desistir de instalar o app, e um app muito grande traz 2 obstáculos: demora no download numa internet ruim (3G) e falta de espaço disponível no aparelho. Por isso é importante manter o Linker sempre habilitado no modo mais agressivo na hora de gerar o aplicativo para a loja. Mas se você já comparou os tamanhos de um app Xamarin.Forms com um app feito em Android Java deve ter visto que o app Xamarin.Forms já nasce muito grande, e isso é um problema. Agora a boa notícia é que é possível diminuir ainda mais o tamanho com a ajuda do Linker sem precisar mudar uma linha de código!
O Problema
Primeiro vamos entender, por que um aplicativo Xamarin.Forms Android ou Xamarin.Android já nasce tão grande? De quanto é esse aumento no tamanho do aplicativo final?
Eu recomendo que você entenda o problema porque ele revela algumas coisas sobre a plataforma Xamarin em geral, mas se quiser pular direto para a solução, clique aqui.
No Xamarin.Forms 2.5 um aplicativo vazio criado com o template do Visual Studio 2017 15.6.1, com o Linker na opção mais agressiva habilitada (Sdk and User Assemblies) gera um aplicativo com 17,2mb. Isso é bem maior do que eu gostaria para um aplicativo apenas com “Hello World”. De quem é a culpa desse tamanho todo?
Uma parte da culpa é do Mono. O Mono não vem instalado nos celulares Android, mas nossos apps Xamarin precisam dele, então a solução criada pela equipe da Xamarin foi embutir o mono na sua aplicação, e é claro que isso faz o app crescer um pouco.
Mas quando estamos falando de aplicativos Android a culpa não é toda dele, se você quer criar a experiência mais fluida, rica e natural possível para usuários Android, é bem comum que você queira utilizar os conceitos do Material Design do Google para ajudar nessa tarefa. O problema é que alguns desses recursos só foram lançados em versões mais novas do Android. Para que os usuários do seu app que estejam em versões antigas do Android não tenham a experiência prejudicada, o Google lançou as Android Support Libraries.
Android Support Libraries
As Support Libraries são implementações do próprio Google que tornam possível utilizar recursos novos em sistemas operacionais antigos, eles fazem isso implementando os componentes de forma retroativa. Isso significa que você pode ter componentes como Card Views, um conceito que nasceu com Material Design apenas em 2014 nos Androids 5.0+, rodando até em aparelhos com versões do Android 2.1. A graça é que você não precisa se preocupar com isso, pois o Google se preocupou por você.
Claro que como tudo na computação, existe um contra em utilizar essas bibliotecas. Quanto mais bibliotecas você usa, maior é o tamanho do seu app. O Google está sempre evoluindo e otimizando essas bibliotecas, inclusive retirando código morto e depreciado para garantir que a biblioteca tenha o tamanho mínimo necessário, mas inevitavelmente o seu app ficará maior por conta disso. A tentativa de solucionar isso no mundo Android é utilizar o Proguard, que inclusive pode ser usado no seu app Xamarin também.
Ok, mas qual a relação disso tudo com Xamarin? E por que o app Xamarin usando essas bibliotecas é tão maior comparado a um feito com Android puro?
Android Support Libraries no mundo Xamarin
Para garantir que pessoas desenvolvendo com Xamarin não fiquem de fora das maravilhas das Android Support Libraries, a equipe da Xamarin faz questão de criar bindings para que possamos utilizar todos os mesmos recursos nos aplicativos Xamarin.Android ou Xamarin.Forms, e elas estão todas disponíveis por NuGet.
Como um app Xamarin.Forms utiliza Material Design no Android, ele já traz algumas dessas bibliotecas como dependência. Mas isso não deveria ser um problema para o tamanho do app, já que estamos utilizando Linker no modo agressivo, que retiraria códigos não utilizados, semelhante ao que o Proguard faz no mundo Android. Exceto por um pequeno detalhe.
Há algumas semanas atrás eu compartilhei um post excelente do Jonathan Peppers, um engenheiro da equipe do Xamarin.Android, falando sobre performance. Sugiro fortemente dar uma lida no post, pois as informações compartilhadas por ele beneficiam aplicações Xamarin.Android tradicional ou Xamarin.Forms utilizando Android.
Nesse post uma coisa me chamou a atenção, ele comenta que o Linker não estava passando pelos bindings das Support Libraries, e que, por não retirar códigos não usados dessas bibliotecas, ele via um aumento significativo (algo em torno de 4mb) no tamanho final do app, mesmo com Linker habilitado. No app que citei no começo do post, 4mb representa quase 25%! Essas bibliotecas são usadas em quase todos os apps Android, então o impacto disso no ecossistema Xamarin é gigante!
Vendo isso, ele descobriu que era muito fácil habilitar o Linker nas Android Support Libraries e enviou um PR para o repositório. A ótima notícia é que o PR já foi aprovado, desde então tenho acompanhado ansiosamente pelo primeiro release stable das Android Support Libraries 27.0. Percebi que elas foram lançadas há 3 dias, então resolvi testar a diferença!
Diminuindo o tamanho do seu app
Agora que entendemos o motivo do tamanho do app e vimos que alguém já resolveu o problema, vamos experimentar a solução, afinal, ela não envolve NENHUMA alteração no seu código.
Basicamente a solução para isso é atualizar todas Android Support Libraries do seu projeto para versões 27+. É tão simples que chega a ser sem graça.
Alguns pontos importantes:
- Até a versão 2.3.3.180 do Xamarin.Forms era exigido que você tivesse as versões 23.3.0 das support libraries. Isso significa que você só pode atualizá-las se estiver em uma versão do Xamarin.Forms a partir da 2.3.3.193.
- As Android Support Libraries 27+ exigem que você compile seu aplicativo para Android 8.1+ (API 27). Você pode atualizar isso facilmente nas propriedades do seu projeto Android. Lembre-se que isso não significa que seu app não pode mais rodar em versões mais antigas do Android. A documentação explica isso perfeitamente.
- Algumas bibliotecas podem não funcionar corretamente ao atualizar as versões das Support Libraries. Rode todos os testes do seu app após a atualização e verifique se alguma biblioteca incompatível lançou atualização.
Comparando as duas versões:
- App Android feito com Xamarin.Forms com Android Support Libraries na versão 25, com Link All habilitado: 17,2mb
- App Android feito com Xamarin.Forms com Android Support Libraries na versão 27, com Link All habilitado: 11,6mb
Uma economia de 5,6mb, gerando um APK 32% menor! Tudo isso sem mudar sequer uma linha de código! Obrigado Jonathan Peppers ❤️.
Conclusão
Essa dica vale tanto para aplicativos Xamarin.Android quanto Xamarin.Forms. É claro que como este app está quase vazio o Linker deve ter retirado quase todas as APIs das Android Support Libraries, e a diferença no seu app vai depender da quantidade de recursos que você utiliza delas, mas em apps mais completos eu observei diferenças de 20% a 30% no tamanho final.
Eu não canso de dizer que todo aplicativo lançado na loja deve ter o Linker habilitado no modo mais agressivo, e essa diferença deixa mais clara sua importância. Lembre-se que várias pessoas já sentiram que essa diferença de tamanho pode ser a justificativa entre um usuário escolher o seu app e outro concorrente. Então dê a atenção necessária.
Imagem usada no post: Pexels
(Cross-post de: http://high5devs.com/2018/03/diminuindo-mais-ainda-o-tamanho-seu-aplicativo-xamarin-android/)
Mahmoud Ali
Desenvolvedor de Software na Lambda3, Microsoft MVP, amante de um bom café ☕️ e uma boa cerveja 🍺.