Среда выполнения Art была добавлена еще в Android 4.4 KitKat в качестве теста. Она начала работать рядом с виртуальной машиной Dalvik и включалась/выключалась вручную, чтобы пользователи могли почувствовать разницу между Art и Dalvik.
Главное отличие между ними — это подход в запуске приложений. То есть приложения на Андроиде хранятся в apk-файлах. Когда мы нажимаем на иконку приложения, то запускается именно этот вид файла. Такие файлы можно обрабатывать несколькими способами, среда выполнения Art и виртуальная машина Dalvik использовали совершенно разные подходы:
виртуальная машина Dalvik для компиляции приложений применяла подход JIT, что подразумевает компиляцию приложения непосредственно при его запуске, очень часто такой подход характеризуется весьма долгим временем ожидания;
среда выполнения Art для компиляции приложений использует подход АОТ, что подразумевает предварительную компиляцию приложений еще на стадии их инсталляции на устройство.
Среда выполнения Art
Среда выполнения Art несет в себе главное преимущество — это более ускоренный запуск приложений на самом устройстве за счет того, что приложение скомпилировано на стадии установки. Однако такой подход имеет и обратную сторону — на стадии установки приложений требуется намного больше времени, чем при Dalvik, плюс для самого приложения требуется больше места в хранилище устройства. Но в дальнейшем нагрузка на процессор и энергопотребление устройства значительно уменьшаются.
Изначально, когда среда выполнения Art была внедрена в Андроид в качестве теста, пользователи активно сравнивали между собой два подхода для запуска приложений — Art и Dalvik — на производительность, энергопотребление, скорость загрузки и установки приложений и т. д. В разных видах тестирования разные подходы показывали лучшие результаты. То есть в глобальном смысле обе эти виртуальные машины были на равных позициях, поэтому смотреть только в сторону Art или Dalvik не несло в себе смысла. Например, если у пользователя было устройство с ограниченным хранилищем, но он пользовался большим количеством приложений, то ему сподручней было использовать Dalvik, так как при таком подходе приложения занимали меньше места на устройстве. Если ограничений с памятью не было, то можно было применять Art и наслаждаться более быстрым запуском и работой приложений. Но это было на Android 4.4, на которой еще можно было выбирать среду выполнения.
На всех версиях Андроида, которые были ниже 4.4, стояла виртуальная машина Dalvik. А начиная с Android 5.0, среда выполнения Art полностью вытеснила с устройств Dalvik.
Сравниваем Dalvik и Art
Виртуальная машина Dalvik несла в себе следующие особенности:
использование JIT-подхода для компиляции приложений;
при компиляции компилировался не весь код, а лишь тот, который был необходим для работы приложения, а весь остальной код при необходимости компилировался динамически;
само устройство быстро загружалось, потому что не было необходимости сразу загружать кэш приложений;
программы, работающие на Dalvik, требуют намного меньше оперативной памяти, чем программы, работающие на Art;
эта виртуальная машина больше расходовала батарею за счет большей нагрузки процессора устройства.
Среда выполнения Art несет в себе следующие особенности:
применяет АОТ-подход при компиляции приложений, что ускоряет их запуск и работу;
устройства загружаются дольше за счет того, что должен загрузится кэш всех установленных приложений;
такой подход уменьшает нагрузку на батарею и процессор устройства;
требует большей памяти хранилища самого устройства из-за того, что приложения при их инсталляции сразу компилируются и занимают много места.
Но главным отличием Art от Dalvik считается отказ от JIT и использование АОТ. Однако так было до Android 7.0. Потому что в этой версии Андроида было решено возродить JIT, что и было сделано.
Современная среда выполнения Art — это AOT и JIT вместе
Современные версии Android используют среду выполнения Art, в которой сочетаются два казавшихся несовместимыми подхода для компиляции приложений: JIT и AOT. Вроде бы изначально разработчики бежали от «долгого» JIT, но со временем пришло понимание, что этот подход по-своему хорош, поэтому его внедрили в Art.
JIT не применяется как основной способ компилирования приложений, а всего лишь как дополнительный инструмент, который «подключается» на определенных этапах. Например, изначально компиляция приложений запускается на JIT, а в это время АОТ лишь «наблюдает» за ходом работы. АОТ замечает, какие участки кода приложения выполняются чаще, и берет их компиляцию на себя во время бездействия смартфона. Таким образом, в следующий раз при запуске приложения и «этих» участков кода в работу вступит AOT.
Такая совместная реализация принесла свои особенности, например:
компиляция приложений происходит с большей эффективностью, потому что при таком смешанном подходе компилятор о приложении «узнает» намного больше, чем при раздельной компиляции;
существенно экономится оперативная и постоянная память, то есть не нужно компилировать все приложение при его установке, но и не нужно постоянно динамически компилировать все приложение в процессе работы, потому что компилируется и остается скомпилированной только та часть приложения, которой пользуется пользователь устройства;
ускорена первая загрузка операционной системы приложений на устройство, потому что не применяется «чистый» АОТ-подход.
Заключение
Среда выполнения Art плотно занимала свои позиции в Андроидах версий 5.0-7.0 и показала свои преимущества. Однако старый JIT-подход не собирался сдаваться, поэтому «вернулся» в Андроид 7.0, создав отличный тандем JIT+AOT, который работает на современных версиях Android.
Другое