O ambiente de execução do Android (ART) inclui um compilador Just in Time (JIT) com perfis de código que melhora continuamente o desempenho dos aplicativos Android durante a execução. O compilador JIT complementa o compilador atual do ART (AOT) e melhora o desempenho em tempo de execução, economiza espaço de armazenamento e acelera as atualizações do aplicativo e do sistema. Ele também melhora o compilador AOT evitando a lentidão do sistema durante atualizações automáticas de aplicativos ou recompilação de aplicativos durante atualizações over-the-air (OTA).
Embora o JIT e a AOT usem o mesmo compilador com um conjunto semelhante de otimizações, o código gerado pode não ser idêntico. O JIT usa informações do tipo de ambiente de execução, pode fazer um melhor alinhamento e possibilita a compilação de substituição de pilha (OSR, na sigla em inglês), o que gera um código um pouco diferente.
Arquitetura JIT
Compilação JIT
A compilação JIT envolve as seguintes atividades:
- O usuário executa o app, que aciona o ART para carregar o arquivo
.dex
.- Se o arquivo
.oat
(o binário AOT do arquivo.dex
) estiver disponível, o ART vai usá-lo diretamente. Embora os arquivos.oat
sejam gerados regularmente, eles nem sempre contêm código compilado (binário AOT). - Se o arquivo
.oat
não contiver código compilado, o ART será executado pelo JIT e pelo intérprete para executar o arquivo.dex
.
- Se o arquivo
- O JIT é ativado para qualquer aplicativo que não seja compilado de acordo com o
filtro de compilação
speed
, que diz "compile o máximo possível do app". - Os dados do perfil JIT são armazenados em um arquivo em um diretório do sistema que só o aplicativo pode acessar.
- O daemon de compilação AOT (
dex2oat
) analisa esse arquivo para direcionar a compilação.
Figura 3. Atividades do daemon JIT.
O serviço do Google Play é um exemplo usado por outros aplicativos que se comportam de maneira semelhante às bibliotecas compartilhadas.
Fluxo de trabalho JIT
- As informações de criação de perfil são armazenadas no cache do código e submetidas à coleta de lixo
sob pressão de memória.
- Não há garantia de que um snapshot feito quando o aplicativo estava em segundo plano vai conter dados completos (ou seja, tudo o que foi JIT).
- Não há tentativa de garantir que tudo seja gravado, já que isso pode afetar o desempenho do tempo de execução.
- Os métodos podem estar em três estados diferentes:
- interpretado (código dex)
- Compilado JIT
- Compilado com AOT
- O requisito de memória para executar o JIT sem afetar o desempenho do app em primeiro plano depende do app em questão. Apps grandes exigem mais memória do que apps pequenos. Em geral, os apps grandes estabilizam em cerca de 4 MB.
Ativar a geração de registros JIT
Para ativar o registro JIT, execute os seguintes comandos:
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
Desativar JIT
Para desativar o JIT, execute os seguintes comandos:
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
Forçar a compilação
Para forçar a compilação, execute o seguinte:
adb shell cmd package compile
Casos de uso comuns para forçar a compilação de um pacote específico:
- Com base no perfil:
adb shell cmd package compile -m speed-profile -f my-package
- Completo:
adb shell cmd package compile -m speed -f my-package
Casos de uso comuns para a compilação forçada de todos os pacotes:
- Com base no perfil:
adb shell cmd package compile -m speed-profile -f -a
- Completo:
adb shell cmd package compile -m speed -f -a
Limpar dados do perfil
No Android 13 ou versões anteriores
Para limpar os dados do perfil local e remover o código compilado, execute o seguinte:
adb shell pm compile --reset
No Android 14 ou versões mais recentes
Para limpar apenas os dados do perfil local:
adb shell pm art clear-app-profiles
Observação: ao contrário do comando para o Android 13 ou versões anteriores, esse comando não limpa os dados de perfil externos (".dm") que são instalados com o app.
Para limpar os dados do perfil local e remover o código compilado gerado a partir dos dados do perfil local (ou seja, para redefinir o estado de instalação), execute o seguinte:
adb shell pm compile --reset
Observação: esse comando não remove o código compilado gerado a partir de dados de perfil externos (".dm") que são instalados com o app.
Para limpar todo o código compilado, execute este comando:
adb shell cmd package compile -m verify -f
Observação: esse comando retém os dados locais do perfil.