Acelera el emulador de Android

“El Emulador de Android es lento”. Mucho. Es una de las quejas recurrentes que tenemos los que tenemos que desarrollar para Android, bien sea por afición, devoción u obligación. Comparado con el simulador de iOS, el Emulador de Android es una tortuga. Pero claro, la comparación no es justa: Android emula un teléfono completo, con su CPU, GPU, memoria, tarjeta SD, etc. Está ejecutando código real que podríamos instalar en un teléfono, compilado para una CPU de una arquitectura que no tenemos en el escritorio (como es ARM p.ej.). El simulador de iOS crea un ejecutable x86 que “simula” comportarse dentro de un teléfono, pero realmente es un programa de Mac “travesti”. La fidelidad no es la misma.

Por eso, en teoría el desarrollo con el Emulador de Android debe ser más sencillo, al tener una mejor herramienta con la que probar. Eso, si eres capaz de aguantar el tiempo insoportable que tarda en arrancar. Y si no se desconecta de adb (Android Debugger Bridge) y tienes que reiniciarlo.

HAXM

Para mejorar esto, Intel pone a nuestra disposición HAXM (Hardware Accelerated Execution Manager). Gracias a este programa, instalaremos una capa de aceleración para el Emulador de Android, que realmente se ejecuta en como una máquina virtual qEmu. qEmu es un emulador de CPUs, es decir, nos permite ejecutar en nuestros equipos basados en Intel x86 (como un Core i5 por ejemplo) S.O. que corren en Intel (como Windows, Linux, Mac) o bien otros S.O. que necesitan otras CPUs y arquitecturas (como es el caso de Android con ARM).

HAXM es un driver (o un módulo del kernel en Linux / extensión del kernel en Mac) que concede a qEmu acceso directo al hardware en el que se ejecuta. Eso sí, como es un programa de Intel, sólo funciona con las CPUs Intel. Vamos, que si tu máquina tiene una CPU AMD ya puedes ir cerrando el post. Además, la CPU debe soportar VT-x (las modernas lo soportan, no pruebes con un Pentium II). Puedes consultar los requisitos en la página detallada de Intel sobre cómo instalar HAXM.

Instalación de HAXM

Si estás usando el nuevo ADT Bundle (es decir, el Eclipse + plugin ADT + SDK Android que ha sacado hace poco Google, que ya era hora por cierto) y abres el Android SDK Manager, al final encontrarás un grupo llamado “Extras” en el que está el Intel x86 HAXM Emulator Accelerator. Si estás en Windows / Linux, bájatelo desde aquí. Si estás en OS X Mountain Lion 10.8.2 no te lo bajes desde aquí, debes ir a la página de descargas de HAXM, ya que existe un bug que hará que tu querido Mac se cuelgue. Sí, has leído bien: los Macs también se cuelgan. Cuando te lo bajes, ya sea desde el SDK Manager o a mano (por cierto, en el enlace anterior están las versiones de Linux y Windows de HAXM) debes instalarlo.

En el caso del Mac, bajas un DMG que al montar te muestra un programa de instalación. Tras instalarlo (no exige reiniciar) podemos confirmar que está en funcionamiento escribiendo en una Terminal:

$ kextstat | grep haxm

Debe aparecer algo como esto:

Tesla:~ dfreniche$ kextstat | grep haxm
115  0 0xffffff7f81e29000 0x13000 0x13000  com.intel.kext.intelhaxm (1.0.4)

Si te has bajado el paquete usando el SDK manager, puedes encontrar el programa de instalación en $SDK_HOME/extras/intel/

Uso de HAXM

Una vez instalado HAXM, debemos descargar las imágenes de Android que también nos proporciona Intel. La idea es que en lugar de acelerar un emulador ARM (que sería muy complicado) Intel nos da Android para Intel Atom. De esta manera, cuando qEmu ejecuta instrucciones en el Intel Atom emulado realmente se pasan a nuestra CPU directamente, con la consiguiente mejora en rendimiento.

Estas imágenes aparecen como “Intel x86 Atom System Image” en el SDK Manager. A bajarlas. No las tenemos para todos los API levels, pero sí para los más usados (API 10, 15 y 17 y supongo que en breve sacarán para el 18).

