Оригинальный автор(ы) | Дэн Борнштейн |
---|---|
Репозиторий |
|
Операционная система | ядро Linux |
Платформа | андроид |
Преемник | Android-среда выполнения |
Тип | Виртуальная машина |
Лицензия | Лицензия Apache 2.0 |
Веб-сайт | source.android.com/devices/tech/dalvik/index.html |
Dalvik — это упразднённая виртуальная машина (ВМ) в операционной системе Android , которая выполняет приложения, написанные для Android. [1] (Формат байт-кода Dalvik по-прежнему используется в качестве формата распространения, но больше не во время выполнения в новых версиях Android.) Dalvik был неотъемлемой частью программного стека Android в (теперь неподдерживаемых) версиях Android 4.4 «KitKat» и более ранних, которые обычно использовались на мобильных устройствах, таких как мобильные телефоны и планшетные компьютеры , и ещё больше на некоторых устройствах, таких как смарт-телевизоры и носимые устройства . Dalvik — это программное обеспечение с открытым исходным кодом , изначально написанное Дэном Борнстейном, который назвал его в честь рыбацкой деревни Далвик в Эйяфьорде , Исландия . [2] [3]
Программы для Android обычно пишутся на Java и компилируются в байт-код для Java Virtual Machine , который затем транслируется в байт-код Dalvik и сохраняется в файлах .dex
( Dalvik EXecutable ) и .odex
( Optimized Dalvik EXecutable ); связанные термины odex и de-odex связаны с соответствующими преобразованиями байт-кода. Компактный формат Dalvik Executable предназначен для систем, которые ограничены по памяти и скорости процессора .
Преемником Dalvik является Android Runtime (ART), который использует тот же байт-код и файлы .dex (но не файлы .odex), с целью повышения производительности. Новая среда выполнения была впервые включена в Android 4.4 "KitKat" в качестве технологического предварительного просмотра [ 4] [5] и полностью заменила Dalvik в более поздних версиях; Android 5.0 "Lollipop" является первой версией, в которой ART является единственной включенной средой выполнения.
Dalvik, названный в честь города в Исландии его создателем Дэном Борнстейном [6] , был разработан для встраиваемых устройств с очень низким объемом оперативной памяти и процессора [7] для запуска кода Java и в конечном итоге поддержки C++ для «тяжелых приложений» и JavaScript для «легких приложений, похожих на виджеты» в качестве языков первого класса с Java, обслуживающей все остальное. Android Native Development Kit , который в конечном итоге проложил путь для поддержки C++, существует с момента первого публичного выпуска Dalvik. По словам Борнстейна, отображение исполняемых файлов и библиотек в памяти между несколькими процессами и создание более быстрого интерпретатора с семантикой на основе регистров во многом определили раннюю разработку набора инструкций с байтовым выравниванием и виртуальной машины. Опыт работы с J2ME на Sidekick в Danger , Борнстейн обнаружил, что он был слишком урезанным и довольно ограниченным для Android. В то время как улучшения, такие как Isolates , которые тогда планировала Sun, сделали изоляцию процессов неосуществимой, поскольку она нарушила модель безопасности Android внутри устройства. Для Dalvik VM Борнштейн в частности черпал вдохновение из книги «The Case for Register Machines» [6], написанной Брайаном Дэвисом и его коллегами из Тринити-колледжа в Дублине. [8]
Dalvik был открыт под лицензией Apache License v2, как и остальная часть Android Open Source Project в 2008 году. [9]
В отличие от виртуальных машин Java , которые являются стековыми машинами , виртуальная машина Dalvik использует архитектуру на основе регистров , которая требует меньше, как правило, более сложных инструкций виртуальной машины. Программы Dalvik пишутся на Java с использованием интерфейса программирования приложений Android (API), компилируются в байт-код Java и преобразуются в инструкции Dalvik по мере необходимости.
Инструмент, называемый dx
используется для преобразования файлов Java .class в формат .dex. Несколько классов включены в один файл .dex. Дублирующиеся строки и другие константы, используемые в нескольких файлах классов, включаются только один раз в вывод .dex для экономии места. Байт-код Java также преобразуется в альтернативный набор инструкций, используемый виртуальной машиной Dalvik. Несжатый файл .dex обычно на несколько процентов меньше по размеру, чем сжатый архив Java (JAR), полученный из тех же файлов .class. [10]
Исполняемые файлы Dalvik могут быть изменены снова при установке на мобильное устройство. Для получения дальнейшей оптимизации порядок байтов может быть изменен в определенных данных, простые структуры данных и библиотеки функций могут быть связаны в строке , а пустые объекты классов могут быть закорочены, например.
Dalvik оптимизирован для низких требований к памяти и имеет некоторые специфические характеристики, которые отличают его от других стандартных виртуальных машин: [11]
По данным Google, конструкция Dalvik позволяет устройству эффективно запускать несколько экземпляров виртуальной машины. [12]
Android 2.2 "Froyo" привнес в Dalvik трассировочную компиляцию just-in-time (JIT) , оптимизируя выполнение приложений путем постоянного профилирования приложений при каждом запуске и динамической компиляции часто выполняемых коротких сегментов их байт-кода в машинный код . В то время как Dalvik интерпретирует остальную часть байт-кода приложения, собственное выполнение этих коротких сегментов байт-кода, называемых "трассами", обеспечивает значительное повышение производительности. [13] [14] [15]
Сравнительные преимущества стековых машин по сравнению с подходами на основе регистров являются предметом продолжающихся дискуссий. [16]
Как правило, стековые машины должны использовать инструкции для загрузки данных в стек и манипулирования этими данными, и, таким образом, требуют больше инструкций, чем регистровые машины для реализации того же высокоуровневого кода , но инструкции в регистровой машине должны кодировать исходные и целевые регистры и, следовательно, имеют тенденцию быть больше. Это различие важно для интерпретаторов VM, для которых отправка опкода имеет тенденцию быть дорогостоящей, наряду с другими факторами, аналогичным образом относящимися к компиляции «точно в срок» .
Тесты, проведенные на устройствах ARMv7 в 2010 году компанией Oracle (владелец технологии Java) со стандартными неграфическими тестами Java, показали, что встроенная виртуальная машина HotSpot Java SE в 2–3 раза быстрее, чем виртуальная машина Dalvik на основе JIT Android 2.2 (первоначальный выпуск Android, включающий JIT-компилятор). [17] В 2012 году академические тесты подтвердили множитель 3 между HotSpot и Dalvik на одной и той же плате Android, также отметив, что код Dalvik не меньше, чем Hotspot. [18]
Более того, по состоянию на март 2014 года [обновлять]тесты, выполненные на устройстве Android, по-прежнему показывают разницу до 100 раз между собственными приложениями и приложением Dalvik на том же устройстве Android. [19] [ оригинальное исследование? ] [ неправильный синтез? ] При запуске тестов с использованием раннего интерпретатора 2009 года и Java Native Interface (JNI), и собственный код показали ускорение на порядок. [20]
Dalvik публикуется на условиях Apache License 2.0. [21] Некоторые [ кто? ] говорят, что Dalvik — это реализация в чистой комнате, а не разработка поверх стандартной среды выполнения Java, что означает, что она не наследует ограничения лицензии, основанные на авторских правах, ни от стандартной версии, ни от среды выполнения Java с открытым исходным кодом. [22] Oracle и некоторые обозреватели оспаривают это. [23]
12 августа 2010 года Oracle , которая приобрела Sun Microsystems в апреле 2009 года и, следовательно, владеет правами на Java, подала в суд на Google за предполагаемое нарушение авторских прав и патентов. Oracle утверждала, что Google при разработке Android сознательно, напрямую и неоднократно нарушала интеллектуальную собственность Oracle, связанную с Java. [24] [25] [26] В мае 2012 года присяжные по этому делу установили, что Google не нарушала патенты Oracle, а судья постановил, что структура API Java, используемая Google, не подлежит защите авторских прав. [27] [28] Стороны согласились на нулевую компенсацию за 9 строк скопированного кода. [29] [30]
Среда выполнения Dalvik больше не поддерживается и не доступна [в текущих версиях Android], а ее формат байт-кода теперь используется ART.
{{cite book}}
: |journal=
проигнорировано ( помощь )Результаты показывают, что хотя новый 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(). Вот код, о котором идет речь:...