Android: Aumentar la velocidad del emulador en Windows y Linux

android

El emulador de Android es un elemento fundamental de la SDK ya que aunque es imprescindible testear nuestros desarrollos en el mayor número de dispositivos posibles, para el desarrollador aficionado no es habitual disponer de una amplia colección de hardware que abarque todas las versiones de Android y densidades de pantalla posibles ya que esto implica una gran inversión fuera de su alcance.


Algunos de los dispositivos de testing de Animoca

Asimismo, existen empresas que «alquilan» el uso de dispositivos físicos remotos para testing pero es posible que tampoco podamos afrontar ese coste para nuestros proyectos personales, aunque en algunos casos ofrecen servicios gratuitos de pruebas con ciertas limitaciones de uso:

Así pues, el emulador es una herramienta que tendremos que utilizar sobre todo al empezar a desarrollar con Android y poder crear los AVD (Android Virtual Device) con las configuraciones que necesitemos. Lamentablemente, históricamente el rendimiento del emulador ha sido paupérrimo aunque tengamos un equipo de desarrollo potente. A partir de la SDK 17 Google se ha tomado en serio este problema y ahora podemos utilizar las capacidades de virtualización de las CPU modernas para mejorar notablemente su rendimiento. En este artículo se va a exponer cómo aprovechar esta característica y comprobar la (espectacular) mejora del rendimiento. En lugar de emular un dispositivo Android, vamos a virtualizar un OS Android para x86 (pero dentro de la SDK, no con una instalación en VirtualBox o similares). Me limitaré a Windows y Linux ya que son las plataformas con las que trabajo. Asimismo, se activará la emulación de la GPU de nuestro AVD vía hardware para aumentar todavía más el rendimiento.

Nota: en algunas BIOS la virtualización está deshabilitada por defecto, por lo que habrá que comprobar esta opción y activarla si fuera necesario.

Entorno de pruebas:

Requisitos: Conocimientos básicos de Android SDK.

Virtualización de Android con el emulador del SDK

La virtualización de Android en el emulador de la SDK sólo es posible con una imagen de Android para la «arquitectura real» de nuestro equipo, esto es, x86. No nos sirven, por lo tanto, las imágenes para ARM que proporciona Android SDK para cada versión de la API. La buena noticia es que Intel distribuye las imágenes que necesitamos (instalables también desde Android SDK Manager); la mala es que, de momento, sólo hay tres versiones de nuestro amado OS:

  • API 16 Android 4.1.1 (Jelly Bean). En el SDK Manager aparece como 4.1.2
  • API 15: Android 4.0.4 (Ice Cream Sandwich). En el SDK Manager aparece como 4.0.3
  • API 10: Android 2.3.7 (Gingerbread) En el SDK Manager aparece como 2.3.3

Intel x86 Atom System Image

Creamos nuestro AVD con una de estas imágenes, y ahora necesitamos instalar el software para el soporte de virtualización, tarea que depende de la plataforma.

Windows (Sólo para Intel-VX)

Lo tenemos muy fácil ya que sólo hay que instalar Intel HAXM. Al igual que las imágenes, se puede descargar de la página de Intel o a través del SDK Manager. Lo encontramos dentro de Extras con el nombre Intel x86 Emulator Accelerator.

Se trata de un .exe y simplemente lo ejecutamos. Si lo hemos descargado con el SDK Manager el ejecutable se encuentra dentro del directorio en el que está instalada la SDK en \extras\intel\Hardware_Accelerated_Execution_Manager.

Intel Hardware Accelerated Execution

Y listo. Al arrancar un AVD desde el AVD Manager, podemos comprobar que efectivamente se está utilizando la aceleración gracias al mensaje HAX is working and emulator runs in fast virt mode. En el siguiente video se compara la ejecución de un mismo AVD basado en la imagen de Intel para Android 4.1 con y sin la aceleración de Intel. La diferencia en el tiempo de arranque es espectacular y, aunque en el video no se muestra, la versión virtualizada funciona más rápida y fluida.

