Os perfis de referência melhoram 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.
Ao enviar um perfil de referência em um app ou uma biblioteca, o Android Runtime (ART) pode otimizar os caminhos de código especificados, usando a compilação antecipada (AOT, na sigla em inglês) para fornecer melhorias de desempenho a cada novo usuário e atualização do app. Essa otimização guiada por perfil (PGO, na sigla em inglês) permite que os apps otimizem a inicialização, reduzam a instabilidade de interação e melhorem a performance geral do ambiente de execução para usuários finais desde o primeiro lançamento.
Essas melhorias resultam diretamente em melhores métricas de negócios, como retenção de usuários, transações e classificações. Leia as histórias dos apps Josh, Lyft, TikTok e Zomato para descobrir como o desempenho afeta as métricas de negócios.
Benefícios dos perfis de referência
Os perfis de referência permitem a pré-compilação de código em interações críticas do usuário, como inicialização do app, navegação entre telas ou rolagem de conteúdo, tornando-as mais suaves desde a primeira execução. Ao aumentar a velocidade e a capacidade de resposta de um app, os perfis de referência podem gerar mais usuários ativos por dia e uma taxa média de visitantes recorrentes mais alta.
Os perfis de referência ajudam a orientar a otimização além da inicialização do app, oferecendo interações comuns do usuário que melhoram o tempo de execução desde o primeiro uso. A compilação guiada AOT não depende de dispositivos do usuário e pode ser feita uma vez por versão em uma máquina de desenvolvimento em vez de um dispositivo móvel. Com o envio de versões com um perfil de referência, as otimizações de apps ficam disponíveis muito mais rápido do que usando apenas os perfis da nuvem.
Quando um perfil de referência não é usado, todo o código do app passa por compilação JIT na memória
após ser interpretado ou é escrito em um arquivo odex em segundo plano quando o dispositivo está
inativo. Depois de instalar ou atualizar um app, os usuários têm uma
experiência não ideal desde a primeira execução até que novos caminhos de código sejam
otimizados.
Muitos apps relatam cerca de 30% de melhora de performance após a otimização.
Perfis de inicialização
Os perfis de inicialização são semelhantes aos perfis de referência, mas são usados no tempo de compilação para otimizar o layout do DEX e agilizar a inicialização, em vez de otimizar o dispositivo. Para saber mais sobre como os perfis de inicialização são diferentes dos perfis de referência, consulte Comparar perfis de referência e de inicialização. Para mais informações sobre a otimização do layout DEX, consulte Otimizações de layout DEX e perfis de inicialização.
Começar
Para começar a otimizar a performance do app atual, consulte Criar perfis de referência.
Geração de perfil x builds de lançamento
É importante entender a diferença nas configurações de build necessárias ao gerar arquivos de perfil de referência e de inicialização (por exemplo, baseline-prof.txt e startup-prof.txt) e ao criar o APK de lançamento final que consome esses perfis.
Ao gerar arquivos de perfil (por exemplo, benchmark):
Ao capturar um perfil de referência com um teste, o app não pode ser ofuscado.
Para garantir que as regras de perfil geradas correspondam com precisão às assinaturas de método do código, desative a ofuscação e a otimização (R8) para a variante de build usada na geração de perfil. Essa variante precisa ser diferente da variante de build de lançamento, que tem a ofuscação e a otimização ativadas. Para fazer isso, defina isMinifyEnabled = false para a variante de build de geração de perfil. Se você não estiver usando o plug-in do perfil de referência para Gradle, também precisará garantir que -dontobfuscate e -dontoptimize sejam aplicados. O
plug-in do perfil de referência para Gradle processa essa configuração
automaticamente.
Para verificar se o app não foi ofuscado durante a geração de perfil, abra o arquivo de perfil de texto gerado (por exemplo, baseline-prof.txt) e confira se os nomes de classe e método não estão ofuscados.
Ao criar o APK de lançamento final:
Ao criar o app de lançamento, ele precisa ser ofuscado. O build de lançamento precisa ter isMinifyEnabled = true para se beneficiar da ofuscação, minificação e otimização. O R8 reescreve automaticamente as regras dos arquivos de perfil não ofuscados para corresponder ao código ofuscado e otimizado no APK de lançamento. O build aproveita o arquivo de texto não ofuscado transformando as regras corretamente.
Se você quiser que a otimização do layout DEX (controlada pelos perfis de inicialização) funcione, o app de lançamento precisa ser ofuscado e usar o R8 com todas as otimizações ativadas.
Fluxos de trabalho avançados (não Gradle):
Se você usa um fluxo de trabalho avançado que não é do Gradle (como Bazel, Buck ou pipelines de automação de CI personalizados) para gerar seus perfis, ainda precisa seguir os mesmos princípios. O app não pode ser ofuscado ou otimizado ao capturar o perfil. No entanto, ao criar o app de lançamento, você precisa ofuscá-lo. O R8 processa o arquivo de regras de texto não ofuscado e transforma corretamente as regras para aplicar ao app de lançamento ofuscado.
Versões estáveis mínimas recomendadas
A cadeia de dependências oferece as versões de lançamento estáveis e em desenvolvimento. Para gerar e instalar um perfil de referência, use as versões abaixo ou mais recentes do Plug-in do Android para Gradle, da biblioteca Macrobenchmark e do instalador de perfil. Essas dependências são necessárias em momentos diferentes e funcionam juntas como um conjunto de ferramentas para gerar um perfil de referência ideal.
- Plug-in do Android para Gradle:
com.android.tools.build:8.0.0 - Biblioteca Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.4.1 - Instalador de perfil:
androidx.profileinstaller:profileinstaller:1.4.1
Recomendamos o uso da versão mais recente do AGP para criar e gerenciar perfis de referência. Estas são as principais funcionalidades que acompanham diferentes versões do AGP:
| Versão do AGP | Recursos |
|---|---|
| 9.1 |
Suporte completo a diretórios do conjunto de origem (módulos de biblioteca): Além de diretórios com reconhecimento de variantes, você pode declarar vários arquivos de origem do perfil de referência com um nome arbitrário, como src/free/generated/baselineProfiles/baseline-prof1.txt, para módulos de biblioteca e módulos de app.
|
| 8.4 | As instalações locais de builds não depuráveis usando a ferramenta de linha de comando do wrapper do Gradle ou o Android Studio instalam perfis de referência. Assim, a performance do build de lançamento local corresponde mais de perto à produção. Essa atualização não afeta a performance de produção dos perfis de referência. |
| 8,3 |
|
| 8.2 |
|
| 8.0 | Versão mínima recomendada: use o plug-in do perfil de referência do Gradle para gerar perfis de referência com uma única tarefa do Gradle.
|
| 7.4 |
Versão mínima com suporte: os apps podem consumir perfis de referência
de bibliotecas e fornecer o próprio perfil de referência no
src/main/baseline-prof.txt arquivo.
|
Configurações de origem de perfil com reconhecimento de variantes
Ao usar o Plug-in do Android para Gradle (AGP, na sigla em inglês) versão 8.0 para aplicativos e o AGP versão 8.3 para bibliotecas, é possível colocar regras de perfil de referência em um diretório de conjunto de origem dedicado, indo além das restrições de um único caminho fixo (por exemplo, src/main/baseline-prof.txt) e permitindo vários arquivos.
Isso facilita o suporte robusto a variantes, permitindo definir perfis de referência distintos adaptados a tipos e versões de build específicos (por exemplo, usando diretórios como src/variant/baselineProfiles/), o que garante que as regras de otimização de desempenho sejam aplicadas com precisão a cada binário de aplicativo ou biblioteca exclusivo.
Exemplo de geração de perfil
Consulte o exemplo de classe abaixo para criar um perfil de referência para a inicialização do app, além de vários eventos de navegação e rolagem usando a biblioteca Macrobenchmark recomendada:
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
uiAutomator {
// App startup journey.
startApp(PACKAGE_NAME)
// Find and click elements using the new DSL
onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
onElement { viewIdResourceName == "myLazyColumn" }.also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
pressBack()
}
}
}
}
Para mais informações sobre como usar a biblioteca do UI Automator para automatizar jornadas do usuário, consulte Criar testes automatizados com o UI Automator.
É possível conferir esse código em um contexto completo e em mais detalhes como parte dos nossos exemplos de desempenho no GitHub.
O que incluir
Ao usar perfis de referência em um app, você pode incluir um código de inicialização e algumas interações comuns do usuário, por exemplo, navegação entre telas ou rolagem. Também é possível coletar fluxos inteiros, por exemplo, registro, login ou pagamento. Qualquer jornada do usuário que você considere crítica pode se beneficiar dos perfis de referência, melhorando a performance de execução.
Se você estiver testando abordagens diferentes para melhorar a performance, inclua perfis de referência para os dois grupos do experimento. Ao fazer isso, você facilita a interpretação dos resultados, garantindo que todos os usuários executem de maneira consistente o código compilado.
As bibliotecas podem fornecer perfis de referência próprios e os enviar nos lançamentos de novas versões para melhorar o desempenho do app. Por exemplo, consulte a seção Usar um perfil de referência na página performance do Jetpack Compose.
Como funcionam os perfis de referência
Ao desenvolver seu app ou biblioteca, defina perfis de referência para cobrir interações comuns do usuário em que a latência ou o tempo de renderização são importantes. Confira como eles funcionam:
As regras de perfil legíveis por humanos são geradas para o app e compiladas em formato binário. Você pode encontrá-las em
assets/dexopt/baseline.prof. Em seguida, faça upload do Android App Bundle (AAB) no Google Play normalmente.O Google Play processa o perfil e o envia diretamente para os usuários com o APK. Durante a instalação, o ART realiza a compilação antecipada de métodos no perfil, resultando em uma execução mais rápida deles. Se o perfil tem métodos usados na inicialização do app ou durante a renderização do frame, o usuário pode notar tempos de inicialização mais rápidos e instabilidade reduzida.
Esse fluxo coopera com a agregação de perfis da nuvem para ajustar o desempenho com base no uso real do app ao longo do tempo.
Comparar perfis de referência e de inicialização
Você usa o plug-in do perfil de referência para Gradle para definir e produzir arquivos de perfil.
Esse plug-in se conecta ao processo de build, e o AGP compila essas regras de perfil legíveis por humanos em um formato binário, empacotado como baseline.prof no APK ou AAB, que o ART pode usar de maneira eficaz para a compilação no dispositivo, desde que seja menor que 1,5 MB.
Esses arquivos de perfil produzidos geralmente são chamados de startup-prof.txt e baseline-prof.txt. Embora o conteúdo deles às vezes possa parecer semelhante, especialmente se você estiver focado principalmente na inicialização, eles têm propósitos distintos e influenciam a performance em estágios diferentes:
perfil de referência
O arquivo de perfil de referência contém um conjunto abrangente de regras que o Android Runtime (ART) usa para pré-compilar caminhos de código usados com frequência, o que otimiza a performance do app além da inicialização.
O arquivo de perfil de referência geralmente é um superconjunto das regras encontradas no perfil de inicialização. Esse arquivo inclui todas as regras necessárias para a otimização da inicialização do app (geradas pela tarefa baselineProfile do Gradle), além de perfis adicionais para outras jornadas críticas do usuário. Por exemplo, rolagem e navegação em diferentes telas.
Essas regras adicionais, que não são de inicialização, são geradas independentemente do valor do campo de configuração includeInStartupProfile.
Perfil de inicialização
O arquivo de perfil de inicialização contém regras especificamente otimizadas para o caminho de inicialização do app. Durante a compilação, o D8 converte o bytecode Java em formato DEX.
O R8 usa esse arquivo para influenciar o layout dos arquivos DEX, garantindo que o código de inicialização crítico seja colocado no arquivo DEX principal para uma execução mais rápida. Geralmente, você precisa definir includeInStartupProfile como true apenas para cenários de teste essenciais para a exibição inicial do app. Para mais informações, consulte
Criar perfis de inicialização.
Perfis da nuvem
Os perfis da nuvem oferecem uma outra forma de PGO, agregada pela Google Play Store e distribuída para compilação durante a instalação, junto aos perfis de referência.
Embora os perfis da nuvem sejam focados em interações reais do usuário com o app, eles levam várias horas ou dias após uma atualização para serem distribuídos, o que limita a disponibilidade. Até que os perfis sejam totalmente distribuídos, a performance do aplicativo não será ideal para usuários novos ou que atualizaram o app. Além disso, os perfis da nuvem oferecem suporte apenas a dispositivos com o Android 9 (nível 28 da API) ou versões mais recentes, e só são escalonados corretamente para apps que tenham uma base de usuários suficientemente grande.
Comportamento de compilação nas versões do Android
As versões da plataforma Android usam diferentes abordagens de compilação de apps, cada uma com uma compensação de performance correspondente. Os perfis de referência melhoram os métodos de compilação anteriores fornecendo um perfil para todas as instalações.
| Versão do Android | Método de compilação | Abordagem de otimização |
|---|---|---|
| Android 5 a 6 (API de nível 21 a 23) | Antecipação completa | O app todo é otimizado durante a instalação, resultando em longos tempos de espera para o uso, aumento no uso de RAM e espaço em disco e tempos mais longos de carregamento do código do disco, o que pode aumentar os tempos de inicialização a frio. |
| Android 7 a 8.1 (API de nível 24 a 27) | Antecipação parcial (perfil de referência) | Os perfis de referência são
instalados por
androidx.profileinstaller
na primeira execução, quando o
módulo do app define essa
dependência. O ART pode melhorar
ainda mais o processo adicionando
outras regras de perfil
durante o uso do app e
as compilando quando o
dispositivo está inativo. Isso
otimiza o espaço em disco
e o tempo para carregar o código do
disco, reduzindo
o tempo de espera do app. |
| Android 9 (nível 28 da API) e versões mais recentes | Antecipação parcial (perfil de referência + da nuvem) | O Google Play usa perfis de referência durante a instalação do app para otimizar os perfis de APK e da nuvem, se disponíveis. Após a instalação, é feito o upload dos perfis do ART para o Play, e eles são agregados e fornecidos como perfis da nuvem para outros usuários na instalação ou atualização do app. |
Problemas conhecidos
Confira abaixo possíveis problemas e soluções ou problemas em que há desenvolvimentos contínuos de soluções alternativas:
A geração de perfil de referência pode falhar devido às configurações de permissão em alguns dispositivos, incluindo dispositivos OnePlus. Para contornar isso, desative a opção Desativar monitoramento de permissão nas configurações das Opções do desenvolvedor.
Para fornecer perfis de referência para bibliotecas, use o plug-in do perfil de referência para Gradle 1.2.3 ou o AGP 8.3, no mínimo (problema 313992099).
Se você gerar perfis de referência com o comando
./gradlew app:generateBaselineProfile, os comparativos no módulo de teste também serão executados, e os resultados serão descartados. Se isso acontecer, você poderá gerar apenas os perfis de referência executando o comando com-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Esse problema foi corrigido no AGP 8.2.O comando para gerar perfis de referência para todos os tipos de build,
./gradlew app:generateBaselineProfile, só gera perfis de referência para o tipo de build de lançamento. Esse problema foi corrigido no AGP 8.1.Os canais de distribuição de apps que não são da Google Play Store podem não oferecer suporte ao uso de perfis de referência na instalação. Os usuários de apps instalados que usam esses canais não terão esses benefícios até que o dexopt em segundo plano seja executado, provavelmente durante a madrugada.
O Compartilhamento interno de apps da Play Store não tem suporte a perfis de referência. No entanto, a faixa de teste interno tem.
As otimizações de bateria em alguns dispositivos, como os da Huawei, podem interferir na instalação do perfil. Para ajudar a garantir que seus perfis sejam instalados de maneira eficaz, desative todas as otimizações de bateria nos dispositivos de referência.
Outros recursos
Recomendados para você
- Observação: o texto do link aparece quando o JavaScript está desativado.
- Criar perfis de referência {:#creating-profile-rules}
- Criar e medir perfis de referência sem a Macrobenchmark
- Otimizações de layout DEX e perfis de inicialização