O Android Runtime (ART) é o ambiente de execução gerenciado usado por apps e alguns serviços do sistema no Android. O ART e seu antecessor, Dalvik, foram originalmente criados especificamente para o projeto Android. O ART como ambiente de execução executa o formato Dalvik Executable (DEX) e a especificação de bytecode do DEX.
O ART e o Dalvik são ambientes de execução compatíveis com bytecode DEX. Por isso, os apps desenvolvidos para o Dalvik funcionarão com o ART. No entanto, algumas técnicas que funcionam no Dalvik não funcionam no ART. Para informações sobre os problemas mais importantes, consulte Como verificar o comportamento do app no Android Runtime (ART).
Recursos do ART
Confira alguns dos principais recursos implementados pelo ART.
Compilação antecipada (AOT)
O ART introduz a compilação antecipada (AOT, na sigla em inglês), que pode melhorar o desempenho do app. O ART também tem uma verificação mais rígida no momento da instalação do que o Dalvik.
No momento da instalação, o ART compila apps usando a ferramenta dex2oat no dispositivo. Esse utilitário aceita arquivos DEX como entrada e gera um app executável compilado para o dispositivo de destino. O utilitário precisa ser capaz de compilar todos os arquivos DEX válidos sem dificuldade. No entanto, algumas ferramentas de pós-processamento produzem arquivos inválidos que podem ser tolerados pelo Dalvik, mas não podem ser compilados pelo ART. Para mais informações, consulte Como resolver problemas de coleta de lixo.
Coleta de lixo aprimorada
A coleta de lixo (GC) consome muitos recursos, o que pode prejudicar a performance de um app, resultando em exibição entrecortada, baixa capacidade de resposta da interface e outros problemas. O ART melhora a coleta de lixo de várias maneiras:
- Design principalmente concorrente com uma única pausa de GC
- Cópia simultânea para reduzir o uso e a fragmentação da memória em segundo plano
- A duração da pausa da GC é independente do tamanho do heap
- Coletor com tempo de GC total mais baixo para o caso especial de limpeza de objetos alocados recentemente e de curta duração
- Melhoria na ergonomia da coleta de lixo, tornando as coletas
simultâneas mais rápidas, o que torna os eventos
GC_FOR_ALLOC
extremamente raros em casos de uso típicos.
Melhorias no desenvolvimento e na depuração
O ART oferece vários recursos para melhorar o desenvolvimento e a depuração de apps.
Suporte para o criador de perfil de amostragem
Historicamente, os desenvolvedores usavam a ferramenta Traceview (projetada para rastrear a execução do app) como um criador de perfil. Embora o Traceview forneça informações úteis, os resultados dele no Dalvik foram distorcidos pela sobrecarga de chamada de método, e o uso da ferramenta afeta visivelmente o desempenho do tempo de execução.
O ART adiciona suporte a um perfilador de amostragem dedicado que não tem essas limitações. Isso fornece uma visão mais precisa da execução do app sem lentidão significativa. O suporte à amostragem foi adicionado ao Traceview para Dalvik na versão KitKat.
Suporte a mais recursos de depuração
O ART oferece suporte a várias novas opções de depuração, principalmente em funções relacionadas à coleta de lixo e ao monitor. Por exemplo, você pode:
- Confira quais bloqueios são mantidos em stack traces e, em seguida, pule para a linha de execução que mantém um bloqueio.
- Pergunte quantas instâncias ativas há de uma determinada classe, peça para ver as instâncias e veja quais referências estão mantendo um objeto ativo.
- Filtrar eventos (como pontos de interrupção) para uma instância específica.
- Confira o valor retornado por um método quando ele sai (usando eventos "method-exit").
- Defina o ponto de verificação de campo para suspender a execução de um programa quando um campo específico for acessado e/ou modificado.
Melhorias nos detalhes de diagnóstico em exceções e relatórios de erros
O ART oferece o máximo de contexto e detalhes possível quando ocorrem exceções de execução. O ART oferece detalhes de exceção expandidos para java.lang.ClassCastException
,
java.lang.ClassNotFoundException
e java.lang.NullPointerException
.
As versões mais recentes do Dalvik forneceram detalhes de exceção expandidos para java.lang.ArrayIndexOutOfBoundsException
e java.lang.ArrayStoreException
,
que agora incluem o tamanho da matriz e o deslocamento fora dos limites, e o ART
também faz isso.
Por exemplo, java.lang.NullPointerException
agora mostra informações sobre o que o app estava tentando fazer com o ponteiro nulo,
como o campo em que o app estava tentando gravar ou o método que ele estava tentando
chamar. Alguns exemplos:
java.lang.NullPointerException: Attempt to write to field 'int android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
A ART também oferece informações de contexto aprimoradas nos relatórios de erros nativos do app, incluindo informações de Java e de pilha nativa.
Denunciar problemas
Se você encontrar problemas que não sejam devidos a problemas de JNI do app, informe
no Issue Tracker do projeto
Android Open Source. Inclua um adb bugreport
e um link para
o app na Google Play Store, se disponível. Caso contrário, se possível, anexe um
APK que reproduza o problema.