Запускает ли ART код приложений изначально?

Поскольку новая среда выполнения ART компилирует приложения AOT, мне было интересно, включает ли запуск приложения виртуальную машину или код выполняется непосредственно в системе. Мне не удалось извлечь эту информацию из статей в Интернете, поскольку некоторые упоминают виртуальную машину, а другие говорят о том, что приложения компилируются в файлы ELF (насколько мне известно, двоичный формат, используемый ядром Linux, предполагает, что приложения запускаются изначально).
Может ли кто-нибудь помочь мне в этом?
BPou

Ответы (1)

Краткая история: да, ART переводит приложения в код, родной для реальной архитектуры телефона, и поэтому приложения выполняются изначально без необходимости JIT-компилятора.

Долгая история: из соображений совместимости приложения по-прежнему объединяются в apks, несущие код Java, скомпилированный в файлы dex. Но вместо того, чтобы просто оптимизировать код .dex и выполнить его внутри Dalvik VM (DVM), код компилируется в собственный код. Это делается на устройстве с помощью инструмента под названием dex2oat , где файлы oat встроены в обычный формат файлов ELF.

На следующем рисунке показана разница между использованием DVM и ART:

Схема архитектуры среды выполнения Android, воссозданная на основе информации, опубликованной на сайте A Closer Look at Android RunTime (ART) в Android L. (http://anandtech.com/show/8231/a-closer-look-at-android-runtime). -искусство-в-андроиде-л/)( Википедия : Схема архитектуры Android Run Time, воссозданная на основе информации, опубликованной на сайте A Closer Look at Android RunTime (ART) в Android L. )

Повышение производительности связано с тем, что DVM использовала JIT-компиляцию каждый раз при запуске приложения, в то время как AOT-компиляция происходит только во время установки.

Но скомпилированный файл ELF — это не отдельный исполняемый двоичный файл, а общий объект. Он по-прежнему загружается в память вместе с другими зависимостями тем же app_process, что запускает zygoteи разветвляет виртуальные машины для system_serverвсех приложений.
Действительно, Android использует большой набор оптимизаций для ускорения запуска и производительности приложений во время выполнения, таких как загрузка фактического файла oat кода приложения в предварительно подготовленный процесс, который уже загружает библиотеки и даже предварительно заполненную кучу часто используемыми объектами. .
Добавление этих строк к вашему ответу даст ощущение большей полноты :)