Ответ 1
Существует ряд вещей, которые Dalvik не будет обрабатывать или не будет обрабатывать точно так же, как стандартный байт-код Java, хотя большинство из них довольно продвинуты.
Самый сильный пример - это генерация байт-кода времени выполнения и загрузка пользовательского класса. Скажем, вы хотели бы создать некоторый байт-код, а затем использовать загрузчик классов для загрузки его для вас, если этот трюк работает на вашей обычной машине, гарантированно не будет работать на Dalvik, если вы не измените генерацию байткода.
Это предотвращает использование определенных фреймворков инъекций зависимостей, наиболее известным примером которых является Google Guice (хотя я уверен, что некоторые люди работают над этим). С другой стороны, AspectJ должен работать, поскольку он использует инструментарий для байт-кода в качестве этапа компиляции (хотя я не знаю, если кто-то пытался).
Что касается других языков jvm - все, что в конце компилируется в стандартный байт-код и не использует инструментарий для байт-кода во время выполнения, может быть преобразовано в Dalvik и должно работать. Я знаю, что люди запускали Jython на Android, и он работал нормально.
Другая вещь, о которой нужно помнить, заключается в том, что существует не только компиляция времени. Это не строго проблема Dalviks (вы всегда можете скомпилировать любой байт-код на лету, если хотите), но этот Android не поддерживает это и вряд ли это сделает. В то время как микрообъектизация для стандартной Java была бесполезной - компоненты имели разные характеристики времени исполнения в тестах, а не как части более крупных систем - микрообъективы для телефонов Android имеют смысл.