O Jetpack Compose acelera o desenvolvimento de interfaces e melhora o desenvolvimento do Android. No entanto, considere como a adição do Compose a um app existente pode afetar métricas como tamanho do APK, build e desempenho de tempo 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 ao analisar o app de exemplo Sunflower, que demonstra as práticas recomendadas para 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 lançamento minificado de cada projeto com redução de recursos e código ativada, usando o modo completo do R8 e medidos com o APK Analyzer.
| Somente visualizações | Visualizações e Compose misturados | Apenas Compose | |
|---|---|---|---|
| Tamanho do download | 2.252 KB | 3.034 KB | 2.966 KB |
Ao adicionar o Compose ao Sunflower, o tamanho do APK aumentou de 2.252 KB para 3.034 KB, um aumento de 782 KB. O APK gerado consistia na build da interface com uma combinação de visualizações e Compose. Esse aumento é esperado, já que outras dependências foram adicionadas ao Sunflower.
Por outro lado, quando o Sunflower foi migrado para um app somente com Compose, o tamanho do APK
diminuiu de 3.034 KB para 2.966 KB, uma redução de 68 KB. Essa diminuição ocorreu devido à remoção de dependências de visualização não utilizadas, como AppCompat e ConstraintLayout.
Tempo de compilação
Adicionar o Compose aumenta o tempo de build do app, já que o compilador
processa elementos combináveis no app. Os resultados a seguir foram obtidos usando a
ferramenta independente gradle-profiler, que executa um build várias vezes para
que um tempo médio de build possa ser obtido para a duração do build de depuração do
Sunflower:
gradle-profiler --benchmark --project-dir . :app:assembleDebug
| Somente visualizações | Visualizações e Compose misturados | Apenas Compose | |
|---|---|---|---|
| Tempo médio de build | 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 realizar tarefas adicionais 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 Sunflower para o Compose foi concluída. Essa redução pode ser atribuída a vários fatores que, juntos, diminuem o tempo de build, como a remoção da vinculação de dados, a migração de dependências que usam kapt para KSP e a atualização de várias dependências para as versões mais recentes.
Resumo
Adotar o Compose vai aumentar o tamanho do APK do seu app e também o desempenho do tempo de build do seu app devido ao processo de compilação do código do Compose. No entanto, é preciso ponderar essas compensações em relação aos benefícios do Compose, principalmente em relação ao aumento da produtividade do desenvolvedor ao adotar o Compose. Por exemplo, a equipe da Google Play Store descobriu que a escrita de interfaces exige muito menos código, às vezes até 50%, aumentando a produtividade e a capacidade de manutenção do código.
Leia mais estudos de caso em Adotar o Compose para equipes.
Desempenho em tempo de execução
Esta seção aborda tópicos relacionados à performance de tempo de execução no Jetpack Compose para ajudar a entender como o Jetpack Compose se compara à performance do sistema de visualização e como você pode medir isso.
Recomposições inteligentes
Quando partes da UI são inválidas, o Compose tenta recompor apenas aquelas que precisam ser atualizadas. Leia mais sobre isso na documentação Ciclo de vida dos elementos combináveis e Fases do Jetpack Compose.
Perfis de referência
Os perfis de referência são uma excelente maneira de acelerar as jornadas comuns do usuário. Incluir um perfil de referência no app pode melhorar a velocidade de execução do código em cerca de 30% desde a primeira inicialização, evitando a interpretação e as etapas de compilação just-in-time (JIT) para caminhos de código incluídos.
A biblioteca Jetpack Compose inclui um perfil de referência próprio, e você recebe essas otimizações automaticamente ao usar o Compose no app. No entanto, essas otimizações afetam apenas caminhos de código na biblioteca Compose. Por isso, recomendamos que você adicione um perfil de referência ao app 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 implementar uma lógica explícita para evitar a renderização quando 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 interface são funções combináveis simples
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 oferece recomposições inteligentes, reproduzindo o resultado desenhado anteriormente se você não precisar fazer mudanças.
Várias transmissões de layout
Os ViewGroups tradicionais têm muita expressividade nas APIs de medição e layout, o que os torna 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 exige uma única transmissão de layout para todos os elementos combináveis de layout pelo contrato de API. Isso permite que o Compose processe árvores de UI profundas com eficiência. Se forem necessárias várias medições, o Compose terá 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, já que os layouts são escritos em Kotlin e compilados como o restante do app.
Benchmark 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. Para saber como usar com o Jetpack Compose, consulte o projeto MacrobenchmarkSample.
A equipe do Jetpack Compose também usa a Macrobenchmark para capturar regressões que podem acontecer. Por exemplo, veja o benchmark para coluna lenta e o painel para acompanhar regressões.
Instalação de perfil do Compose
Como o Jetpack Compose é uma biblioteca não agrupada, ele não se beneficia do Zygote, que pré-carrega as classes e os elementos gráficos do kit de ferramentas de interface do sistema View. O Jetpack Compose 1.0 usa a instalação de perfil para builds de lançamento. Os instaladores de perfil permitem que os apps especifiquem códigos críticos para serem compilados antecipadamente (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.
Recomendados para você
- Observação: o texto do link aparece quando o JavaScript está desativado.
- Outras considerações
- Como usar o Compose em visualizações
- Rolagem