O X do Xamarin Forms — Boas práticas e melhorias de perfomance

Thiago Bertuzzi
8 min readSep 6, 2019

Fala Galera,

tudo beleza?

Perfomance é a parte que mais você deveria se preocupar em seu App.

Um aplicativo que fica travando, que congela ou é extremamente lento , tem grandes chances de ficar negativado e ate ser retirado das lojas.

Quando estamos criando nosso App, existem boas praticas e dicas que podem nos ajudar a ter um app melhor e muito mais performático.

As dicas que vou apresentar abaixo são da minha pouca experiencia (4 anos, sim eu considero pouca :) ) com Xamarin.Forms , alem de ter aprendido ha muito tempo atras com esse artigo do Kent Boogaart : Jason Smith’s Xamarin Forms Performance Tips .

Recentemente eu fiz uma apresentação em um de nossos meetups , do .net SP ( Que inclusive se você não conhece se inscreva, pois sempre tem eventos com temas incríveis acontecendo em SP ) sobre "Boas Práticas com Xamarin Forms" dando algumas dicas.

Então hoje vou transformar essa apresentação como um artigo para ajudar vocês a melhorar um pouco seu app :).

Bora?

Compartilho as Interfaces mas não compartilho as Guidelines

Deixa eu dar uma dica logo de cara: Não é porque você trabalha com Xamarin.Forms, que não precisa respeitar as Guidelines das plataformas.

Cada plataforma (Android, iOS , etc) tem suas próprias regras, sejam essas envolvendo telas, tabbars, navegações e etc.

Por exemplo, o Android possui o botão voltar, o iOS não. Respeitar as guidelines, pode evitar do seu app ser reprovado na loja ,alem de facilitar a usabilidade dos utilizadores :) .

Guidelines da Apple.

Guidelines do Android.

Abrindo nosso APP e Utilizando o mesmo

Entre outras, tem duas coisas que podem dificultar a aceitação e uso do seu APP : Um Aplicativo Grande para baixar e um Aplicativo que demora muito para abrir.

Existem algumas dicas que podem resolver esse problema :

· Mantenha o mínimo de dependências possíveis : Em resumo ,se não vai usar não referencie. Se você não precisa daquele pacote/projeto, não tem porque utilizar em seu App. Parece uma dica besta, mas muita gente esquece das coisas referenciadas e deixa la tomando espaço desnecessário ou ate causando conflitos com outros componentes.

· Se precisar baixar muitos dados, utilize o background : Existem apps que precisam obter muitos dados na inicialização ( as vezes só Deus sabe o porque hahaha) , para evitar uma inicialização lenta você pode baixar esses dados no background, assim evitando a famosa tela eterna de loading.

· Lazy Loading, carregue o que precisa sob demanda : juntando a dica anterior, eu pergunto : Você precisa carregar tudo isso mesmo na inicialização? Muitos aplicativos podem carregar dados sob demanda, ou quando navegamos para outra tela ou quando estamos executando outras tarefas.

· Não espere dados carregarem para você atualizar sua tela, ninguém gosta de ver uma tela congelada: Você curte utilizar um app que parece que vai aparecer a mensagem do Windows Não Respondendo? Pois é o usuário também não. Se precisa carregar dados exiba um "loading" e por favor , SEMPRE UTILIZE ASYNC/AWAIT para evitar bloquear a main thread.

Estou finalizando um artigo só de async/await , logo deve estar no ar.

· Utilize só os Plugins e Controles de terceiro se necessário ;) : Vocês que acompanham meu Medium, sabe o quanto gosto de escrever, falar e construir Plugins/Controles. Mas por favor, utilizem com moderação. Existem implementações que você mesmo pode fazer ou em muitos casos você não precise lotar a sua aplicação de plugins e controles de terceiro. Lembre-se da primeira dica : Vamos manter o minimo de referencias possíveis.

Uma dica a mais para quem utiliza plugins e controles : Sempre utilize opensource. É bom saber o que esta sendo feito para evitar códigos maliciosos, alem disso se tiver algum bug o dono abandonar o mesmo, você pode dar manutenção.

· Utilize o Linker, sempre… : Meu amigo, por favor habilite sempre o linker e faça isso o mais cedo possível. De preferencia deixe a mesma configuração que você utiliza de Release para o Linker em Debug. Isso vai fazer muita diferença no tamanho final do seu app e quanto mais cedo habilitar menos chances de não entender quais referencias o Linker esta removendo erroneamente.

Existe um video muito legal do pessoal do Monkey Nights da Maratona Xamarin online demonstrando ao vivo como configurar o Linker . Você pode clicar aqui para ver.

· MessagingCenter só em último caso, para casos de BackGround, ou se ameaçarem sua família: Falar de MessagingCenter é complicado, daria um artigo só dele.A forma com que ele trabalha pode gerar alguns problemas em seu app ou ate uma demora de tempo na execução de algumas funções. Como sugestão , se possível , um framework que resolva isso (O Prism por exemplo com o conceito de Event Aggregator).

Event Aggregator do Prism

Interface , Xaml , Xaml e Xaml (by Balmer) :

Acredite ou não , grande parte do problema de perfomance do seu App pode estar na tela.

Muitas vezes ficamos presos ao Backend e esquecemos que uma implementação ruim na tela pode ser tão prejudicial quando uma Thread mal executada.

Dito isso, vou passar algumas boas praticas/dicas para melhorar a perfomance de suas telas :

