O Android 11 ou superior é compatível 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 servidor do sistema e caminho de classe de inicialização. O Android Runtime (ART) usa essas informações para realizar otimizações em todo o sistema, algumas das quais são críticas para o desempenho do Android e afetam a execução de todos os códigos não nativos (nível do sistema ou do aplicativo). Em alguns casos, os perfis de imagem de inicialização podem afetar o desempenho de execução e o consumo de memória em porcentagens de dois dígitos.
Obtendo informações do perfil de inicialização
Os perfis de imagem de inicialização são derivados dos perfis de aplicativos executados durante jornadas críticas do usuário (CUJs). Em uma configuração de dispositivo específica, o ART captura (como parte dos perfis JIT) os métodos e classes do caminho de classe de inicialização usados pelos aplicativos e, em seguida, registra essas informações no perfil do aplicativo (por exemplo, /data/misc/profiles/cur/0/com.android.chrome/primary.prof
), onde é indexado pelo arquivo de caminho de classe de inicialização Dalvik EXecutable (DEX) (consulte ART profile format ).
Revise os perfis de aplicativo registrados durante CUJs para determinar qual parte do caminho de classe de inicialização é mais usada e mais importante para otimizar (por exemplo, consulte formato de perfil ART ). A inclusão de todos os métodos ou classes afeta negativamente o desempenho, portanto, concentre-se nos caminhos de código mais usados. Por exemplo, se um método do classpath de inicialização for usado por um único aplicativo, ele não deverá fazer parte dos perfis de inicialização. Cada dispositivo deve 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 caminho de classe de inicialização de todos os perfis de aplicativos individuais no dispositivo, execute o comando adb shell cmd package snapshot-profile android
. Você pode usar as informações agregadas como base para processamento e seleção de método/classe sem agregar manualmente os perfis individuais (embora você possa fazer isso se desejar).
Figura 1. Processo para obter perfis de imagem de inicialização
Dados de perfil de 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 caminho de classe de inicialização são otimizados, qual classe é incluída na imagem.art
de inicialização e como os arquivos DEX correspondentes são dispostos.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.art
de inicialização e como os arquivos DEX correspondentes são dispostos.
Formato de perfil ART
O perfil 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á habilitada, o ART também inclui o caminho de classe 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 utiliza.
Por exemplo, despeje o perfil da imagem de inicialização bruta 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 porcom.google.android.ext.services
ecom.android.systemui
. Cada entrada lista os dois pacotes usados docore-oj.jar
.Ambos os processos usam o método com índice DEX 520, mas apenas o processo
systemui
usa o método com í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 de nível de sistema (por exemplo, o servidor do sistema ou systemui
) ou a métodos que podem não ser comumente usados, mas ainda são importantes (por exemplo, métodos usados pelo aplicativo da câmera).
O formato do perfil anota internamente cada método com vários sinalizadores (inicialização, pós-inicialização, hotness, abi), que é mais do que é exibido no formato somente dump. Para fazer uso de todos os sinais, modifique os scripts disponíveis.
Recomendações
Use as seguintes diretrizes para obter 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
profman
suporta agregar e selecionar 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 que são usados pelos processos do sistema. Esses métodos/classes podem usar código que não é usado com frequência por outros aplicativos, mas ainda é essencial para otimizar.
A forma de dados de um único dispositivo executado parece 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 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).
Configurando dispositivos
Para habilitar a configuração do perfil de inicialização por meio das propriedades do sistema, use um dos métodos a seguir.
Opção 1: Configure manualmente os adereços (funciona para reiniciar):
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:Crie um arquivo
local.prop
com o conteúdo:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
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:
persist.device_config.runtime_native_boot.profilesystemserver persist.device_config.runtime_native_boot.profilebootclasspath`
Gerando perfis de imagem de inicialização
Use as instruções a seguir para gerar um perfil básico de imagem de inicialização usando o teste em um único dispositivo.
Configure o dispositivo.
Configure o dispositivo conforme descrito em Configurando 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 stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
Execute os CUJs no dispositivo.
Capture o perfil usando o seguinte comando:
adb shell cmd package snapshot-profile android
Extraia o perfil usando o seguinte comando:
adb pull /data/misc/profman/android.prof
Navegue até os arquivos JAR do caminho de classe de inicialização usando os seguintes comandos:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
Gere o perfil da 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
profman
usando os sinalizadores de limite de seleção disponíveis.-
--method-threshold
-
--class-threshold
-
--clean-class-threshold
-
--preloaded-class-threshold
-
--upgrade-startup-to-hot
-
--special-package
Para ver a lista completa, consulte a página de ajuda do
profman
ou o código-fonte.-