Visão geral dos perfis de referência

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.

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.2.3
  • Instalador de perfil: androidx.profileinstaller:profileinstaller:1.3.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
8.3
  • Suporte completo a diretórios do conjunto de origem (módulos de biblioteca): declare vários arquivos de origem do perfil de referência e use diretórios com reconhecimento de variantes, como src/free/generated/baselineProfiles/baseline-prof1.txt, agora para módulos de biblioteca e módulos de app.
  • Os perfis de referência incluem classes de simplificação.
8.2
  • Reescrita das regras do R8: o D8 e o R8 podem transformar as regras legíveis por humanos do perfil de inicialização e de referência para capturar todas as regras necessárias para otimizar o desempenho do app. Isso aumenta a cobertura do perfil de referência dos métodos em cerca de 30% e o desempenho do app em cerca de 15%.
  • Perfis de inicialização: gere esse novo tipo de perfil de referência para informar o layout do código no DEX. Aumenta o desempenho da inicialização em cerca de 15% ou muito mais para apps grandes.
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.
  • Suporte completo a diretórios do conjunto de origem (módulos de app): declare vários arquivos de origem do perfil de referência e use diretórios com reconhecimento de variantes, como src/free/generated/baselineProfiles/baseline-prof1.txt.
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 arquivo src/main/baseline-prof.txt.
  • Os perfis de referência são empacotados corretamente ao criar o APK de um pacote de app (problema 230361284).
  • Para apps com mais de um arquivo .dex, os perfis de referência são empacotados corretamente para o arquivo .dex principal.

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:

  1. 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.

  2. 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.

  3. 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.

Figura 1. Esse diagrama mostra o fluxo de trabalho do perfil de referência desde o upload até a entrega ao usuário final e como esse fluxo de trabalho se relaciona com os perfis da nuvem.

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 perfis de referência não tem suporte em dispositivos do Firebase Test Lab, incluindo dispositivos do Test Lab gerenciados pelo Gradle (problema 285187547).

  • 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, as comparações no módulo de teste também serão executadas, 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, gera perfis de referência apenas 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 Huawei, podem interferir na instalação do perfil. Para garantir que seus perfis sejam instalados de maneira eficaz, desative todas as otimizações de bateria nos dispositivos de referência.

Outros recursos