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




Есть ряд вещей, которые Dalvik не будет обрабатывать или не будет обрабатывать так же, как стандартный байт-код Java, хотя большинство из них являются довольно продвинутыми.
самый серьезный пример - генерация байт-кода во время выполнения и загрузка пользовательского класса. Допустим, вы хотите создать какой-то байт-код, а затем использовать загрузчик классов, чтобы загрузить его за вас. Если этот трюк работает на вашем обычном компьютере, он гарантированно не будет работать на Dalvik, если вы не измените генерацию байт-кода.
Это мешает вам использовать определенные фреймворки для внедрения зависимостей, наиболее известным примером которых является Google Guice (хотя я уверен, что некоторые люди над этим работают). С другой стороны, AspectJ должен работать, поскольку он использует инструментарий байт-кода в качестве этапа компиляции (хотя я не знаю, пробовал ли кто-нибудь).
Что касается других языков jvm - все, что в конце концов компилируется в стандартный байт-код и не использует инструментарий байт-кода во время выполнения, может быть преобразовано в Dalvik и должно работать. Я знаю, что люди запускали Jython на Android, и он работал нормально.
Еще нужно знать, что есть не вовремя компиляция. Это не совсем проблема Dalviks (вы всегда можете скомпилировать любой байт-код на лету, если хотите), но Android не поддерживает это и вряд ли будет это делать. В результате, хотя микробенчмаркинг для стандартной Java был бесполезен - компоненты имели другие характеристики во время выполнения в тестах, чем как части более крупных систем - микробенчмарки для телефонов Android полностью имеют смысл.
Начиная с Android Froyo он поддерживает JIT-компилятор с гранулярностью трассировки.
Google Guice работает нормально. Ознакомьтесь с roboguice.org, чтобы узнать, как использовать guice на android.
Загрузка байт-кода во время выполнения фактически возможна, но не для файлов .class. Используя DexClassLoader, вы можете загружать код из файлов .dex внутри файлов .jar. (Clojure на Android может загрузить байт-код JVM, запустив компилятор JVM-to-Dalvik через себя и включив его в приложение. Хотя это работает, это очень медленно .)
Если вы видите "Внутреннее устройство виртуальной машины Dalvik" сеанс ввода-вывода Google, вы можете обнаружить, что Dalvik не поддерживает генеральный сборщик мусора.
Таким образом, это может снизить производительность частого создания и удаления объектов. Java VM поддерживает сборку мусора поколений, поэтому в той же ситуации она покажет лучшую производительность сборщика мусора.
Кроме того, Dalvik использует след-гранулированность JIT вместо JIT детализации метода.
Я думаю, здесь можно добавить еще одну вещь: Dalvik, по-видимому, не сохраняет порядок полей при перечислении полей класса с использованием API отражения. Теперь API отражения в любом случае не дает никаких гарантий (так что в идеале вы все равно не должны зависеть от него), но большинство других виртуальных машин делать сохраняют порядок.
Просто чтобы добавить к разговору, а не возродить старую ветку. Я только что наткнулся на это в своем поиске и хочу добавить, что Jython также не работает из коробки с Dalvik. Простая попытка создать пример hello world даст следующее:
Несколько обновлений: есть специальная сборка Guice, которая будет работать на Android. code.google.com/p/google-guice/downloads/… У Google есть команда, работающая над JIT для Android. groups.google.com/group/android-platform/browse_thread/threa d /…