Como otimizar as hierarquias de layout

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

É um erro comum achar que o uso das estruturas básicas de layout leva a layouts mais eficientes. No entanto, cada widget e layout que você adicionar ao seu aplicativo exigirá inicialização, layout e desenho. Por exemplo, o uso de instâncias aninhadas de LinearLayout pode levar a uma hierarquia de visualização excessivamente profunda. Além disso, aninhar várias instâncias de LinearLayout que usam o parâmetro layout_weight pode ser especialmente dispendioso, porque cada filho precisa ser medido duas vezes. Isso é particularmente importante quando o layout é inflado repetidamente, como quando utilizado em uma ListView ou GridView.

Nesta lição, você aprenderá a usar o Hierarchy Viewer e o Lint para analisar e otimizar seu layout.

Inspecionar o layout

As Ferramentas do SDK do Android incluem uma ferramenta chamada Hierarchy Viewer, que permite analisar seu layout enquanto seu aplicativo está em execução. O uso dessa ferramenta ajuda a descobrir os gargalos no desempenho do layout.

O Hierarchy Viewer permite que você selecione processos em execução em um dispositivo ou emulador conectado e, em seguida, exiba a árvore de layout. Os semáforos em cada bloco representam o desempenho de medida, layout e desenho, ajudando você a identificar possíveis problemas.

Por exemplo, a figura 1 mostra um layout que é usado como item em uma ListView. Esse layout mostra uma pequena imagem de bitmap à esquerda e dois itens de texto empilhados à direita. É especialmente importante que os layouts que serão inflados várias vezes, como este, sejam otimizados, porque os benefícios para o desempenho serão muitos.

Figura 1. Layout conceitual para um item em uma ListView.

O Hierarchy Viewer mostra uma lista de dispositivos disponíveis e componentes em execução. Escolha seu componente na guia Windows e clique em Hierarchy Viewer para ver a hierarquia de layout do componente selecionado. Por exemplo, a figura 2 mostra o layout do item de lista ilustrado pela figura 1.

Figura 2. Hierarquia do layout da figura 1, que usa instâncias aninhadas de LinearLayout.

Revisar seu layout

Como o desempenho do layout acima se torna lento devido a um LinearLayout aninhado, você pode melhorar o desempenho nivelando o layout (ou seja, torne o layout raso e amplo, em vez de estreito e profundo). Um RelativeLayout como nó raiz permite esses layouts. Assim, quando o design é convertido para usar RelativeLayout, o layout se torna uma hierarquia de dois níveis. A inspeção do novo layout terá esta aparência:

Figura 4. Hierarquia do layout na figura 1, usando RelativeLayout.

Os benefícios, por menores que pareçam, são multiplicados várias vezes, porque esse layout é usado para cada item de uma lista.

A maior parte da diferença se deve ao uso de layout_weight no design LinearLayout, o que pode diminuir a velocidade da medição. É apenas um exemplo de como cada layout tem usos apropriados, e você precisa considerar cuidadosamente se é necessário usar o peso do layout.

Em alguns layouts complexos, o sistema pode perder tempo medindo o mesmo elemento da IU mais de uma vez. Esse fenômeno é chamado de dupla tributação. Para mais informações sobre a dupla tributação e como evitá-la, consulte Hierarquias de desempenho e visualização.

Usar Lint

É sempre uma boa prática executar a ferramenta lint nos arquivos de layout para procurar possíveis otimizações de hierarquia de visualização. O Lint substituiu a ferramenta Layoutopt, tendo uma funcionalidade muito maior. Alguns exemplos de regras lint são:

  • Usar drawables compostos: um LinearLayout que contém um ImageView e um TextView pode ser processado com mais eficiência como um drawable composto.
  • Mesclar frame raiz: se um FrameLayout for a raiz de um layout e não fornecer plano de fundo ou preenchimento, ele poderá ser substituído por uma tag "merge", que é um pouco mais eficiente.
  • Folha inútil: um layout que não tem filhos ou plano de fundo pode, com frequência, ser removido (por ser invisível) para uma hierarquia de layout mais simples e eficiente.
  • Pai inútil: um layout com filhos sem irmãos, que não seja um ScrollView ou um layout raiz e não tenha plano de fundo pode ser removido e ter os filhos movidos diretamente para o pai, visando uma hierarquia de layout mais plana e eficiente.
  • Layouts profundos: layouts com excesso de aninhamento prejudicam o desempenho. Considere o uso de layouts mais planos, como RelativeLayout ou GridLayout, para melhorar o desempenho. A profundidade máxima padrão é 10.

Outra vantagem do Lint é que ele é integrado ao Android Studio. O Lint é executado automaticamente sempre que você compila seu programa. Com o Android Studio, você pode executar inspeções de lint para uma variável de compilação específica ou para todas elas.

Você também pode gerenciar perfis de inspeção e configurar inspeções no Android Studio com a opção File > Settings > Project Settings. A página "Inspection Configuration" é exibida com as inspeções compatíveis.

Figura 5. Configuração de inspeção.

O Lint corrige automaticamente alguns problemas, oferece sugestões para outros e pula diretamente para o código ofensivo para análise.

Para mais informações relacionadas a esta lição, consulte Layouts XML e Recursos de layout.