Dalvik VM: Optimización

android_apple

Una de las tareas críticas de Dalvik es la optimización del código (byte code) para maximizar los recursos del sistema. Recordemos que Dalvik es una máquina virtual para correr sobre sistemas ligeros y con recursos escasos.

Esta fase es realmente crítica, especialmente cuando el byte code de Dalvik es generado a partir del de Java, lenguaje con fama de lento y pesado.

Este proceso de optimización se lleva a cabo justo antes de que la aplicación es ejecutada por primera vez.

El componente responsable de esta acción se llama “dexopt”. Algunas de las tareas que este componente tiene que solucionar son:

  1. El byte code debe ser compartido entre diferentes procesos para así ahorrar espacio de memoria.
  2. El proceso de abrir una aplicación nueva se debe minimizar para hacer que el terminal responda mejor.
  3. Compartir datos entre clases para así ahorrar espacio en disco.
  4. Optimización de algunas instrucciones del byte code para así ahorrar batería.
  5. Evitar la modificación de datos compartidos entre procesos por temas de seguridad.
Y así es como Dalvik soluciona dichas tareas:
  1. Agrega varias clases a un mismo fichero .DEX.
  2. Los ficheros .DEX se mapean en memoria en forma de sólo lectura (para evitar la escritura de datos entre aplicaciones) y son compartidos entre distintos procesos.
  3. Establece el byte order en little endian (el byte menos significativo se guarda al principio) y aplicando word alignment (las palabras – words – son guardadas en direcciones de memoria divisble por 4). Según varios estudios, este tipo de codificación hace a la máquina virtual ejecutar el código más rápidamente.
  4. Verifica el byte code de cada clase.
Una vez visto de forma general en que consiste el proceso de optimización, vamos a ver los pasos que, de forma muy resumida, dexopt lleva a cabo:
  1. Extrae el fichero classes.dex del archivo apk.
  2. Empieza a realizar el proceso de optimización.
  3. Genera el fichero ODEX (Optimized DEX) y lo guarda en $ANDROID_DATA/data/dalvik-cache .
Como nota, los ficheros ODEX no son portables de una VM a otra, por lo tanto el ODEX generado por una VM debe correr en esa misma máquina virtual.

A continuación podemos ver una tabla con algunos datos que reflejan la mejora producida en el proceso de optimización:

java_dalvik_comparison

Como podemos observar, las últimas 2 columnas representa la ganancia en la reducción de tamaño en Bytes de los ficheros .dex. La primera file compara las librerías del sistema y la segunda y tercera fila, compara 2 de las aplicaciones comunes que podemos encontrar en nuestro sistema como son el navegador y la aplicación de alarma.

En la próxima entrada veremos en detalle la estructura interna de los ficheros .dex, algunas diferencias en el byte code de Java y el de Dalvik, etc.

Entradas anteriores:

Dalvik VM: Introducción.

Fuentes: http://www.slideshare.net/ankitsomani007/dalvik-vm-amp-jit-4954994 http://www.netmite.com/android/mydroid/dalvik/docs/dexopt.html