Чего нельзя делать на Dalvik VM (виртуальной машине Android), чего нельзя делать в Sun VM?

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
57
0
14 658
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

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

Несколько обновлений: есть специальная сборка Guice, которая будет работать на Android. code.google.com/p/google-guice/downloads/… У Google есть команда, работающая над JIT для Android. groups.google.com/group/android-platform/browse_thread/threa‌ d /…

Jesse Wilson 19.12.2009 05:25

Начиная с Android Froyo он поддерживает JIT-компилятор с гранулярностью трассировки.

Wonil 01.07.2010 18:40

Google Guice работает нормально. Ознакомьтесь с roboguice.org, чтобы узнать, как использовать guice на android.

emmby 13.04.2011 18:42

Загрузка байт-кода во время выполнения фактически возможна, но не для файлов .class. Используя DexClassLoader, вы можете загружать код из файлов .dex внутри файлов .jar. (Clojure на Android может загрузить байт-код JVM, запустив компилятор JVM-to-Dalvik через себя и включив его в приложение. Хотя это работает, это очень медленно .)

raek 01.08.2011 16:56

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

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

Кроме того, Dalvik использует след-гранулированность JIT вместо JIT детализации метода.

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

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

Другие вопросы по теме