O Jetpack Compose acelera o desenvolvimento da IU e torna os engenheiros Android mais produtivos. No entanto, o acréscimo de uma nova ferramenta a um projeto requer certa consideração, porque pode afetar o APK e o desempenho de compilação e em tempo de execução.
Tempos de compilação e tamanho do APK
Nesta seção, comparamos como dois apps diferentes foram afetados quando adicionados ou migrados para o Jetpack Compose:
- O Tivi migrou totalmente para o Compose, removendo as bibliotecas AppCompat e Material Design Components.
- O Sunflower
(ramificação de
compose_recyclerview
) adiciona o Compose usando-o somente para itens de umaRecyclerView
. Todas as outras dependências continuam as mesmas.
Tamanho do APK
O acréscimo de bibliotecas a um projeto afeta o tamanho do APK. Vamos ver como o Compose afeta o tamanho dos projetos mencionados acima. Os resultados a seguir são para o APK de versão reduzida de cada projeto com a redução de recursos e código ativada, usando o modo R8 completo e medindo com o APK Analyzer.
O Tivi teve uma redução de 46% no tamanho do APK, passando de 4,49 MB para 2,39 MB. Ele também teve uma redução de 17% na contagem de métodos após a migração completa para o Compose. As linhas de código XML diminuíram 76%.
O tamanho do APK do Sunflower aumentou 575 KB, passando de 2.407 KB para 2.982 KB, quando o Compose foi adicionado ao projeto. Como o Compose raramente é usado nessa ramificação do Sunflower, o projeto não aproveita os benefícios do tamanho exclusivo do APK do Compose, como a remoção da dependência do AppCompat do projeto.
Tempo de compilação
Usando os mesmos projetos, vamos medir como o Compose afeta o desempenho de compilação.
Essa regra considera o tempo de compilação de depuração, que é o tempo mais importante para você durante o desenvolvimento.
O tempo de compilação do Tivi antes da migração para o Compose era de 108,71 segundos. Após a migração completa para o Compose, o tempo médio de build caiu para 76,96 segundos. Uma redução de 29% no tempo de build. Essa redução no tempo foi muito influenciada pela possibilidade de remover a vinculação de dados e o Epoxy do projeto, que usa processadores de anotações kapt, e pelo fato de Hilt ser mais rápido no AGP 7.0.
No entanto, o Sunflower teve um aumento de 7,6% no tempo médio de compilação, passando de 11,57 para 12,45 segundos.
Considerações finais
Ao começar a adotar o Compose no seu app, você verá um aumento no tamanho do APK e no tempo de compilação, que diminuirá e ultrapassará a métrica original depois que o projeto for totalmente migrado para o Compose.
Desempenho em tempo de execução
Esta seção aborda tópicos relacionados ao desempenho em tempo de execução no Jetpack Compose para que você entenda como o Jetpack Compose pode ser comparado ao desempenho do sistema de visualização e como é possível medi-lo.
Recomposições inteligentes
Quando partes da IU são inválidas, o Compose faz o melhor possível para recompor apenas aquelas que precisam ser atualizadas. Saiba mais sobre este tópico no guia Ciclo de vida de funções que podem ser compostas.
Comparação com o sistema de visualização
Devido ao design e às lições aprendidas com o sistema de visualização, o Jetpack Compose tem um desempenho melhor.
Tudo estende a visualização
Cada View
que é mostrada na tela, como TextView
, Button
ou
ImageView
, exige alocações de memória, rastreamento explícito de estado e vários
callbacks para oferecer suporte a todos os casos de uso. Além disso, o proprietário da View
personalizada precisa
implementar uma lógica explícita a fim de evitar um novo desenho quando ele não for necessário, por
exemplo, para processamento de dados repetitivos.
O Jetpack Compose resolve isso de algumas maneiras. O Compose não tem objetos
atualizáveis explícitos para mostrar visualizações. Os elementos de IU são simples funções
combináveis, cujas informações são gravadas na composição de forma repetida.
Isso ajuda a reduzir o rastreamento de estado explícito, as alocações de memória e os callbacks
apenas para os elementos combináveis que precisam desses recursos, em vez de fazer a exigência deles para
todas as extensões de determinado tipo de View
.
Além disso, o Compose fornece recomposições inteligentes prontas para uso, repetindo o resultado exibido anteriormente, se nenhuma mudança for necessária.
Várias transmissões de layout
ViewGroups tradicionais têm muita expressividade nas APIs de medida e layout, o que facilita a criação de várias transmissões de layout. Essas transmissões de layout podem gerar trabalho exponencial se realizadas em pontos aninhados específicos da hierarquia de visualização.
O Jetpack Compose aplica uma única transmissão de layout a todos os elementos compostos usando o contrato da API. Isso permite que o Compose processe árvores de IU profundas com eficiência. Se várias medições forem necessárias, o Compose tem um sistema especial para isso: as medições intrínsecas.
Desempenho da inicialização da visualização
O sistema de visualização precisa inflar layouts XML ao mostrar um layout específico pela primeira vez. Esse custo é salvo no Jetpack Compose porque os layouts são gravados em Kotlin e compilados da mesma forma que o restante do app.
Comparação do Compose
No Jetpack Compose 1.0, há diferenças significativas entre o desempenho
de um app nos modos debug
e release
. Para tempos representativos, sempre
use o build release
, em vez do debug
, ao criar o perfil do app.
Para verificar a performance do código do Jetpack Compose, use a biblioteca Jetpack Macrobenchmark. Consulte o projeto MacrobenchmarkSample (link em inglês) para aprender a usar essa biblioteca com o Jetpack Compose. A equipe do Jetpack Compose também usa esse recurso para capturar regressões que possam acontecer. Por exemplo, veja esta comparação de coluna lenta com o painel (links em inglês) para monitorar regressões.
Instalação de perfil do Compose
Como o Jetpack Compose é uma biblioteca desagrupada, ele não se beneficia do Zigote, que pré-carrega as classes e os drawables do kit de ferramentas de IU do sistema de visualização. O Jetpack Compose 1.0 utiliza a instalação de perfil para builds de lançamento. Os instaladores de perfil permitem que os apps especifiquem um código essencial que será compilado AOT no momento da instalação. O Compose envia regras de instalação de perfil que reduzem o tempo de inicialização e a instabilidade nos apps dele.