2008-10-23 15 views

Respuesta

32

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.

+6

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 –

+10

Desde Android Froyo es compatible con el compilador JIT de traza-granularidad. – Wonil

+2

Google Guice funciona bien. Consulte http://roboguice.org para saber cómo usar guice en Android. – emmby

11

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.

2

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.

-1

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:

Cuestiones relacionadas