Android y Máquinas Virtuales



Android utiliza el concepto de máquina virtual para la ejecución de las aplicaciones. Una máquina virtual es un software que simula ser una computadora y puede ejecutar programas como si fuera una máquina real. El lenguaje de programación Java popularizó esta idea al desarrollar la Java Virtual Machine (JVM) que es capaz de interpretar y ejecutar instrucciones expresadas en Java Bytecode generado por el compilador del lenguaje Java. Este código binario Java no es un lenguaje de alto nivel, sino un verdadero código de máquina de bajo nivel, incluso como lenguaje de entrada para un microprocesador físico. La JVM se encuentra en un nivel superior al hardware del sistema sobre el que se pretende ejecutar la aplicación y actúa como intermediaria entre el bytecode y el hardware. Toda aplicación Java es ejecutada en esta máquina virtual que convierte de código bytecode a código assembler del dispositivo final. La ventaja de las máquinas virtuales es aportar portabilidad, solo es necesario disponer de dicha máquina virtual para cada arquitectura. De ahí el famoso axioma: "escribirlo una vez y ejecutarlo en cualquier parte", o "Write once, run anywhere". Esto es muy importante en el mercado mundial de smartphones Android compartido por muchos fabricantes. Android utilizó una variante de máquina virtual java llamada Dalvik hasta la versión 4.4.4. Dalvic interpretaba la mayoría del código de la aplicación pero realizaba la compilación y ejecución nativa de segmentos de código que se supone que se ejecutaban frecuentemente. Este concepto de localidad temporal del software ya es conocido y utilizado en memorias caches de instrucciones y en sistemas operativos, y en este contexto se denomina compilación just in time (JIT). La Dalvic Virtual Machine (DVM) carecía de la portabilidad de Java pero se obtenían aplicaciones con mejor rendimiento y menor consumo de energía. Estaba optimizada para requerir poca memoria y permitir ejecutar varias instancias de la máquina virtual simultáneamente, pero el sistema operativo era quien gestionaba la planificación de procesos, de la memoria y de los hilos.
Dalvik siempre fue considerada una máquina virtual Java, pero esta no es una definición estrictamente correcta, ya que el bytecode no es Java Bytecode. Desde la versión 5.0 de Android fue sustituida por Android Runtime (ART) que compila el Java bytecode completo durante la instalación de una aplicación. Android Runtime introduce el concepto de compilación ahead of time (AOT), en donde se crea un archivo de compilación posterior a la instalación de cada aplicación. Esto evita que la aplicación se compile nuevamente cada vez que es ejecutada, reduciendo el uso del procesador y aumentando la duración de la batería al disminuir el número de compilaciones realizadas. Para mantener la compatibilidad con versiones anteriores, ART utiliza el mismo código de bytes de entrada que Dalvik, con archivos de extensión .dex como parte de los archivos APK, mientras que los archivos .odex son reemplazados por archivos de Formato Ejecutable y Enlazable (ELF). Una vez que una aplicación se compila utilizando ART, se utiliza exclusivamente el ejecutable ELF compilado. Este enfoque elimina diversos gastos involucrados con la compilación JIT, pero requiere de tiempo adicional para la compilación cuando se instala la aplicación. Además, las aplicaciones ocupan cantidades ligeramente mayores de espacio de almacenamiento para almacenar el código compilado. ART debutó como un entorno de ejecución alternativa en Android 4.4 KitKat y reemplazó completamente a Dalvik a partir de Lollipop.


Comentarios

Entradas más populares de este blog

ISO/IEC 27037:2012 Guidelines for identification, collection, acquisition and preservation of digital evidence

Un poco de arquitectura de computadoras y sistemas operativos

¿Qué es el Análisis Digital Forense?