2008-10-23 3 views
54

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

ответ

32

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

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

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

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

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

+6

Несколько обновлений: Существует специальная сборка 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 –

+10

Из Android Froyo он поддерживает компилятор JIT-гранулярности. – Wonil

+2

Google Guice отлично работает. Ознакомьтесь с http://roboguice.org, как использовать guice для android. – emmby

11

Если вы видите «Dalvik Virtual Machine internals» сеанс Google IO, вы можете найти Dalvik не поддерживает generational GC.

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

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

2

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

-1

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

 Смежные вопросы

  • Нет связанных вопросов^_^