O Android 11 ou mais recente oferece suporte à geração de perfis de imagem de inicialização, que encapsulam informações sobre o código de vários componentes 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 das quais são essenciais para o desempenho do Android e afetam a execução de todo o código não nativo (sistema ou 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 do dispositivo, o ART captura
(como parte dos perfis JIT) os métodos e classes de classpath de inicialização usados pelos
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 Dalvik EXecutable (DEX) do classpath de inicialização (consulte Formato do perfil do
ART).
Analise os perfis de apps gravados durante as CUJs para determinar qual parte do classpath de inicialização é mais usada e mais importante para otimizar (para um exemplo, consulte Formato do perfil do ART). A inclusão de todos os métodos ou classes afeta negativamente o desempenho. Portanto, concentre-se nos caminhos de código usados com frequência. Por exemplo, se um método do classpath de inicialização 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 apps 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 perfis individuais (embora seja possível fazer isso, se quiser).
Figura 1. Processo para receber perfis de imagem de inicialização
Dados do perfil de imagem de inicialização
Os perfis de imagem de inicialização incluem os seguintes arquivos e dados.
Perfil do 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.artde inicialização.Lista de classes pré-carregadas. Determina quais classes são pré-carregadas no Zygote.
Perfil dos 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.artde inicialização e como os arquivos DEX correspondentes são dispostos.
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 a criação de perfil de imagem de inicialização está ativada, o 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 de imagem de inicialização bruta com o seguinte comando:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.profIsso 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 porcom.google.android.ext.servicesecom.android.systemui. Cada entrada lista os dois pacotes usados decore-oj.jar.Ambos os processos usam o método com o índice DEX 520, mas apenas o processo
systemuiusa o método com o índice DEX 521. O mesmo raciocínio se aplica às outras seções de perfil (por exemplo, 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 da câmera).
O formato do perfil anota internamente cada método com várias flags (inicialização, pós-inicialização, frequência, ABI), que é mais do que o exibido no formato somente de despejo. Para usar todos os indicadores, modifique os scripts disponíveis.
Recomendações
Use as diretrizes a seguir para 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 de imagem de inicialização final. A ferramenta
profmanoferece suporte à agregação e 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 pelos processos do sistema. Esses métodos/classes podem usar um código que não é usado com frequência por outros apps, mas ainda é essencial para otimizar.
O formato dos dados de uma única execução de dispositivo é muito diferente dos dispositivos de teste que executam CUJs reais. Se você não tiver uma grande frota de dispositivos de teste, use o mesmo dispositivo para executar várias CUJs para aumentar a confiança de que as otimizações do perfil de imagem de inicialização funcionarão bem na produção. Esse cenário é descrito abaixo.
Configurar dispositivos
Para ativar a configuração do perfil de inicialização pelas propriedades do sistema, use um dos seguintes métodos.
Opção 1:configure as propriedades manualmente (funciona até a reinicialização):
adb rootadb shell stopadb shell setprop dalvik.vm.profilebootclasspath trueadb shell setprop dalvik.vm.profilesystemserver trueadb shell startOpção 2:use um
local.prop(efeito permanente até que o arquivo seja excluído). Para fazer isso, siga estas etapas:Crie um arquivo
local.propcom o conteúdo:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=trueExecute os comandos a seguir:
adb push local.prop /data/adb shell chmod 0750 /data/local.propadb 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 de imagem de inicialização básico usando testes em um único dispositivo.
Configure o dispositivo.
Configure o dispositivo conforme descrito em Configurar dispositivos.
(Opcional) Leva tempo para que o novo formato de perfil limpe e substitua os outros perfis. Para acelerar a coleta de perfis, redefina todos os perfis no dispositivo.
adb shell stopadb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"adb shell startExecute as CUJs no dispositivo.
Capture o perfil usando o seguinte comando:
adb shell cmd package snapshot-profile androidExtraia o perfil usando o seguinte comando:
adb pull /data/misc/profman/android.profNavegue até os arquivos JAR do classpath de inicialização usando os seguintes comandos:
m distls $ANDROID_PRODUCT_OUT/boot.zipGere 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=...Usando dados, ajuste o comando
profmanusando 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.