Cómo acelerar el emulador de Android y no morir en el intento

Básico

Si son desarrolladores de Apps seguramente han tenido que probar haciendo Apps para diferentes plataformas, Android entre ellas.

El emulador de Android suele ser un problema, no es que sea lento es que es lo más lento que un producto de virtualización moderno pueda ser, esto nos complica muchisimo la tarea de desarrollo pero podemos tomar medidas al respecto. Y de esto tratará este post.

Algo que complica el tipo de medidas que debemos tomar es si ya utilizamos una hyper visor para virtualización, puede que no lo sepas pero si desarrollas Apps para Windows Phone ya tienes un hyper visor funcionando, en este caso será Hyper-V. Revisaremos también como lidiar con ello.

Si tienes instalado Hyper-V las opciones que veremos en este post requerirán que lo deshabilites así que ese es nuestro primer punto a tratar.

Revisaremos como hacerlo desde Visual Studio con Xamarin instalado, pero cualquiera de los pasos se pueden hacer directamente desde el ADK de Google, que al final son los componentes que abre Visual Studio.

Hyper-V

Hyper-V es el hyper visor de Windows y básicamente es una capa de software que se ejecuta en el anillo -1 del sistema operativo, esto es una capa antes del propio kernel del OS, lo cual en términos practicos se puede pensar como un sistema operativo más pequeño que hostea y orquesta con el principal.

Un sistema operativo con hyper visor puede hostear a otros OS que acceden al Hardware directamente convirtiendose así en otros OS hosteados por el mismo hyper visor, la única diferencia con el Os principal es que este es el único que puede administrar el hyper visor.

Hyper-V es un hyper visor de alto rendimiento, se suele instalar manualmente cuando quieres trabajar con virtualización, pero en el caso de la mayoria de los developer de Apps este se instala automáticamente cuando instalas el SDK de desarrollo de Windows Phone [o Visual Studio con WinPhone habilitado] ya que parte del proceso es configurar una máquina virtual de Windows Phone corriendo sobre Hyper-V.

Windows Phone Virtual Machines on Hyper-V

Windows Phone sobre Hyper-V es bastante rápido, el emulador de Android no y por una razón muy sencilla: no usa Hyper-V y por defecto no utiliza ningún otro mecanismo de acceso al hardware para alto rendimiento. Es decir: corre 100% emulado por software.

Android para x86 y HAXM

La imagen de Android no viene por defecto optimizada para ninguna plataforma, si queremos utilizar una version de mejor rendimiento debemos conseguir una imagen de Android optimizada para x86.

Para obtenerla debemos abrir el Android SDK Manager, al cual podemos acceder fácilmente desde Visual Studio + Xamarin así:

Visual Studio + Xamarin Android SDK Manager

Debes decidir que versión del API de Android vas a trabajar, en mi caso particular utilizaré la 19 así que instalo la imagen x86 de Android para esta API.

Android SDK Manager

Más abajo en la misma ventana (al final) encontramos HAXM que traduce Hardware Accelerated Execution Manager de Intel® y lo instalamos también.

Android SDK Manager

Comprobar la instalación de HAXM

Lamentablemente el Android SDK Manager puede decirte que todo ha quedado bien instalado aunque esto no sea cierto, así que es más recomendable instalar HAXM descargando el ejecutable desde el sitio de intel:

Intel® Hardware Accelerated Execution Manager

Al ejecutarlo pueden pasar dos cosas:

1. Todo acaba de manera exitosa

2. Te sale un error como este:

VT not supported

Si te sale un error como el de la gráfica hay dos caminos posibles

  1. Si te sale y no tienes Hyper-V instalado, no hay nada que hacer tu procesador no soporta la aceleración por hardware requerida por HAXM. Tendrás que continuar con Android en modo lento.
  2. Si te sale y en efecto tienes Hyper-V instalado el mensaje realmente quiere decir que HAXM no es compatible con otros hyper visores instalados.

Necesito HAXM, que hago con Hyper-V?

La primera opción es desinstalar Hyper-V antes de volver a instalar HAXM, funcionará sin duda, pero el problema es...

Qué pasa si necesitas Hyper-V para tus emulador de Windows Phone o para otras maquinas virtuales?

Instalar y desinstalar un hyper visor es una tarea tediosa no solo porque toma un buen tiempo sino porque ademas la reinstalación suele requerir 2 o 3 reinicios.

Por suerte estamos en un sistema Windows que es fácil y esta documentado, haremos uso del editor de arranque para indicarle a Windows que arranque sin cargar Hyper-V. Usaremos el comando BCDEdit.exe.

Configurando el arranque sin Hyper-V

Configuraremos el sistema para que arranque con o sin hyper-V según lo necesitemos.

Hay que abrir una consola de comandos en modo de administrador allí ejecutaremos algunos comandos.

Necesitamos que nuestro sistema arranque como lo hace de costumbre, así que creamos una copia del arranque actual y lo nombremos "Windows sin Hyper-V".

 C:\>bcdEdit /copy {current} /d "Windows sin Hyper-V"  
The entry was successfully copied to {44ecab0b-4192-11e3-b3e9-dbbaf2f4a53a}.  

Ya tenemos una copia del arranque actual, así que ahora debemos indicarle que no cargue Hyper-V. Debemos hacer uso del Id que nos ha retornado el comando anterior, que es el Id del arranque.

 C:\>bcdedit /set {44ecab0b-4192-11e3-b3e9-dbbaf2f4a53a} hypervisorlaunchtype off  
The operation completed successfully.  

Hecho!

Ahora tenemos dos opciones de arranque una por defecto que carga Hyper-V y otra opcional para no cargarlo. Para inciar el sistema sin Hyper-B basta con reiniciarlo como se hace tradicionalmente pero justo antes de hacer click en Restart hay que presionar y mantener la tacla Shift.

Restart presionando Shift

Luego de esto aparecen la siguiente pantalla sonde seleccionamos la opción "Use Another Operating System".

Use Another Operating System

Esto nos lleva a una pantalla diferente, en esta seleccionamos nuestra versión de arranmque sin Hyper-V.

Choose an operating system

El sistema iniciará sin cargar hyper-V, y ahora si es posible instalar el ejecutable de HAXM.

Configurando el emulador

Desde Visual Studio accedemos al Android Emulator Manager:

Visual Studio + Xamarin Android Emulator Manager

Allí editamos el AVD (Android Virtual Device) que estemos usando, seleccionamos la versión del API a la cual le dimos soporte para x86 y adicionalmente en el tipo de CPU Intel Atom x86.

Configuring AVD on Android Emulator Manager

Ahora arrancamos el emulador, si algo falló (puede pasar) el emulador arrancará pero veremos esto:

Android emulator without HAXM

Si todo sale correcto el emulador arrancará super rápido y veremos esto en la ventana emergente:

TARAAAAAN

Android Emulator running FAST with HAXM