Articulo de referencia

Dalvik (software)

Dalvik es una máquina virtual (VM) de proceso descontinuada en el sistema operativo Android que ejecuta aplicaciones escritas para Android. [ 1 ] (El formato de bytecode de Dalv...

Dalvik es una máquina virtual (VM) de proceso descontinuada en el sistema operativo Android que ejecuta aplicaciones escritas para Android. [ 1 ] (El formato de bytecode de Dalvik todavía se usa como formato de distribución, pero ya no en tiempo de ejecución en versiones más recientes de Android). Dalvik fue una parte integral de la pila de software de Android en las versiones (ahora sin soporte) de Android 4.4 "KitKat" y anteriores, que se usaban comúnmente en dispositivos móviles como teléfonos móviles y computadoras de escritorio , y más en algunos dispositivos como televisores inteligentes y wearables . Dalvik es software de código abierto , escrito originalmente por Dan Bornstein, quien lo nombró en honor al pueblo pesquero de Dalvík en Eyjafjörður , Islandia . [ 2 ] [ 3 ]

Los programas para Android suelen escribirse en Java y Kotlin , y se compilan a código de bytes para la Máquina Virtual de Java . Este código se traduce a código de bytes Dalvik y se almacena en archivos ejecutables Dalvik.dex y ejecutables Dalvik optimizados . Los términos odex y de-odex se asocian a las conversiones de código de bytes correspondientes. El formato compacto de ejecutable Dalvik está diseñado para sistemas con limitaciones de memoria y velocidad de procesador ..odex

El sucesor de Dalvik es Android Runtime (ART), que utiliza el mismo código de bytes y archivos .dex (pero no archivos .odex), con el objetivo de mejorar el rendimiento. El nuevo entorno de ejecución se incluyó por primera vez en Android 4.4 "KitKat" como una vista previa tecnológica , [ 4 ] [ 5 ] y reemplazó por completo a Dalvik en versiones posteriores; Android 5.0 "Lollipop" es la primera versión en la que ART es el único entorno de ejecución incluido.

Historia

Dalvik, nombrado en honor a una ciudad de Islandia por su creador Dan Bornstein, [ 6 ] fue diseñado para dispositivos integrados con muy poca RAM y CPU [ 7 ] para ejecutar código Java, y eventualmente admitir C++ para "aplicaciones de alto rendimiento" y JavaScript para "aplicaciones ligeras tipo widget" como lenguajes de primera clase, mientras que Java se encargaba del resto. El Android Native Development Kit , que finalmente allanó el camino para la compatibilidad con C++, ha existido desde el primer lanzamiento público de Dalvik. Según Bornstein, el mapeo de memoria de ejecutables y bibliotecas a través de múltiples procesos y la creación de un intérprete más rápido con semántica basada en registros impulsaron gran parte del diseño inicial del conjunto de instrucciones alineado a bytes y la máquina virtual. La experiencia trabajando con J2ME en Sidekick at Danger , Bornstein descubrió que era demasiado simplificado y bastante limitado para Android. Si bien las mejoras como Isolates , tal como las planeó Sun en ese momento, hicieron que el aislamiento de procesos fuera inviable, ya que rompía el modelo de seguridad intra-dispositivo de Android. Para Dalvik VM, Bornstein se inspiró particularmente en The Case for Register Machines [ 6 ] escrito por Brian Davis et al. del Trinity College de Dublín. [ 8 ]

Dalvik se publicó como código abierto bajo la licencia Apache v2, al igual que el resto del proyecto de código abierto de Android, en 2008. [ 9 ]

Arquitectura

Comparación de las arquitecturas Dalvik y ART

A diferencia de las máquinas virtuales Java , que son máquinas de pila , la máquina virtual Dalvik utiliza una arquitectura basada en registros que requiere menos instrucciones, aunque generalmente más complejas. Los programas Dalvik se escriben en Java utilizando la interfaz de programación de aplicaciones (API) de Android , se compilan a bytecode Java y se convierten a instrucciones Dalvik según sea necesario.

Se utiliza una herramienta dxpara convertir archivos .class de Java al formato .dex. Varias clases se incluyen en un único archivo .dex. Las cadenas duplicadas y otras constantes utilizadas en varios archivos de clase se incluyen solo una vez en la salida .dex para ahorrar espacio. El código de bytes de Java también se convierte a un conjunto de instrucciones alternativo utilizado por la máquina virtual Dalvik. Un archivo .dex sin comprimir suele ser un pequeño porcentaje más pequeño que un archivo JAR ( Java Archive ) comprimido derivado de los mismos archivos .class. [ 10 ]

Los ejecutables de Dalvik pueden modificarse nuevamente al instalarlos en un dispositivo móvil. Para obtener optimizaciones adicionales , se puede intercambiar el orden de los bytes en ciertos datos, enlazar directamente estructuras de datos simples y bibliotecas de funciones , y, por ejemplo, omitir la ejecución de objetos de clase vacíos.

Al estar optimizado para bajos requisitos de memoria, Dalvik tiene algunas características específicas que lo diferencian de otras máquinas virtuales estándar: [ 11 ]

  • La máquina virtual se optimizó para que ocupara menos espacio.
  • El conjunto de constantes se ha modificado para usar solo índices de 32 bits con el fin de simplificar el intérprete .
  • El código de bytes estándar de Java ejecuta instrucciones de pila de 8 bits . Las variables locales deben copiarse hacia o desde la pila de operandos mediante instrucciones independientes. Dalvik, en cambio, utiliza su propio conjunto de instrucciones de 16 bits que opera directamente sobre las variables locales. La variable local se suele seleccionar mediante un campo de "registro virtual" de 4 bits . Esto reduce el número de instrucciones de Dalvik y aumenta la velocidad de su intérprete.

El diseño de Dalvik permite que un dispositivo ejecute múltiples instancias de la máquina virtual de manera eficiente. [ 12 ] [ 13 ]

Android 2.2 "Froyo" introdujo la compilación just-in-time (JIT) basada en trazas en Dalvik, optimizando la ejecución de aplicaciones mediante el análisis continuo de las mismas cada vez que se ejecutan y la compilación dinámica de segmentos cortos de su código de bytes, ejecutados con frecuencia, en código máquina nativo . Mientras Dalvik interpreta el resto del código de bytes de la aplicación, la ejecución nativa de esos segmentos cortos, denominados "trazas", proporciona mejoras significativas en el rendimiento. [ 14 ] [ 15 ] [ 16 ] Los posibles encabezados de traza se identifican en la parte frontal del compilador en la etapa de análisis y después de la conversión del código de bytes. Se mantiene una caché de traducción durante el tiempo de ejecución. Se pueden encadenar varias trazas para reducir la sincronización entre el compilador y el intérprete. La traza se optimiza convirtiéndola al formato de Asignación Estática Única , lo que permite optimizaciones como la eliminación de almacenamiento muerto, el plegado de variables y la inserción en línea de getters y setters. [ 12 ]

Actuación

Un teléfono con alimentación Dalvik

Las ventajas relativas de las máquinas de pila frente a los enfoques basados ​​en registros son objeto de un debate continuo. [ 17 ]

En general, las máquinas basadas en pila deben usar instrucciones para cargar datos en la pila y manipularlos, por lo que requieren más instrucciones que las máquinas de registro para implementar el mismo código de alto nivel . Sin embargo, las instrucciones en una máquina de registro deben codificar los registros de origen y destino, por lo que tienden a ser más extensas. Esta diferencia es importante para los intérpretes de máquinas virtuales, para los cuales el despacho de códigos de operación suele ser costoso, junto con otros factores igualmente relevantes para la compilación justo a tiempo .

Las pruebas realizadas en dispositivos ARMv7 en 2010 por Oracle (propietario de la tecnología Java) con benchmarks Java estándar no gráficos mostraron que la máquina virtual HotSpot de Java SE Embedded era 2 a 3 veces más rápida que la máquina virtual Dalvik basada en JIT de Android 2.2 (la versión inicial de Android que incluía un compilador JIT). [ 18 ] En 2012, los benchmarks académicos confirmaron el factor de 3 entre HotSpot y Dalvik en la misma placa Android, señalando también que el código Dalvik no era más pequeño que el de HotSpot. [ 19 ]

Además, a partir de marzo de 2014 , las pruebas de rendimiento realizadas en un dispositivo Android aún muestran hasta un factor de 100 entre las aplicaciones nativas y una aplicación Dalvik en el mismo dispositivo Android. [ 20 ] Al ejecutar pruebas de rendimiento utilizando el intérprete inicial de 2009, tanto la interfaz nativa de Java (JNI) como el código nativo mostraron una aceleración de un orden de magnitud. [ 21 ]

Licencias y patentes

Dalvik se publica bajo los términos de la Licencia Apache 2.0. [ 22 ] Algunos afirman que Dalvik es una implementación completamente nueva, en lugar de un desarrollo sobre un entorno de ejecución Java estándar, lo que implicaría que no hereda las restricciones de licencia basadas en derechos de autor de los entornos de ejecución Java de edición estándar o de código abierto. [ 23 ] Oracle y algunos revisores discrepan de esta afirmación. [ 24 ]

El 12 de agosto de 2010, Oracle , que adquirió Sun Microsystems en abril de 2009 y, por lo tanto, posee los derechos de Java, demandó a Google por presunta infracción de derechos de autor y patentes. Oracle alegó que Google, al desarrollar Android, infringió de manera consciente, directa y reiterada la propiedad intelectual de Oracle relacionada con Java. [ 25 ] [ 26 ] [ 27 ] En mayo de 2012, el jurado en este caso determinó que Google no infringió las patentes de Oracle, y el juez de primera instancia dictaminó que la estructura de las API de Java utilizadas por Google no era susceptible de protección por derechos de autor. [ 28 ] [ 29 ] Las partes acordaron una indemnización legal de cero dólares por 9 líneas de código copiadas. [ 30 ] [ 31 ]

Véase también

Referencias

  1. "Depuración de la recolección de basura de ART" . Consultado el 6 de octubre de 2015. El entorno de ejecución Dalvik ya no recibe mantenimiento ni está disponible [en las versiones actuales de Android] y su formato de código de bytes ahora lo utiliza ART.
  2. Entrada del diario que hace referencia a la fuente del nombre
  3. "Google Calling: Inside Android, the gPhone SDK" . onlamp.com . Archivado del original el 10 de enero de 2017. Consultado el 5 de febrero de 2008 .
  4. Sean Buckley (06-11-2013) .El experimento 'ART' en Android KitKat mejora la duración de la batería y acelera las aplicaciones . Engadget . Consultado el 5 de julio de 2014 .
  5. Daniel P. (2013-11-07). "El entorno de ejecución experimental Google ART en Android KitKat puede lograr ejecuciones de aplicaciones dos veces más rápidas" . phonearena.com . Consultado el 2014-07-05 .
  6. 1 2 Sesión de preguntas y respuestas en directo con Dan Bornstein, creador de la máquina virtual Dalvik . InfoQ . 29 de septiembre de 2015 vía YouTube.
  7. Google I/O 2008 - Funcionamiento interno de la máquina virtual Dalvik . Google . 4 de junio de 2008 vía YouTube.
  8. Davis, Brian; Beatty, Andrew; Casey, Kevin; Gregg, David; T Waldron, John (8 de junio de 2003). «Argumentos a favor de las máquinas de registro virtual» (PDF) . Actas del taller de 2003 sobre intérpretes, máquinas virtuales y emuladores . págs. 41-49 . doi : 10.1145/858570.858575 . ISBN  1-58113-655-2Archivado del original (PDF) el 1 de febrero de 2024.{{cite book}}: |journal=ignorado ( ayuda )
  9. Beschizza, Rob (12 de noviembre de 2007). "Android SDK abierto para código" . WIRED .{{cite magazine}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  10. Bornstein, Dan (29 de mayo de 2008). "Presentación de los aspectos internos de la máquina virtual Dalvik" (PDF) . pág. 22. Archivado del original (PDF) el 16 de abril de 2017. Consultado el 16 de agosto de 2010 . 
  11. Rose, John (31 de mayo de 2008). "Con Android y Dalvik en Google I/O" . Archivado del original el 4 de junio de 2008. Consultado el 8 de junio de 2008 .
  12. ^ Ramanan , Neeraja (12 de diciembre de 2011). "JIT a través de los tiempos" (PDF) .
  13. Google (13 de abril de 2009). "¿Qué es Android?" . Archivado del original el 27 de junio de 2009. Consultado el 19 de abril de 2009 .
  14. Ben Cheng; Bill Buzbee (mayo de 2010). "Un compilador JIT para la máquina virtual Dalvik de Android" (PDF) . android-app-developer.co.uk . págs. 5–14 . Archivado del original (PDF) el 6 de noviembre de 2015. Consultado el 18 de marzo de 2015 . 
  15. Phil Nickinson (26 de mayo de 2010). "Desarrollador de Android de Google explica más sobre Dalvik y el JIT en Froyo" . androidcentral.com . Archivado del original el 14 de julio de 2014. Consultado el 8 de julio de 2014 .
  16. "Nexus One ejecuta Android 2.2 Froyo. ¿Qué tan rápido es comparado con 2.1? Oh, solo un 450% más rápido" . 13 de mayo de 2010. Consultado el 21 de mayo de 2010 .
  17. Shi, Yunhe; Gregg, David; Beatty, Andrew; Ertl, M. Anton (11 de junio de 2005). "Virtual Machine Showdown: Stack Versus Registers" (PDF) . Recuperado el 22 de diciembre de 2009 .
  18. Vandette, Bob (22/11/2010). "Rendimiento de Java SE Embedded frente a Android 2.2" . Oracle Corporation . Archivado del original el 28/06/2011 . Recuperado el 04/09/2011 . Los resultados muestran que, si bien el nuevo JIT de Android es una mejora con respecto a su implementación solo de intérprete, Android todavía está por detrás del rendimiento de nuestro Java SE Embedded habilitado para Hotspot. Como puede verse en los resultados anteriores, Java SE Embedded puede ejecutar bytecodes de Java de 2 a 3 veces más rápido que Android 2.2.
  19. Hyeong-Seok Oh; Beom-Jun Kim; Hyung-Kyu Choi; Soo-Mook Moon (2012). Actas del 10.º Taller Internacional sobre Tecnologías Java para Sistemas en Tiempo Real y Embebidos - JTRES '12 . Association for Computing Machinery . p. 115. doi : 10.1145/2388936.2388956 . ISBN  9781450316880. S2CID 36316611 . Sin embargo, en el modo JITC, Dakvik es más lento que HotSpot en más de 2,9 veces y el tamaño de su código generado no es menor que el de HotSpot debido a su peor calidad de código y código de encadenamiento de trazas. 
  20. "Mejores puntuaciones de AndEBench" . www.eembc.org . Consultado el 23 de marzo de 2014 .
  21. Batyuk, Leonid; Schmidt, Aubrey-Derrick; Schmidt, Hans-Gunther; Camtepe, Ahmet; Albayrak, Sahin (29 de abril de 2009). "Desarrollo y evaluación comparativa de aplicaciones nativas de Linux en Android". MobileWireless Middleware, sistemas operativos y aplicaciones . Notas de clase del Instituto de Ciencias de la Computación, Informática Social e Ingeniería de Telecomunicaciones. Vol. 7. págs. 381–392 . Bibcode : 2009mmos.book..381B . doi : 10.1007/978-3-642-01802-2_28 . ISBN   978-3-642-01801-5S2CID 12131309. Los resultados muestran que las aplicaciones nativas en C pueden ser hasta 30 veces más rápidas que un algoritmo idéntico ejecutándose en la máquina virtual Dalvik. Las aplicaciones Java pueden alcanzar una aceleración de hasta 10 veces si utilizan JNI. 
  22. "Descargando el árbol de código fuente - Android Open Source" . Android.git.kernel.org. Archivado del original el 17 de abril de 2009. Consultado el 7 de junio de 2012 .
  23. Garling, Caleb. "Expertos de Google y Oracle se enfrentan por la imitación de Java en Android" . Wired .
  24. Ed Bott (8 de septiembre de 2011). "La verdadera historia de Java y Android, según Google" . ZDNet . Consultado el 27 de noviembre de 2011. La definición de una implementación de "sala limpia" es que los ingenieros que escriben el código no tienen exposición directa al material original protegido por derechos de autor, incluyendo el código, las especificaciones y otra documentación. Eso es un problema para Google, como señalé en la publicación de ayer, porque hay evidencia sustancial de que los ingenieros que trabajaron en el proyecto tuvieron acceso directo al material protegido por derechos de autor.
  25. "Oracle demanda a Google por Java en dispositivos Android" . digitaltrends.com. 13 de agosto de 2010. Consultado el 8 de agosto de 2011 .
  26. James Niccolai (12 de agosto de 2010). "Oracle demanda a Google por el uso de Java en Android" . Computerworld . Archivado del original el 1 de abril de 2023. Consultado el 13 de agosto de 2010 .
  27. Mark Hachman (13 de agosto de 2010). "Oracle demanda a Google por el uso de Java en Android" . PC Magazine . Ziff Davis .
  28. Josh Lowensohn (23 de mayo de 2012). "El jurado absuelve a Google de infringir las patentes de Oracle" . ZDNet . Consultado el 25 de mayo de 2012 .
  29. Joe Mullin (31 de mayo de 2012). "Google gana un fallo crucial sobre la API, el caso de Oracle queda destrozado" . Ars Technica . Consultado el 1 de junio de 2012 .
  30. Niccolai, James (20 de junio de 2012). "Oracle acepta una indemnización 'cero' en la demanda contra Google y contempla apelar" . Archivado del original el 1 de abril de 2023. Consultado el 23 de junio de 2012 .
  31. Adam Outler (16 de mayo de 2012). "Actualización sobre el juicio de Oracle contra Google" . Archivado del original el 16 de mayo de 2013. Consultado el 18 de enero de 2013. Gran parte de las afirmaciones de Oracle se basan en 9 líneas de código contenidas en Java.Util.Arrays.rangeCheck(). Este es el código en cuestión:...
  • Código de bytes de Dalvik : documentación oficial de Android del conjunto de instrucciones.
  • Formato ejecutable Dex : documentación oficial de Android
  • Un compilador JIT para la máquina virtual Dalvik de Android en YouTube , Google I/O 2010, por Ben Cheng y Bill Buzbee.
  • Detalles internos de la máquina virtual Dalvik archivados el 1 de marzo de 2010 en Wayback Machine , Google I/O 2008, por Dan Bornstein.
  • La pregunta del millón: ¿Cuál es la diferencia entre marca registrada y derechos de autor?