· Habilite Layout Compression nos layouts que aceitam: um simples comando como CompressedLayout.IsHeadless=”true” habilita a compressão de layout. O Beneficio dessa propriedade habilitada depende, claro , da complexidade (quantidade de controles) da sua tela. Mas no geral sempre melhora significativamente.

Mas verifique antes.. Nas palavras da própria documentação da Microsoft :

Uma vez que a compactação de layout remove um layout da árvore visual, não é adequado para layouts que têm uma aparência visual, ou que obtêm entrada por toque. Portanto, layouts que defina VisualElement propriedades (como BackgroundColor , IsVisible , Rotation , Scale , TranslationX e TranslationY ou que aceitar gestos, não são candidatos para o layout compactação. No entanto, a habilitação da compactação de layout em um layout que define as propriedades de aparência visual, ou que aceita a gestos, não resultará em um erro de compilação ou tempo de execução. Em vez disso, compactação de layout será aplicada e as propriedades de aparência visual e reconhecimento de gesto, falharão silenciosamente.

· Não utilize bindings desnecessários .. Title por exemplo, pra que ? : A questão é simples , se aquele valor da tela não vai mudar ou precisa ser recuperado por algum motivo, pra que fazer binding? Quantos menos bindings na tela melhor :) .

· Não utilizar os valores Default, por exemplo se é grid.row = 0 pra que declarar ? Esse é um ponto interessante, se o valor é default pra que eu vou declrar novamente? Evite recriação da tela , não vai precisar mudar o valor default da propriedade , não utilize.

· Utilize Dispose sempre que possível, Mobile não tem memória infinita : Eu brinco sempre dizendo que o Desenvolvedor web quando vai para mobile esta acostumado que o IIS tem memória infinita, só que com smartphone não. A maioria dos aparelhos tem menos memória que muito computador fraco, ou seja, memória é um recurso precioso. Se for possível sempre utilize Dispose, a maioria das classes implementa o IDisposable (Ou seja podemos utilizar o Using ) , caso não faça isso manualmente.

· Se assinar um Evento, então devemos "desassinar" (unsubscribe) : Isso é um problema que acontece muito. Sempre que você assinar um Evento, após não precisar mais dele retire da memória. Eventos muitas vezes são os maiores consumidores de perfomance do seu APP.

Se você utiliza um framework como o Prism, sugiro a implementação do IDestructible.

· Não utilize StackLayout para um controle apenas : Parece besteira , mas é fato. Se sua tela tem apenas um controle, ou um ListView por exemplo, não utilize um Stacklayout. Coloque apenas o controle na tela.

Não faça isso

· Reduza o carregamento de controles , nada de StackLayout dentro de outro StackLayout : Existe uma queda de perfomance absurda nesse caso, o famoso StackLayout dentro de StackLayout. Muito gente faz isso e fica mudando a VerticalOptions e HorizontalOptions do StackLayout, para ajustar os controles na tela. Se você precisa alinhar diversos controles na tela existem soluções melhores (vide abaixo).

· Utilize mais Grids/FlexLayout e menos RelativeLayout : Esta é a solução para melhorar a perfomance e montar sua tela. Com o Grid e o FlexLayout você consegue alinhar os controles e coloca-los nas posições que deseja , muito mais performático que utilizando RelativeLayout.

Parece curioso, mas existe também o cenário se apenas um StackLayout é suficiente, não utilize o Grid :P .

Xamarin.Forms possui diversos layouts, é bom estudar cada um para saber quando utilizar.

· Não coloque ListView dentro de uma ScrollView : Na idade média, colocar um ListView dentro de um ScrollView faria você ser jogado na fogueira. Alem de não ser performático , você pode ter problemas com os 2 scrolls funcionando juntos. Nesse caso apenas o ListView vai resolver o que você precisa :).

· Não utilize vários Label's, geralmente um Span com FormattedText resolve seu problema: Este também é um erro Comum, se você precisa juntar alguns textos ou emendar diversos Labels , é muito melhor e menos custoso utilizar o FormattedText.

Existem mais exemplos de Xaml no artigo : Mais 5 Dicas para o XAML

· Utilize Estratégia de Cache no Listview, RecycleElement por padrão : Muitos dos problemas que você pode ter em um ListView podem ser resolvidos alterando a "ListViewCachingStrategy". Geralmente o melhor é utilizar RecycleElement ( Que não é o padrão, não sei o pq /o\ ) . É sempre bom testar as opções de Cache e ver a que melhor atende sua necessidade.

· Utilize HasUnevenRows sempre que precisar de linhas com tamanhos diferentes. Não tem muito que explicar nesse caso, mas se precisa de linhas com tamanhos diferentes , sempre utilize HasUnevenRows="true";

· Não utilize TableView no Lugar de ListView, TableView é mais para Layout parecido com Settings , por exemplo : A regra é simples. Quando precisar de Listas utilize sempre o ListView. Se precisar montar uma tela fixa com diversos controles, como a tela de configuração do iOS por exemplo, ai utilize o TableView.

Muitas dessas dicas são simples, mas podem ajudar quem esta começando ou ate quem ja desenvolve com Xamarin.Forms há algum tempo.

São coisas simples, mas que podem fazer a diferença no sucesso ou fracasso do seu app :D.

Existem outras dicas como a Boost Performance with Compiled Bindings in Xamarin.Forms , publicado essa semana no blog oficial da Xamarin.

Quer ver outros artigos sobre Xamarin ? Clique aqui.

Espero ter ajudado!

Aquele abraço!

--

--

Thiago Bertuzzi

Microsoft MVP,Gamer, Desenvolvedor e apaixonado por tecnologia!