Ergonomia do desenvolvedor no Compose

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 uma RecyclerView. 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 compilação caiu para 76,96 segundos. Uma redução de 29% no tempo de compilação. 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 é exibida na tela, como TextView, Button ou ImageView, exige alocações de memória, rastreamento explícito de estado e vários callbacks para oferecer compatibilidade com 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 exibir visualizações. Os elementos de IU são simples funções compostas, 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 compostos que precisam desses recursos, em vez de exigi-los 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 o desempenho do código do Jetpack Compose, use a biblioteca Jetpack Macrobenchmark. 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 para rastrear 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 do Compose.