0

Что нельзя сделать в Dalvik VM (ВМ Android), но можно в Sun VM?

1

Я знаю, что почти весь Java-код можно выполнять в Dalvik VM, как и в Java VM, но ограничения не очень ясны. Столкнулся ли кто-то с серьезными проблемами? Есть ли крупные библиотеки, которые вызывают трудности? Работают ли неродные языки, компилирующиеся в Java bytecode (Scala, Jython и т.д.) так, как ожидалось?

2 ответ(ов)

0

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

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

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

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

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

0

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь