Я знаю, что вы можете запускать почти все Java в VM Dalvik, которые вы можете использовать в Java VM, но ограничения не очень ясны. Кто-нибудь сталкивается с какими-либо крупными камнями преткновения? У большинства крупных библиотек есть проблемы? Любые языки, которые компилируются в байт-код Java (Scala, Jython и т. Д.) Не работают должным образом?Что вы можете сделать на VM Dalvik (виртуальная машина Android), которую вы можете использовать в Sun VM?
ответ
Существует ряд вещей, которые Dalvik не будет обрабатывать или не будет обрабатывать точно так же, как стандартный байт-код Java, хотя большинство из них довольно продвинуты.
Наиболее серьезным примером является время генерации байтового кода времени исполнения и загрузка пользовательского класса. Предположим, вы хотели бы создать некоторый байт-код, а затем использовать загрузчик классов для загрузки его для вас, если этот трюк работает на вашей обычной машине, гарантированно не будет работать на Dalvik, если вы не измените генерацию байт-кода.
Это препятствует использованию определенных фреймворков инъекций зависимостей, наиболее известным примером которых является Google Guice (хотя я уверен, что некоторые люди работают над этим). С другой стороны, AspectJ должен работать, поскольку он использует инструментарий для байт-кода в качестве этапа компиляции (хотя я не знаю, если кто-то пытался).
Что касается других языков jvm - все, что в конце компилируется в стандартный байт-код и не использует инструментарий для байт-кода во время выполнения, может быть преобразовано в Dalvik и должно работать. Я знаю, что люди запускали Jython на Android, и все работает нормально.
Другая вещь, о которой нужно знать, это то, что есть нет как раз вовремя компиляция. Это не строго проблема Dalviks (вы всегда можете скомпилировать любой байт-код на лету, если хотите), но этот Android не поддерживает это и вряд ли это сделает. В то время как микробичмаркинг для стандартной Java был бесполезен - компоненты имели разные характеристики времени исполнения в тестах, а не как части более крупных систем - микрообъективы для телефонов Android имеют смысл.
Если вы видите «Dalvik Virtual Machine internals» сеанс Google IO, вы можете найти Dalvik не поддерживает generational GC.
Таким образом, это может ухудшить производительность частых создания и удаления объектов. Java VM поддерживает генераторный GC, поэтому он показал бы лучшую производительность GC для той же ситуации.
А также Dalvik использует trace-granuality JIT вместо метода гранументации JIT.
Другое, что, я думаю, можно добавить здесь, что Dalvik, по-видимому, не сохраняет порядок полей при перечислении полей класса с использованием API отражения. Теперь API-интерфейс отражения не дает никаких гарантий на все это (так что в идеале вы не должны зависеть от него в любом случае), но большинство других виртуальных машин там do сохранить заказ.
Просто добавьте к разговору, не предназначенному для оживления старой темы. Я просто наткнулся на это в своем поиске и хочу добавить, что Jython тоже не работает из коробки с Dalvik. Просто попытка сделать пример приветствия приведет к следующему:
Несколько обновлений: Существует специальная сборка Guice, которая будет работать на Android. http://code.google.com/p/google-guice/downloads/detail?name=guice-2.0-no_aop.jar У Google есть команда, работающая над JIT для Android. http: // группы.google.com/group/android-platform/browse_thread/thread/331d5f5636f5f532 –
Из Android Froyo он поддерживает компилятор JIT-гранулярности. – Wonil
Google Guice отлично работает. Ознакомьтесь с http://roboguice.org, как использовать guice для android. – emmby