¿Qué no puedes hacer en la VM de Dalvik (VM de Android) que puedes usar en Sun VM?

Sé que se puede ejecutar casi todos los Java en VM de Dalvik que se puede en la VM de Java, pero las limitaciones no son muy claras. ¿Alguien ha tropezado con grandes obstáculos? ¿Las bibliotecas más importantes tienen problemas? ¿Los lenguajes que compilan código de bytes Java ( Scala , Jython etc …) no funcionan como se esperaba?

Hay varias cosas que Dalvik no manejará o no manejará de la misma manera que el bytecode estándar de Java, aunque la mayoría de ellos son bastante avanzados.

El ejemplo más grave es la generación de bytecode en tiempo de ejecución y la carga de clase personalizada. Digamos que le gustaría crear algún bytecode y luego usar el cargador de clases para cargarlo para usted, si ese truco funciona en su máquina normal, está garantizado 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 debe funcionar como se utiliza instrumentación bytecode como un paso de compilación (aunque no sé si alguien intentó).

En cuanto a otros lenguajes jvm – cualquier cosa que al final compila al bytecode estándar y no utiliza instrumentación bytecode en tiempo de ejecución puede convertirse a Dalvik y debería funcionar. Sé que la gente ejecutó Jython en Android y funcionó bien.

Otra cosa a tener en cuenta es que no hay compilación justo a tiempo . Esto no es estrictamente problema de Dalviks (siempre se puede compilar cualquier bytecode sobre la marcha si lo desea), pero que Android no es compatible con eso y es poco probable que lo haga. En el efecto, mientras que el microbenchmarking para Java estándar era inútil – los componentes tenían diferentes características de ejecución en pruebas que como partes de sistemas más grandes – los microbenchmarks para teléfonos Android tienen sentido.

Si usted ve " interna de Dalvik Virtual Machine " sesión de Google IO, puede encontrar Dalvik no es compatible GC generacional .

Por lo tanto, podría degradar el rendimiento de la creación y eliminación de objetos frecuentes. Java VM admite CG generacional, por lo que mostraría un mejor rendimiento de GC para la misma situación.

Y también, Dalvik usa trace-granuality JIT en lugar de método granityity JIT.

Otra cosa que supongo que podría agregarse 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, el API de reflexión no hace ninguna garantía en él de todos modos (así que idealmente usted no debe depender de él de todos modos), pero la mayoría de los otros VMs hacia fuera allí preservan la orden.

Sólo para añadir a la conversación, no pretende revivir un hilo antiguo. Acabo de correr a través de esto en mi búsqueda, y quiero añadir que Jython no funciona fuera de la caja con Dalvik tampoco. Simplemente tratando de hacer un ejemplo de mundo hola producirá lo siguiente:

  • Android Studio Emulator - Instancia de Java no admite JVM de 32 bits
  • ¿Cómo funciona NDK en Android - ¿Cuál es la orden que NDK, JNI etc se utilizan?
  • Intellij idea que muestra error: no se pudo crear la máquina virtual java
  • Casting resultado de la multiplicación de dos enteros positivos a largo es el valor negativo
  • Instalación de Android Studio, no apunta a un error de instalación de JVM válido
  • ¿El sistema android incluye JVM?
  • No se pudo crear la máquina virtual de Java
  • La máquina basada en la pila depende de una máquina basada en registro?
  • No hay suficiente memoria para realizar la operación solicitada-Android studio
  • ¿Cómo se ajustan jvm args para la memoria dex en gradle?
  • Android studio 1.1 - cambiar JRE utilizado para ejecutar el estudio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.