Habilitando Linker em projetos Xamarin.Forms com Prism | iMasters
Uma das perguntas que mais ouço nas minhas palestras a respeito de Xamarin, é sobre o impacto dele no tamanho final do app. Muita vezes um "Hello World" começa com 15 mb e isso assusta muita gente. E tá certo, todas as lojas de apps te lembram da importância de um app pequeno para que você não perca downloads de usuários na 3G/4G.
Pensando em evitar esse tamanho excessivo, a Xamarin utiliza o Linker, para deixar o seu app do menor tamanho possível. O problema é que nem sempre ativar o Linker é tão fácil, principalmente quando se usa bibliotecas de terceiros, como o Prism.
Por padrão, o Linker vem desabilitado no modo Debug. E é por isso que o seu "Hello World" tem todo esse tamanho, você está olhando para uma versão que não deveria ser utilizada para distribuição na loja.
No Android, as opções do Linker ficam nas propriedades do projeto, em Android Build:
Don't Link (None no Visual Studio): Não executa o Linker e não diminui o seu app. Nunca utilize essa opção em produção.
Link SDK Assemblies (Sdk Assemblies Only): Remove apenas códigos não utilizados do Xamarin.Android e Xamarin.iOS, não remove nada de códigos escritos por você nem de pacotes NuGet de terceiros.
Link All Assemblies (Sdk and User Assemblies): Remove todo código não utilizado, inclusive seu e de pacotes NuGet de terceiros. Essa opção gera o menor binário possível.
O segundo item é o que normalmente afasta as pessoas de utilizar o Linker para gerar versões de produção, que deveriam ir para a loja. Mas é claro que existe solução para isso. É possível instrumentar o Linker para manter códigos que ele tenha removido equivocadamente, isso está documentado aqui e funciona muito bem para códigos que você tenha feito, mas para bibliotecas externas, é um pouco mais chato, pois você precisa descobrir quais classes foram removidas para adicioná-las às regras de exceção, conforme descritas aqui.
Recentemente eu ativei o modo "Link All" para Android e iOS nos meus apps Xamarin.Forms utilizando Prism. O Prism utiliza reflection em algumas partes do código, o que tornou essa tarefa trabalhosa de fazer, pois envolveu uma dinâmica "gato e rato" para descobrir todas as classes que o Linker removeu equivocadamente. Para facilitar a vida de quem tiver que fazer isso, estou compartilhando o arquivo linker.xml final que precisei adicionar aos meus projetos Android e iOS para que tudo funcionasse.
Lembre-se de seguir as instruções dessa página para ativar o Build Action correto deste arquivo no seu projeto. Só adicionar o arquivo no projeto não vai executar as regras do arquivo.
Este arquivo não contém todo o meu linker.xml, eu estou compartilhando apenas as partes que se referem ao Prism, que serão reusáveis para outros projetos. Você ainda pode ter que adicionar regras para evitar que o seu código seja removido.