Sé que puede ejecutar casi todos los Java en Dalvik's VM que puede en VM de Java pero las limitaciones no son muy claras. ¿Alguien ha tropezado con algún obstáculo importante? ¿Alguna biblioteca importante tiene problemas? Los idiomas que se compilan en el código de bytes de Java (Scala, Jython etc.) no funcionan como se esperaba?¿Qué no puedes hacer en la VM Dalvik (máquina virtual de Android) que puedes en Sun VM?
Respuesta
Hay varias cosas que Dalvik no manejará o no manejará del mismo modo que el bytecode estándar de Java, aunque la mayoría de ellas son bastante avanzadas.
El ejemplo más grave de es la generación de bytecode en tiempo de ejecución y la carga de clase personalizada. Digamos que le gustaría crear un bytecode y luego usar el cargador de clases para cargarlo, si ese truco funciona en su máquina normal, se garantiza que no funcionará en Dalvik, a menos que cambie su generación de bytecode.
Eso le impide utilizar ciertos marcos de inyección de dependencia, el ejemplo más conocido es Google Guice (aunque estoy seguro de que algunas personas trabajan en eso). Por otro lado, AspectJ debería funcionar ya que usa la instrumentación bytecode como un paso de compilación (aunque no sé si alguien lo intentó).
En cuanto a otros lenguajes jvm, cualquier cosa que al final se compile con un bytecode estándar y no use instrumentación bytecode en el tiempo de ejecución se puede convertir a Dalvik y debería funcionar. Sé que la gente sí ejecutó Jython en Android y funcionó bien.
Otra cosa a tener en cuenta es que hay compilación no acaba a tiempo. Esto no es estrictamente un problema de Dalviks (siempre puedes compilar cualquier bytecode sobre la marcha si lo deseas) pero eso no es compatible con Android y es poco probable que lo haga. En el efecto, mientras que la microenmarcación para Java estándar era inútil, los componentes tenían caracteres característicos de tiempo de ejecución diferentes en las pruebas que como parte de sistemas más grandes, las micro marcas para teléfonos Android tienen mucho sentido.
Si ve "Dalvik Virtual Machine internals" sesión de Google IO, puede encontrar que Dalvik no es compatible con generational GC.
Por lo tanto, podría degradar el rendimiento de la creación y eliminación frecuente de objetos. Java VM admite el GC generacional, por lo que mostraría un mejor rendimiento del GC para la misma situación.
Y también, Dalvik usa trace-granuality JIT en lugar del método granuality JIT.
Otra cosa que creo que se podría agregar aquí es que Dalvik aparentemente no conserva el orden de los campos al listar los campos de una clase usando la API de reflexión. Ahora, la API de reflexión no ofrece ninguna garantía sobre ella de todos modos (por lo que, idealmente, no deberías depender de ella de todos modos), pero la mayoría de las otras VM que existen hacen conservan el orden.
Solo para agregar a la conversación, no para revivir un hilo viejo. Acabo de encontrar esto en mi búsqueda, y quiero agregar que Jython tampoco funciona de la misma manera con Dalvik. Simplemente tratando de hacer un ejemplo de hello world obtendrá lo siguiente:
- 1. ¿Cómo mejorarías Dalvik? La máquina virtual de Android
- 2. Recolección de basura en dalvik vm
- 3. Error de Dalvik VM: Excepción encontrada "Javax.xml.namespace.QName.class"
- 4. ¿Qué no puedes hacer en C que puedes hacer en Objective-C?
- 5. significado de Dalvik códigos VM VFY
- 6. Ejecución de una aplicación JNI en Sun VM bajo Valgrind
- 7. ¿Qué son alternativas a Java VM?
- 8. Escribir un compilador; que VM?
- 9. ¿Qué patrones puedes usar con la herencia de prototipos que no puedes con la clase?
- 10. Portando Java VM de Android al iPhone?
- 11. ¿Por qué no puedes UnRegisterStartupScript?
- 12. Ejecutar JIRA en una VM
- 13. Problemas de inicialización de clases cargando java.util.logging.LogManager en Android Dalvik VM
- 14. Limitar memoria de Python VM
- 15. Configuración Java VM line.separator
- 16. ¿Cuánta memoria podría utilizar vm
- 17. Prueba VM en el repositorio GIT
- 18. Muestreo en visual vm
- 19. ¿Hay Dart VM disponible?
- 20. Tutorial/recurso para implementar VM
- 21. ¿Cómo identificar que se está ejecutando en una máquina virtual?
- 22. ¿Puedes hacer "un borde invisible"?
- 23. ¿Cómo guarda y restaura la máquina virtual Dalvik sus registros entre llamadas a métodos?
- 24. ¿Puedes hacer telnet a ssh?
- 25. Identificación de CPU en la máquina virtual
- 26. ¿Deberían las aplicaciones de Erlang separar compartir la misma VM en la misma máquina?
- 27. ¿Qué clases son absolutamente necesarias para ejecutar una VM Java?
- 28. ¿Qué haces cuando no puedes usar ViewState?
- 29. Tamaño de montón mínimo de manifiesto de Android VM
- 30. Causas posibles de Java VM EXCEPTION_ACCESS_VIOLATION?
Algunas actualizaciones: Hay una versión especial de Guice que funcionará en Android. http://code.google.com/p/google-guice/downloads/detail?name=guice-2.0-no_aop.jar Google tiene un equipo que trabaja en un JIT para Android. http: // groups.google.com/group/android-platform/browse_thread/thread/331d5f5636f5f532 –
Desde Android Froyo es compatible con el compilador JIT de traza-granularidad. – Wonil
Google Guice funciona bien. Consulte http://roboguice.org para saber cómo usar guice en Android. – emmby