Criar perfis de referência
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Os perfis de referência são essenciais para maximizar a performance do Jetpack Compose.
A pré-compilação das jornadas críticas do usuário ajuda a garantir que a interface do Compose
seja renderizada sem problemas.
Gere perfis automaticamente para cada lançamento usando a biblioteca
Macrobenchmark do Jetpack e BaselineProfileRule. Recomendamos usar
o com.android.tools.build:gradle:8.0.0 ou versões mais recentes para aproveitar as melhorias de build
ao usar perfis de referência.
Estas são as etapas gerais para criar um novo perfil de referência:
Configure o módulo do perfil de referência.
Defina o teste JUnit que ajuda a gerar perfis de referência.
Adicione as jornadas ideais do usuário (CUJs) que você quer otimizar.
Gere o perfil de referência.
Depois de gerar o perfil de referência, compare-o usando um dispositivo físico para
medir as melhorias na velocidade.
Criar um novo perfil de referência com o AGP 8.2 ou mais recente
A maneira mais fácil de criar um perfil de referência é usar o modelo de módulo
disponível no Android Studio Iguana com o Plug-in do Android para
Gradle (AGP) 8.2 e mais recentes.
O modelo de módulo do gerador de perfil de referência do Android Studio automatiza
a criação de um novo módulo para gerar e
comparar
os perfis de referência. A execução do modelo gera a maior parte da configuração do build típica,
a geração do perfil de referência e o código de verificação. O modelo
cria um código para gerar e comparar perfis de referência e avaliar a inicialização
do app.
Configurar o módulo do perfil de referência
Para executar o modelo de módulo do perfil de referência, siga estas etapas:
Selecione File > New > New Module.
Selecione o modelo Gerador de perfil de referência no painel Modelos
e configure-o:
Figura 1. Modelo de módulo do gerador de perfil de referência.
Estes são os campos do modelo:
Target application: o app para o qual o perfil de referência é
gerado. Quando você só tem um módulo de app no projeto,
há apenas um item nessa lista.
Module name: o nome que você quer definir para o módulo do perfil de referência que está
criando.
Package name: o nome do pacote que você quer para o módulo do
perfil de referência.
Language: se você quer que o código gerado seja em Kotlin ou Java.
Linguagem de configuração do build: para decidir se você vai usar o script Kotlin
(KTS) ou o Groovy nos scripts de configuração do build.
Clique em Finish para que o novo módulo seja criado. Se você estiver usando o controle
de origem, talvez receba uma solicitação para adicionar os arquivos do módulo
recém-criado ao controle de origem.
Definir o gerador do perfil de referência
O módulo recém-criado contém testes para gerar e comparar o
perfil de referência e testar apenas a inicialização básica do app. Recomendamos que você aumente
esses dados para incluir CUJs e fluxos de trabalho avançados de inicialização. Verifique se todos os testes
relacionados à inicialização do app estão em um bloco rule com includeInStartupProfile definido
como true. Por outro lado, para otimizar a performance, verifique se os testes não
relacionados à inicialização do app não estão incluídos em um perfil de inicialização. As otimizações de inicialização do app são usadas para definir uma parte especial de um perfil de referência chamada perfil de inicialização.
Isso vai ajudar na manutenção se você abstrair essas CUJs fora do perfil de referência gerado e do código de comparação para que elas possam ser usadas para ambos. Isso significa que as mudanças nas CUJs são usadas de maneira consistente.
Gerar e instalar o perfil de referência
O modelo de módulo do perfil de referência adiciona uma nova configuração de execução para gerar
o perfil de referência. Se você estiver usando variações de produto, o Android Studio vai criar
várias configurações de execução para que seja possível gerar perfis de referência separados
para cada uma delas.
Figura 2. A execução dessa configuração gera o perfil de
referência.
Quando a configuração de execução Generate Baseline Profile for concluída, ela vai copiar
o perfil de referência gerado para o arquivo
src/variant/generated/baselineProfiles/baseline-prof.txt no
módulo que está sendo criado. As opções de variantes são o
tipo de build de lançamento ou uma variante que o envolva.
O perfil de referência gerado é criado originalmente em build/outputs. O
caminho completo é determinado pela variante ou variação do app para o qual um perfil está sendo criado e
pelo uso de um dispositivo gerenciado pelo Gradle ou um dispositivo conectado para criar um perfil. Se
você usar os nomes utilizados pelo código e as configurações de build geradas pelo
modelo, o perfil de referência será criado no
arquivo build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt. Você provavelmente não vai precisar interagir diretamente com essa versão do perfil de referência gerado, a menos que a copie manualmente para os módulos de destino, o que não é recomendado.
Criar um novo perfil de referência com o AGP 8.1
Se não for possível usar o modelo de módulo do perfil de referência, use o
modelo de módulo da biblioteca Macrobenchmark e o plug-in do perfil de referência para Gradle para criar
um novo perfil. Recomendamos usar essas ferramentas no Android
Studio Giraffe e com o AGP 8.1 e versões mais recentes.
Confira as etapas para criar um novo perfil de referência usando o modelo de módulo da biblioteca
Macrobenchmark e o plug-in do perfil de referência para Gradle:
O gerador pode incluir interações com o app além da inicialização.
Isso permite otimizar o desempenho de execução do app, como
listas de rolagem, execução de animações e navegação em uma Activity.
Confira outros exemplos de testes que usam @BaselineProfileRule para melhorar
jornadas ideais do usuário.
Adicione o plug-in do perfil de referência para Gradle
(libs.plugins.androidx.baselineprofile). Ele facilita
a geração e manutenção de perfis de referência.
Para gerar o perfil de referência, execute as tarefas do Gradle :app:generateBaselineProfile ou
:app:generateVariantBaselineProfile no
terminal.
Execute o gerador como um teste instrumentado em um dispositivo físico, emulador
ou dispositivo gerenciado pelo Gradle com acesso root. Se você usa um dispositivo gerenciado pelo Gradle,
defina aosp como systemImageSource, já que o
gerador de perfis de referência precisa de acesso root.
No final da tarefa de geração, o perfil de referência será copiado para
app/src//generated/baselineProfiles.
Aplique a configuração desejada, conforme mostrado no exemplo abaixo.
Kotlin
plugins{id("com.android.test")id("androidx.baselineprofile")}android{defaultConfig{...}// Point to the app module, the module that you're generating the Baseline Profile for.targetProjectPath=":app"// Configure a GMD (optional).testOptions.managedDevices.devices{pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice){device="Pixel 6"apiLevel=31systemImageSource="aosp"}}}dependencies{...}// Baseline Profile Gradle plugin configuration. Everything is optional. This// example uses the GMD added earlier and disables connected devices.baselineProfile{// Specifies the GMDs to run the tests on. The default is none.managedDevices+="pixel6Api31"// Enables using connected devices to generate profiles. The default is// `true`. When using connected devices, they must be rooted or API 33 and// higher.useConnectedDevices=false}
Groovy
plugins{id'com.android.test'id'androidx.baselineprofile'}android{defaultConfig{...}// Point to the app module, the module that you're generating the Baseline Profile for.targetProjectPath':app'// Configure a GMD (optional).testOptions.managedDevices.devices{pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice){device'Pixel 6'apiLevel31systemImageSource'aosp'}}}dependencies{...}// Baseline Profile Gradle plugin configuration. Everything is optional. This// example uses the GMD added earlier and disables connected devices.baselineProfile{// Specifies the GMDs to run the tests on. The default is none.managedDevices['pixel6Api31']// Enables using connected devices to generate profiles. The default is// `true`. When using connected devices, they must be rooted or API 33 and// higher.useConnectedDevicesfalse}
Crie um teste de perfil de referência no módulo de teste :baseline-profile. O
exemplo a seguir é um teste que gera um perfil de referência para a inicialização
do app.
Atualize o arquivo build.gradle.kts no módulo do app (por exemplo, :app).
Aplique o plug-in androidx.baselineprofile.
Adicione uma dependência do baselineProfile ao módulo :baseline-profile.
Kotlin
plugins{id("com.android.application")id("androidx.baselineprofile")}android{// There are no changes to the `android` block....}dependencies{...// Add a `baselineProfile` dependency on the `:baseline-profile` module.baselineProfile(project(":baseline-profile"))}
Groovy
plugins{id'com.android.application'id'androidx.baselineprofile'}android{// No changes to the `android` block....}dependencies{...// Add a `baselineProfile` dependency on the `:baseline-profile` module.baselineProfile':baseline-profile'}
Gere o perfil executando as
tarefas :app:generateBaselineProfile ou :app:generateVariantBaselineProfile do Gradle.
No final da tarefa de geração, o perfil de referência será copiado para
app/src/variant/generated/baselineProfiles.
Figura 3. Execute os testes do Android na ação de
gutter.
Quando essa execução é feita no Android Studio, a saída do build contém detalhes das
melhorias de velocidade oferecidas pelo perfil de referência:
StartupBenchmarks_startupCompilationBaselineProfiles
timeToInitialDisplayMs min 161.8, median 178.9, max 194.6
StartupBenchmarks_startupCompilationNone
timeToInitialDisplayMs min 184.7, median 196.9, max 202.9
Capturar todos os caminhos de código necessários
Confira as duas métricas principais para medir os tempos de inicialização do app:
Tempo para exibição total (TTFD): TTID mais o tempo para mostrar conteúdo
que seja carregado de forma assíncrona após a exibição do frame inicial.
O TTFD é informado quando o método reportFullyDrawn da
ComponentActivity é chamado. Se o método reportFullyDrawn não for chamado, o
TTID será informado. Talvez seja necessário atrasar a chamada do reportFullyDrawn até que o
carregamento assíncrono seja concluído. Por exemplo, se a interface
contiver uma lista lenta dinâmica, ela poderá ser preenchida por uma tarefa
em segundo plano que será concluída depois que a lista for renderizada e, portanto, depois que a interface
estiver marcada como totalmente renderizada. Nesses casos, o código executado depois que a interface atinge
o estado totalmente renderizado não é incluído no perfil de referência.
Para incluir o preenchimento da lista como parte do perfil de referência, acesse o
FullyDrawnReporter usando getFullyDrawnReporter e adicione um informante
no código do app. Libere o informante depois que a tarefa em segundo plano terminar
de preencher a lista. O FullyDrawnReporter não chama o
método reportFullyDrawn até que todos os informantes sejam liberados. Ao fazer isso,
o perfil de referência inclui os caminhos de código necessários para preencher a lista. Isso
não muda o comportamento do app para o usuário, mas permite que o perfil de referência
inclua todos os caminhos de código necessários.
Para indicar o estado totalmente renderizado, use as seguintes APIs do Compose:
ReportDrawn indica que o elemento combinável está pronto para
interação.
ReportDrawnWhen usa um predicado, como list.count > 0, para
indicar quando o elemento combinável está pronto para interação.
O ReportDrawnAfter usa um método de suspensão que, quando concluído,
indica que o elemento combinável está pronto para interação.
Recomendados para você
Observação: o texto do link aparece quando o JavaScript está desativado.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.