SDK Manager mostrando las imágenes Intel ya instaladas

Ahora tendremos que crear una definición de AVD que utilice esta imagen de Intel. En lugar de un emulador con CPU ARM, vamos a escoger uno con CPU Intel Atom. De cara a nuestros programas da igual, ya que a fin de cuentas se van a ejecutar en la máquina virtual Dalvik. Si vamos a probar código Android nativo (escrito en C con el NDK) entonces lo mejor es leer la documentación de HAXM.

Creando un AVD con CPU Intel seleccionada

Cuando arranquemos nuestro AVD notaremos dos cosas. En la consola debe aparecer un mensaje que indique que “HAX is working” y casi sin darnos cuenta nuestro Emulador estará operativo. Se acabó el arrastrarse. Yo ni marco que arranque de un snapshot porque es tan rápido que no me merece la pena.

Bonus level

Si usas API level 15 ó 17 puedes usar la aceleración de hardware de la GPU, lo que hará que todavía sea más rápido. Avisado quedas de que puede no funcionar (el emulador se vería en negro y tendrías que cerrarlo). Consulta el apartado de aceleración de la GPU de la documentación Emulador para más detalles. Para activarla, marca el checkbox “Use host GPU” en la definición del AVD.

Ultra bonus level

Y si necesitas un emulador de Android “en la nube”, para probar algo o mostrar en una visita a un cliente, y no tienes tu máquina pero te puedes bajar el APK de Dropbox, mira Manymo. Si con esto no te pones palote

19 comments

  1. Creo que tenemos una idea diferente de lo que es “rápido”… Cierto es que va mucho mejor que el emulador ARM, pero tanto como “rápido” 🙂

    En cualquier caso gracias!! A partir de ahora utilizaré este sin duda.

    • @Israel: En mi máquina ahora se mueve a una velocidad razonable. En cualquier caso, está emulando, luego tampoco será tan rápido como el simulador de iOS, pero algo es algo.

  2. Hola , tengo un problemilla creando un dispositivo en la version 10 ,Android 2.3.3 me falla dice “Unable to find a ‘userdata.img’ file for ABI x86 to copy into the AVD folder” , en la version 17 va bien.

    ¿ os pasa lo mismo ?

  3. Los he desinstalado y vuelto a instalar y nada, solo falla en el emulador de ABI x83 el del arm va bien , y solo en la version 10 🙁 No encuentro nada por ningun sitio !!!

      • Siendo pesado… Tienes 3 opciones para acelerar el emulador:
        – usar el de Intel. No te sirve si tienes AMD o usas las APIs de Google
        – usar un dispositivo físico (trampa: no usamos el emulador)
        – usar VMware + emulador, como cuentan . Disclaimer: no lo he probado

        Un saludo

    • @Jairo:
      El emulador de Intel funciona bien porque Intel fabrica:
      – teléfonos Android con Intel Atom
      – tu ordenador con procesador Intel
      de modo que puede hacer un “puente” entre el Atom y tu Intel Core (si soporta VT-X)

      Si tienes AMD debes buscar otra forma de optimizar el Emulador. Con esta, desde luego, no vas a poder: Intel no va a trabajar para AMD 😀

  4. Ya tengo el instalador de IntelHaxm. Pero no lo puedo instalar, porque me sale:

    Este equipo es compatible con la tecnología de virtualización de Intel (VT-x) Haxm no se puede instalar. Por favor, consulte la documentación de Intel Haxm para más información.

    ¿Como puedo solucionar este problema?

    Responder

    • Hola Anónimo 😀

      Si te has bajado el instalador del HAXM probablemente no te deja instalarlo porque diga que tu equipo NO es compatible con la tecnología VT-x. ¿Es un modelo antiguo? Desde un Core2Duo en adelante te debería valer.

      ¿Estás instalando en Windows, Linux, Mac…?

      Saludos!

  5. Buenas, muchas gracias por el tuto,
    pero no consigo que me funcionen las máquinas 🙁
    ¿puede ser porque estoy en windows 64 bits?

    me sale en la consola:
    “HAX is not working and emulator runs in emulation mode”

Comments are closed.