Comparar métricas do Compose e da visualização

O Jetpack Compose acelera o desenvolvimento da interface e melhora o Android no desenvolvimento de software. No entanto, leve em consideração como a adição do Compose a um app existente pode afetar métricas como o tamanho do APK do app, build e desempenho do ambiente de execução.

Tempos de compilação e tamanho do APK

Esta seção aborda o impacto no tamanho do APK e no tempo de build analisando Sunflower (link em inglês): um app que demonstra as práticas recomendadas de migrar um app baseado em visualização para o Compose.

Tamanho do APK

Adicionar bibliotecas ao projeto aumenta o tamanho do APK. Os resultados a seguir são para o APK de versão reduzida de cada projeto com recursos e códigos redução ativada, usando o modo R8 completo e medida com o APK Analyzer.

Somente visualizações Visualizações e Compose mistas Somente Compose
Tamanho do download 2.252 KB 3.034 KB 2.966 KB

Ao adicionar o Compose ao Sunflower pela primeira vez, o tamanho do APK aumentou de 2.252 KB para 3.034 KB: um aumento de 782 KB. O APK gerado consistia no build da interface com uma combinação de visualizações e do Compose. Espera-se que esse aumento dependências foram adicionadas ao Sunflower.

Por outro lado, quando o Sunflower foi migrado para um app somente do Compose, o tamanho do APK foi alterado. diminuiu de 3.034 KB para 2.966 KB, uma redução de 68 KB. Essa redução ocorreu devido para remover dependências de visualização não usadas, como AppCompat e ConstraintLayout.

Tempo de compilação

Adicionar o Compose aumenta o tempo de build do app como o compilador do Compose. processa os elementos combináveis no app. Os resultados a seguir foram obtidos usando o ferramenta independente gradle-profiler, que executa um build várias vezes. que um tempo médio de compilação pode ser obtido para a duração da compilação de depuração de Girassol:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Somente visualizações Visualizações e Compose mistas Somente Compose
Tempo médio de compilação 299,47 ms 399,09 ms 342,16 ms

Ao adicionar o Compose ao Sunflower pela primeira vez, o tempo médio de build aumentou de 299 ms para 399 ms: um aumento de 100 ms. Essa duração se deve ao compilador do Compose realizando outras tarefas para transformar o código do Compose definido no projeto.

Por outro lado, o tempo médio de build caiu para 342 ms, uma redução de 57 ms, quando A migração do app Sunflower para o Compose foi concluída. Essa redução pode ser atribuída a vários fatores que coletivamente reduzem o tempo de criação, como a remoção de dados vinculação, migração de dependências que usam kapt para KSP e atualização várias dependências para as versões mais recentes.

Resumo

A adoção do Compose aumenta o tamanho do APK do app de maneira eficaz e também aumenta aumentar o desempenho do tempo de build do app devido ao processo de compilação do código do Compose. No entanto, essas compensações precisam ser comparadas benefícios do Compose, especialmente em relação ao aumento da produtividade do desenvolvedor. ao adotar o Compose. Por exemplo, a equipe da Play Store encontrou que a criação de interfaces exige muito menos código, às vezes até 50%. aumentar a produtividade e a capacidade de manutenção do código.

Leia mais estudos de caso em Adotar o Compose for Teams.

Desempenho em tempo de execução

Esta seção aborda temas relacionados ao desempenho da execução no Jetpack Compose para ajudam a entender como o Jetpack Compose se compara ao desempenho do sistema de visualização, e como você pode medir isso.

Recomposições inteligentes

Quando partes da interface são inválidas, o Compose tenta recompor apenas o que precisam ser atualizadas. Leia mais sobre isso no Ciclo de vida elementos combináveis e o Jetpack Compose de fases (em inglês).

Perfis de referência

Os perfis de referência são excelente de acelerar jornadas de usuário comuns. Como incluir uma referência O perfil no app pode melhorar a velocidade de execução do código em cerca de 30% desde a lançamento evitando as etapas de interpretação e compilação just-in-time (JIT) para os caminhos de código incluídos.

A biblioteca do Jetpack Compose inclui um perfil de referência próprio, e você receba essas otimizações automaticamente ao usar o Compose no seu app. No entanto, Essas otimizações afetam apenas os caminhos de código dentro da biblioteca do Compose. recomendamos adicionar um perfil de referência ao para cobrir caminhos de código fora do Compose.

Comparação com o sistema de visualização

O Jetpack Compose tem muitas melhorias em relação ao sistema de visualização. Essas melhorias são descritas nas seções a seguir.

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 do View personalizado precisa para implementar lógica explícita a fim de evitar redesenho quando não for necessárias, por exemplo, para processamento de dados repetitivo.

O Jetpack Compose resolve isso de algumas maneiras. O Compose não tem recursos explícitos atualizáveis para desenhar visualizações. Elementos da interface são funções combináveis simples cujas informações são gravadas na composição de forma que possam ser repetidas. Isso ajuda reduzir o rastreamento de estado explícito, as alocações de memória e os callbacks para combináveis que exigem esses recursos em vez de todos. extensões de um determinado tipo View.

Além disso, o Compose oferece recomposições inteligentes, repetindo o resultado mostrado anteriormente se não precisar fazer alterações.

Várias transmissões de layout

ViewGroups tradicionais têm muita expressividade em medida e layout APIs que os tornam propensos a 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. para todos os elementos combináveis de layout pelo contrato da API. Isso permite que o Compose tenha e lidar com árvores de IU profundas. Se várias medições forem necessárias, o Compose tem 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 escritos em Kotlin e compilados da mesma forma que o restante do app.

Comparar o 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. Para saber como para usá-lo com o Jetpack Compose, consulte a Projeto MacrobenchmarkSample (link em inglês).

A equipe do Jetpack Compose também usa a Macrobenchmark para capturar regressões que podem acontecer. Por exemplo, consulte a comparação de colunas lentas. e seu painel. para rastrear regressões.

Instalação de perfil do Compose

Como o Jetpack Compose é uma biblioteca desagrupada, ele não se beneficia do Zigoto, que pré-carrega o sistema de visualização. Classes e drawables do kit de ferramentas de interface. O Jetpack Compose 1.0 usa o perfil para builds release. Os instaladores de perfil permitem que os apps especifiquem códigos essenciais para ser compilado antecipadamente (AOT, na sigla em inglês) 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.