Что вы не можете делать на виртуальной машине Dalvik (Android-виртуальной машине), которую вы можете делать в Sun VM? - PullRequest
55 голосов
/ 23 октября 2008

Я знаю, что вы можете запустить почти всю Java в Виртуальная машина Dalvik , что вы можете в Виртуальная машина Java , но ограничения не очень ясны. Кто-нибудь сталкивался с серьезными камнями преткновения? Какие-нибудь крупные библиотеки имеют проблемы? Любые языки, которые компилируются в байт-код Java ( Scala , Jython и т. Д ...), не работают должным образом?

Ответы [ 4 ]

33 голосов
/ 24 октября 2008

Существует ряд вещей, которые Dalvik не будет обрабатывать или не будет обрабатывать так же, как стандартный байт-код Java, хотя большинство из них довольно продвинуты.

Наиболее строгим примером является генерация байт-кода во время выполнения и загрузка пользовательских классов. Допустим, вы хотите создать некоторый байт-код, а затем использовать загрузчик классов, чтобы загрузить его для вас. Если этот трюк работает на вашем обычном компьютере, он гарантированно не будет работать на Dalvik, если вы не измените генерацию байт-кода.

Это не позволяет вам использовать определенные структуры внедрения зависимостей, наиболее известным примером является Google Guice (хотя я уверен, что некоторые люди работают над этим). С другой стороны, AspectJ должен работать, поскольку он использует инструментарий байт-кода в качестве шага компиляции (хотя я не знаю, пытался ли кто-нибудь).

Что касается других языков jvm - все, что в конце концов компилируется в стандартный байт-код и не использует инструментарий байт-кода во время выполнения, может быть преобразовано в Dalvik и должно работать. Я знаю, что люди запускали Jython на Android, и он работал нормально.

Другая вещь, о которой следует знать, это то, что нет просто во времени компиляции . Это не является проблемой Dalviks (вы всегда можете скомпилировать любой байт-код на лету), но Android не поддерживает это и вряд ли сделает это. В то время как микробенчмаркинг для стандартной Java был бесполезен - компоненты имели разные характеристики времени выполнения в тестах, чем как части более крупных систем - микробенчмарки для телефонов Android имеют смысл.

11 голосов
/ 05 марта 2010

Если вы видите " Внутренние компоненты виртуальной машины Dalvik ", сеанс Google IO, вы можете обнаружить, что Dalvik не поддерживает GC поколения.

Таким образом, это может ухудшить производительность частого создания и удаления объектов. Java VM поддерживает генерацию GC, поэтому она продемонстрировала бы лучшую производительность GC для той же ситуации.

А также, Dalvik использует след-гранулярность JIT вместо метода гранулярности JIT.

2 голосов
/ 14 января 2012

Еще одна вещь, которую, я думаю, можно было бы добавить, это то, что Dalvik, очевидно, не сохраняет порядок полей при перечислении полей класса с использованием API отражения. Теперь API отражения не дает никаких гарантий на него (так что в идеале вы не должны зависеть от него), но большинство других виртуальных машин do сохраняют порядок.

0 голосов
/ 15 марта 2014

Просто для добавления к разговору, не предназначенного для оживления старой темы. Я просто наткнулся на это в своем поиске и хочу добавить, что Jython не работает из коробки с Dalvik. Простая попытка сделать пример с hello world приведет к следующему:

...