Perfis de imagem de inicialização

O Android 11 ou versões mais recentes são compatíveis com a geração de perfis de imagem de inicialização, que encapsulam informações sobre o código de vários componentes no nível do sistema, como o servidor do sistema e o classpath de inicialização. O Android Runtime (ART) usa essas informações para realizar otimizações em todo o sistema. Algumas delas são essenciais para o desempenho do Android e afetam a execução de todo o código não nativo (no sistema ou no nível do app). Em alguns casos, os perfis de imagem de inicialização podem afetar o desempenho da execução e o consumo de memória em porcentagens de dois dígitos.

Receber informações do perfil de inicialização

Os perfis de imagem de inicialização são derivados dos perfis de apps executados durante jornadas ideais do usuário (CUJs). Em uma configuração específica de dispositivo, o ART captura (como parte dos perfis JIT) os métodos e classes do classpath de inicialização usados por apps e registra essas informações no perfil do app (por exemplo, /data/misc/profiles/cur/0/com.android.chrome/primary.prof), em que são indexadas pelo arquivo executável Dalvik (DEX) do classpath de inicialização. Consulte Formato do perfil do ART.

Analise os perfis de app gravados durante as CUJs para determinar qual parte do classpath de inicialização é mais usada e mais importante para otimizar. Por exemplo, consulte Formato do perfil do ART. Incluir todos os métodos ou classes afeta negativamente a performance. Por isso, concentre-se nos caminhos de código mais usados. Por exemplo, se um método do boot classpath for usado por um único app, ele não deverá fazer parte dos perfis de inicialização. Cada dispositivo precisa configurar a seleção de método/classe com base na seleção de CUJ e na quantidade de dados produzidos pelo teste.

Para agregar informações de classpath de inicialização de todos os perfis de app individuais no dispositivo, execute o comando adb shell cmd package snapshot-profile android. Você pode usar as informações agregadas como base para o processamento e a seleção de método/classe sem agregar manualmente os perfis individuais (embora seja possível fazer isso, se quiser).

Perfil da imagem de inicialização

Figura 1. Processo para receber perfis de imagens de inicialização

Dados do perfil da imagem de inicialização

Os perfis de imagem de inicialização incluem os seguintes arquivos e dados.

  • Perfil para o classpath de inicialização (frameworks/base/config/boot-image-profile.txt. Determina quais métodos do classpath de inicialização são otimizados e qual classe é incluída na imagem de inicialização .art.

  • Lista de classes pré-carregadas. Determina quais classes são pré-carregadas no Zygote.

  • Perfil para os componentes do servidor do sistema (frameworks/base/services/art-profile). Determina quais métodos do servidor do sistema são otimizados/compilados, qual classe é incluída na imagem de inicialização .art e como os arquivos DEX correspondentes são organizados.

Formato do perfil do ART

O perfil do ART captura informações de cada um dos arquivos DEX carregados, incluindo informações sobre métodos que valem a pena otimizar e classes usadas durante a inicialização. Quando o perfil da imagem de inicialização está ativado, a ART também inclui o classpath de inicialização e os arquivos JAR do servidor do sistema no perfil e anota cada arquivo DEX com o nome do pacote que o usa.

Por exemplo, despeje o perfil bruto da imagem de inicialização com o seguinte comando:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

Isso produz uma saída semelhante a:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

No exemplo acima:

  • core-oj.jar é usado por com.google.android.ext.services e com.android.systemui. Cada entrada lista os dois pacotes usados de core-oj.jar.

  • Os dois processos usam o método com índice DEX 520, mas apenas o processo systemui usa o método com índice DEX 521. A mesma lógica se aplica às outras seções do perfil, como as classes de inicialização.

Durante o processamento de dados, filtre métodos/classes com base no uso, dando prioridade a processos no nível do sistema (por exemplo, o servidor do sistema ou systemui) ou a métodos que podem não ser usados com frequência, mas ainda são importantes (por exemplo, métodos usados pelo app de câmera).

O formato de perfil anota internamente cada método com várias flags (inicialização, pós-inicialização, intensidade, abi), que é mais do que o mostrado no formato somente despejo. Para usar todos os indicadores, modifique os scripts disponíveis.

Recomendações

Siga estas diretrizes para ter os melhores resultados.

  • Implante a configuração para gerar perfis de imagem de inicialização em vários dispositivos de teste e agregue os resultados antes de gerar o perfil final. A ferramenta profman é compatível com a agregação e a seleção de vários perfis de imagem de inicialização, mas funciona apenas com a mesma versão da imagem de inicialização (mesmo classpath de inicialização).

  • Dê prioridade de seleção aos métodos/classes usados por processos do sistema. Esses métodos/classes podem usar um código que não é usado com frequência por outros apps, mas que ainda é essencial para otimizar.

  • O formato dos dados de uma única execução de dispositivo é muito diferente em comparação com dispositivos de teste que executam CUJs do mundo real. Se você não tiver uma grande frota de dispositivos de teste, use o mesmo dispositivo para executar vários CUJs e aumentar a confiança de que as otimizações de perfil de imagem de inicialização vão funcionar bem em produção. Esse cenário é descrito abaixo.

Configurar dispositivos

Para ativar a configuração do perfil de inicialização usando propriedades do sistema, use um dos métodos a seguir.

  • Opção 1:configurar manualmente as propriedades (funciona até a reinicialização):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • Opção 2:use um local.prop (efeito permanente até que o arquivo seja excluído). Para fazer isso, siga estas etapas:

    1. Crie um arquivo local.prop com o conteúdo:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Execute os seguintes comandos:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • Opção 3:use a configuração do dispositivo para definir as seguintes propriedades do lado do servidor:

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

Gerar perfis de imagem de inicialização

Use as instruções a seguir para gerar um perfil básico de imagem de inicialização usando testes em um único dispositivo.

  1. Configure o dispositivo.

    1. Configure o dispositivo conforme descrito em Configurar dispositivos.

    2. (Opcional) Leva tempo para o novo formato de perfil limpar e substituir os outros perfis. Para acelerar a coleta de perfis, redefina todos os perfis no dispositivo.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. Execute os CUJs no dispositivo.

  2. Capture o perfil usando o seguinte comando:

    adb shell cmd package snapshot-profile android
  3. Extraia o perfil usando o seguinte comando:

    adb pull /data/misc/profman/android.prof
  4. Navegue até os arquivos JAR do classpath de inicialização usando os seguintes comandos:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. Gere o perfil de imagem de inicialização usando o seguinte comando profman.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. Usando dados, ajuste o comando profman com as flags de limite de seleção disponíveis.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    Para conferir a lista completa, consulte a página de ajuda ou o código-fonte do profman.