Что нельзя сделать в Dalvik VM (ВМ Android), но можно в Sun VM?
Я знаю, что почти весь Java-код можно выполнять в Dalvik VM, как и в Java VM, но ограничения не очень ясны. Столкнулся ли кто-то с серьезными проблемами? Есть ли крупные библиотеки, которые вызывают трудности? Работают ли неродные языки, компилирующиеся в Java bytecode (Scala, Jython и т.д.) так, как ожидалось?
2 ответ(ов)
Есть несколько моментов, которые Dalvik не будет обрабатывать или будет обрабатывать не совсем так, как стандартный Java байт-код, хотя большинство из них достаточно сложные.
Самый серьезный пример — это генерация байт-кода во время выполнения и пользовательская загрузка классов. Допустим, вы хотите создать некоторый байт-код и затем использовать ClassLoader для его загрузки. Если этот трюк работает на вашей обычной машине, то он определенно не сработает на Dalvik, если вы не измените свою генерацию байт-кода.
Это ограничивает использование некоторых фреймворков для внедрения зависимостей, наиболее известным примером является Google Guice (хотя, безусловно, некоторые люди работают над этим). С другой стороны, AspectJ должен работать, поскольку использует инструментирование байт-кода на этапе компиляции (хотя я не знаю, пробовал ли кто-то это).
Что касается других языков JVM — все, что в итоге компилируется в стандартный байт-код и не использует инструментирование байт-кода во время выполнения, можно конвертировать в Dalvik, и оно должно работать. Я знаю, что люди запускали Jython на Android, и это работало нормально.
Еще один момент, который стоит учитывать, это то, что в Dalvik нет компиляции "на лету". Это не совсем проблема Dalvik (вы всегда можете компилировать любой байт-код на лету, если хотите), но Android этого не поддерживает и вряд ли будет поддерживать в будущем. В результате, в то время как микробенчмаркинг для стандартного Java был бесполезен — компоненты имели разные характеристики времени выполнения в тестах по сравнению с частями более крупных систем — микробенчмарки для Android-устройств совершенно имеют смысл.
Еще одной вещью, которую я хотел бы добавить, является то, что Dalvik, по всей видимости, не сохраняет порядок полей при перечислении полей класса с использованием API рефлексии. Тем не менее, API рефлексии фактически не предоставляет никаких гарантий по этому поводу (так что, в идеале, вы не должны на это полагаться), но большинство других виртуальных машин все-таки сохраняют порядок полей.
Ошибка «Необходимо переопределить метод суперкласса» после импорта проекта в Eclipse
Использование контекста в фрагменте
Как заставить Android-устройство вибрировать с разной частотой?
Room - Директория экспорта схемы не указана аннотационному процессору, не удается экспортировать схему
Почему компилятор Java 11 использует invokevirtual для вызова приватных методов?