Автор (ы) оригинала | Дэн Борнштейн |
---|---|
Репозиторий | |
Операционная система | Ядро Linux |
Платформа | Android |
Преемник | Среда выполнения Android |
Тип | Виртуальная машина |
Лицензия | Лицензия Apache 2.0 |
Веб-сайт | источник |
Dalvik - это виртуальная машина (ВМ) с прекращенной поддержкой процесса в операционной системе Android, которая выполняет приложения, написанные для Android. [1] (Формат байт-кода Dalvik по-прежнему используется в качестве формата распространения, но больше не во время выполнения в новых версиях Android.) Dalvik был неотъемлемой частью стека программного обеспечения Android в (теперь не поддерживаемой) версии Android 4.4 «KitKat» и ранее. , которые обычно использовались на мобильных устройствах, таких как мобильные телефоны и планшетные компьютеры , а также на некоторых устройствах, таких как смарт-телевизоры и носимые устройства . Dalvik - программное обеспечение с открытым исходным кодом, первоначально написанный Дэном Борнштейном, который назвал его в честь рыбацкой деревни Далвик в Эйяфьордуре , Исландия . [2] [3]
Программы для Android обычно пишутся на Java и компилируются в байт-код для виртуальной машины Java , который затем транслируется в байт-код Dalvik и сохраняется в файлах.dex
( Dalvik EXecutable ) и .odex
( Optimized Dalvik EXecutable ); связанные термины odex и de-odex связаны с соответствующими преобразованиями байт-кода. Компактный формат исполняемого файла Dalvik разработан для систем с ограниченными объемами памяти и скоростью процессора .
Преемником Dalvik является Android Runtime (ART), в которой используются те же файлы байт-кода и .dex (но не файлы .odex), с целью повышения производительности, прозрачной для конечных пользователей . Новая среда выполнения была включена в первый раз в Android 4.4 «KitKat» как технология предварительного просмотра , [4] [5] и заменить Dalvik полностью в более поздних версиях; Android 5.0 «Lollipop» - первая версия, в которую включена только среда исполнения ART.
В отличие от виртуальных машин Java , которые представляют собой стековые машины , виртуальная машина Dalvik использует архитектуру на основе регистров, которая требует меньшего количества, как правило, более сложных инструкций виртуальной машины. Программы Dalvik пишутся на Java с использованием интерфейса прикладного программирования Android (API), компилируются в байт-код Java и при необходимости преобразуются в инструкции Dalvik.
Названный инструмент dx
используется для преобразования файлов Java .class в формат .dex. Несколько классов включены в один файл .dex. Повторяющиеся строки и другие константы, используемые в нескольких файлах классов, включаются в вывод .dex только один раз для экономии места. Байт- код Java также преобразуется в альтернативный набор инструкций, используемый виртуальной машиной Dalvik. Несжатый файл .dex обычно на несколько процентов меньше по размеру, чем сжатый архив Java (JAR), полученный из тех же файлов .class. [6]
Исполняемые файлы Dalvik могут быть снова изменены при установке на мобильное устройство. Чтобы получить дополнительную оптимизацию , порядок байтов может быть изменен местами в определенных данных, простые структуры данных и библиотеки функций могут быть связаны в строке , а пустые объекты классов могут быть, например, коротко замкнуты.
Dalvik оптимизирован для малых требований к памяти и обладает некоторыми особенностями, которые отличают его от других стандартных виртуальных машин: [7]
Согласно Google, конструкция Dalvik позволяет устройству эффективно запускать несколько экземпляров виртуальной машины. [8]
Android 2.2 «Froyo» привнес в Dalvik JIT-компиляцию на основе трассировки , оптимизируя выполнение приложений за счет постоянного профилирования приложений каждый раз, когда они запускаются, и динамической компиляции часто выполняемых коротких сегментов их байт-кода в собственный машинный код . В то время как Dalvik интерпретирует остальную часть байт-кода приложения, собственное выполнение этих коротких сегментов байт-кода, называемых «трассировками», обеспечивает значительное улучшение производительности. [9] [10] [11]
Относительные преимущества стековых машин по сравнению с подходами, основанными на регистрах, являются предметом постоянных дискуссий. [12]
Как правило, машины на основе стека должны использовать инструкции для загрузки данных в стек и манипулирования этими данными, и, таким образом, для реализации одного и того же высокоуровневого кода требуется больше инструкций, чем регистровые машины , но инструкции в регистровой машине должны кодировать исходный код. и регистры назначения и, следовательно, имеют тенденцию быть больше. Это различие важно для интерпретаторов виртуальных машин, для которых отправка кодов операций, как правило, является дорогостоящей, наряду с другими факторами, имеющими отношение к своевременной компиляции .
Тесты, проведенные на устройствах ARMv7 в 2010 году компанией Oracle (владелец технологии Java) со стандартными неграфическими тестами Java, показали, что виртуальная машина HotSpot для встроенной Java SE в 2–3 раза быстрее, чем виртуальная машина Dalvik на основе JIT для Android 2.2 ( первоначальный выпуск Android, включающий JIT-компилятор). [13] В 2012 году академические тесты подтвердили коэффициент 3 между HotSpot и Dalvik на одной плате Android, а также отметили, что код Dalvik был не меньше Hotspot. [14]
Кроме того, по состоянию на март 2014 [Обновить]года тесты, выполненные на устройстве Android, по-прежнему показывают коэффициент 100 между собственными приложениями и приложением Dalvik на том же устройстве Android. [15] [ оригинальное исследование? ] [ неправильный синтез? ] После выполнения тестов с использованием раннего интерпретатора 2009 года и Java Native Interface (JNI), и собственный код показали ускорение на порядок. [16]
Dalvik публикуется на условиях лицензии Apache License 2.0. [17] Некоторые говорят, что Dalvik - это реализация « чистой комнаты», а не разработка поверх стандартной среды выполнения Java, что означает, что он не наследует лицензионные ограничения, основанные на авторских правах, от стандартной версии или редакции Java с открытым исходным кодом. время выполнения. [18] Oracle и некоторые обозреватели оспаривают это. [19]
12 августа 2010 г. Oracle , которая приобрела Sun Microsystems в апреле 2009 г. и, следовательно, владеет правами на Java, подала в суд на Google в связи с заявленным нарушением авторских прав и патентов. Oracle утверждала, что Google при разработке Android сознательно, прямо и неоднократно нарушал интеллектуальную собственность Oracle, связанную с Java. [20] [21] [22] В мае 2012 года присяжные по этому делу пришли к выводу, что Google не нарушал патенты Oracle, и судья постановил, что структура Java API, используемых Google, не подлежит авторскому праву. [23] [24] Стороны договорились о нулевом размере установленной законом компенсации за 9 строк скопированного кода. [25] [26]
Среда выполнения Dalvik больше не поддерживается и не доступна [в текущих версиях Android], и ее формат байтового кода теперь используется ART.
Результаты показывают, что, хотя новая JIT-версия Android представляет собой усовершенствование по сравнению с ее реализацией только через интерпретатор, Android по-прежнему отстает по производительности от Java SE Embedded с поддержкой Hotspot. Как видно из приведенных выше результатов, Java SE Embedded может выполнять байт-коды Java в 2–3 раза быстрее, чем Android 2.2.
Однако в режиме JITC Dakvik медленнее, чем HotSpot, более чем в 2,9 раза, а размер его сгенерированного кода не меньше, чем у HotSpot из-за худшего качества кода и кода трассировки.
Результаты показывают, что собственные приложения C могут быть в 30 раз быстрее, чем идентичный алгоритм, работающий в Dalvik VM. Приложения Java могут ускориться до 10 раз при использовании JNI.
Определение «чистой комнаты» заключается в том, что инженеры, пишущие код, не имеют прямого доступа к исходным материалам, защищенным авторским правом, включая код, спецификации и другую документацию.
Это проблема для Google, как я отмечал во вчерашнем сообщении, потому что есть существенные доказательства того, что инженеры, работающие над проектом, имели прямой доступ к материалам, защищенным авторским правом.
Основная часть заявлений Oracle основана на 9 строках кода, содержащихся в Java.Util.Arrays.rangeCheck ().
Вот код, о котором идет речь: ...