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 o desempenho geral de execução para usuários desde o 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 tornam todas as interações do usuário, como inicialização do app, navegação entre telas ou rolagem de conteúdo, 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. A diferença é que eles
são usados durante a compilação, e não para a otimização no dispositivo. Um perfil
de inicialização é usado para otimizar o layout do arquivo DEX e melhorar os tempos de inicialização.
O código identificado no perfil de inicialização é colocado no arquivo classes.dex
principal, e o outro em arquivos DEX separados. Isso melhora
os tempos de inicialização, reduzindo o número de falhas da página durante a inicialização do app. Para saber
mais sobre como os perfis de inicialização e as otimizações de layout DEX podem melhorar os tempos de
inicialização do app, 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.
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.1.0
- Biblioteca Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.1.1
- Instalador de perfil:
androidx.profileinstaller:profileinstaller:1.3.1
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:
@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
// App startup journey.
startActivityAndWait()
device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
device.findObject(By.res("myLazyColumn")).also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
device.pressBack()
}
}
}
É possível conferir esse código em um contexto completo e em mais detalhes como parte dos nossos exemplos de performance no GitHub (link em inglês).
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 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.

Perfis da nuvem
Os perfis da nuvem oferecem uma forma adicional 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ários dias ou semanas 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 29 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. |
Soluções de possíveis problemas
Confira abaixo possíveis problemas e soluções ou problemas em que há desenvolvimentos contínuos de soluções alternativas:
Os perfis de referência não são empacotados corretamente ao criar o APK de um pacote de app. Para resolver esse problema, aplique
com.android.tools.build:gradle:7.3.0
ou versões mais recentes (problema).Os perfis de referência são empacotados corretamente apenas para o arquivo
classes.dex
principal. Isso afeta apps com mais de um arquivo.dex
. Para resolver esse problema, aplique ocom.android.tools.build:gradle:7.3.0
ou versões mais recentes.Não é permitido redefinir os caches de perfil do ART em builds
user
(sem acesso root). Para contornar isso,androidx.benchmark:benchmark-macro-junit4:1.1.0
inclui uma correção que reinstala o app durante a comparação (problema).Os criadores de perfil do Android Studio não instalam perfis de referência ao criar o perfil do app (problema).
Os sistemas de build que não são do Gradle, como Bazel ou Buck, não oferecem suporte para a compilação de perfis de referência em APKs de saída.
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 compilador do build aceita apenas um
baseline-prof.txt
na pastasrc/main
e não reflete arquivos em variações ou em tipos de build diferentes. Estamos trabalhando ativamente para melhorar isso.As otimizações de bateria 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.
As melhorias no desempenho podem ser diferentes entre as comparações e a produção. Isso acontece porque os comparativos locais medem o desempenho com os perfis de referência ativados ou desativados. Em um app de produção, a medição é incremental ao adicionar uma nova parte do app a um perfil de referência, no qual as partes já têm perfis criados usando bibliotecas colaboradoras.
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