Linux (Ubuntu)

Es un poco más complicado, pero podemos utilizar tanto la tecnología de virtualización Intel-VX como AMD-V. Vamos a utilizar el potente software de virtualización KVM (y si estáis interesado en una alternativa sencilla para VirtualBox o VmWare podéis echar un vistazo a KVM + QEMU como frontend o virt-manager). Vamos a ver la instalación en Ubuntu que es la distro que uso aunque los paquetes necesarios están disponibles en la mayoría de las distros. En Ubuntu podemos instalar todo lo necesario con el siguiente comando (probablemente se instalen también otras dependencias):

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

Tras la instalación, añadimos nuestro usuario a los grupos kvm y libvirtd

sudo adduser usuario kvm
sudo adduser usuario libvirtd

A continuación terminamos la sesión y nos volvemos a logar. Conviene comprobar que todo ha ido correctamente con el comando virsh:

Tal y como se explicó anteriormente, sólo podemos usar para nuestros AVD una imagen de Android de Intel x86. Asimismo, para poder utilizar KVM hay que lanzar nuestro AVD desde la línea de comandos con la herramienta emulator disponible dentro del directorio tools de la instalación de Android SDK. La sentencia que activa el soporte de kvm e indica la memoria RAM a utilizar es la siguiente:

 ./emulator -avd [nombreAVD]  -qemu -m 512 -enable-kvm

La mejora de rendimiento, al igual que sucedía en Windows, es espectacular y mi impresión personal es que el rendimiento es incluso superior en Ubuntu (aunque reconozco que en ciertos temas no puedo ser demasiado imparcial :)).

Eclipse

Se puede lanzar directamente desde Eclipse un AVD con KVM sin utilizar la línea de comandos siguiendo el siguiente procedimiento:

  1. Ir a Run configurations
  2. Seleccionamos el proyecto o creamos una nueva configuración.
  3. En la pestaña target, seleccionar un AVD y en el campo «Additional Emulator Command Line Options» (está abajo del todo) añadir:
    -qemu -m 512 -enable-kvm

Ahora siempre se ejecutará nuestro proyecto con ese AVD y con KVM cada vez que lancemos el proyecto.

Emulación de GPU con apoyo hardware

Además de aprovechar la tecnología de virtualización de la CPU, podemos incrementar aún más el rendimiento utilizando aceleración hardware para la emulación de la GPU de Android. El soporte para GPU (que incluye OpenGLES) es independiente de la virtualización que hemos visto por lo que se puede utilizar con imágenes ARM. La documentación indica que algunas aplicaciones pueden no hacer uso de la emulación de la GPU, y cita expresamente los WebView.

Hasta la última revisión de la SDK Tools (21) esta funcionalidad se activaba al añadir al AVD la propiedad de Hardware «GPU Emulation» y activarla:

En el caso de que ejecutemos el AVD desde la línea de comandos (por ejemplo porque usamos Ubuntu con KVM ;)), el parámetro es -gpu on:

 ./emulator -avd [nombreAVD]  -gpu on -qemu -m 512 -enable-kvm

Pero ahora lo tenemos más fácil ya que aparece como un checkbox en el AVD Manager

Combinado la tecnología Intel VT-x con el soporte hardware de emulación de la GPU, el «emulador» vuela y en un equipo potente el rendimiento no tiene nada que envidiar a un dispositivo físico de gama media o incluso alta.

Resultado final

Este es el resultado final para un AVD con Jelly Bean con densidad xdpi en Ubuntu en un i7 utilizando KVM, la imagen de Intel y la aceleración hardware de la GPU.

5 comentarios sobre “Android: Aumentar la velocidad del emulador en Windows y Linux

  1. a la hora de instalarlo tuve problemas, hay que agregar «fix-missing» de la siguiente manera:
    sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils –fix-missing

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.