An X86/GPU Accelerated ICS emulator w/ Google APIs

Following the steps given in yesterday’s article, I setup an x86 ICS emulator for testing.  It’s incredibly fast and I can see it working great for standalone dev, but it was lacking a few things.  Specifically,I need to test against the Google API add-on because maps are part of our integration.  Here is a list of steps to get the Maps API up and running.  Hopefully this will hold us over until we start to see some valid x86 emulators from Google.

Install the x86 ICS image

Follow the guide at TestObject to get the emulator up and running.  (The intel HAX driver seems to work instead of the KVM method mentioned for OSX, however I only had luck launching from the AVD manager and not from the CLI)  I’ve listed the quickstart method here, if you’d rather compile your own, follow the link to their blog.

0. QUICKSTART

For those who don’t want to get their hands dirty (this takes several hours), we’ve compiled, bundled and pre-configured a system image for your convenience. Simply follow the 5 steps below and your Android ICS emulator-x86 AVD should be up and running. 

1. Download the Precompiled System Image

First, download the system-image bundle which can be obtained from our site: 
$ wget http://download.testobject.org/dev/android_ics_x86_goldfish.tar.gz

2. Untar the System Image

Next, extract the tar.gz file into your Android SDK folder: 
$ tar -zxvf android_ics_x86_goldfish.tar.gz -C ~/<sdk_dir>

3. Enable KVM Support

Additionally, we have to enable hardware-assisted virtualization to get the most out of Intels Linux kernel. See Intels guide [6] for a more detailed explanation. 
$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
Next, we have to ensure that our current user is added to the groups kvm and libvirtd. 
$ sudo adduser <your_user_name> kvm
$ sudo adduser <your_user_name> libvirtd
Finally, verify that KVM support is enabled with the following command. 
$ sudo virsh -c qemu:///system list
Your screen will paint the following below if successful: 
Id Name State
—————————————————

4. Create a x86 AVD

Now open the AVD manager and create a new AVD based on the x86 system-image. 
$ ~/<sdk_dir>/tools/android
First, check that you’ve installed the Android 4.0.3 (API 15) SDK Platform and that the newly added system-image shows up as “Intel x86 Atom System Image”. 
Next, to create a new AVD we perform the following steps: 
  1. Click on “Tools”, “Manage AVDs” and “New..”
  2. Name the AVD “x86_4_0_3”
  3. Select “Android 4.0.3 - API Level 15” as Target
  4. Choose “Intel Atom (x86)” as CPU/ABI
  5. Click “Create AVD”

5. Run the x86 Image from CLI

Finally, we fire up the x86 emulator with enabled KVM acceleration. 
$ ~/<sdk_dir>/tools/emulator-x86 -avd x86_4_0_3 \
-kernel ~/<sdk_dir>/system-images/android-15/x86/kernel-qemu \
-qemu -m 1024 -enable-kvm

Install the Google API addons into the image

  • In Android Virtual Device Manager create an AVD with target “Android 4.0.3 - API Level 15”
$ emulator-x86 -avd name_of_avd
$ adb pull /system/etc/permissions/com.google.android.maps.xml
$ adb pull /system/framework/com.google.android.maps.jar
  • (optional) Remove the create AVD in Android Virtual Device Manager
  • In Android Virtual Device Manager create an AVD with target “Intel Atom x86 - API Level 15”
$ emulator-x86 -avd name_of_avd
$ adb remount rw
$ adb push com.google.android.maps.xml /system/etc/permissions
$ adb push com.google.android.maps.jar /system/framework
$ adb push mkfs.yaffs2.x86 /data
$ adb shell ‘chmod 777 /data/mkfs.yaffs2.x86”
$ adb shell ‘/data/mkfs.yaffs2.x86 /system /data/system.img’
$ adb pull /data/system.img
  • Copy system.img into AVD directory
  • Edit the AVD
  • Add a new hardware flag for GPU emulation and set the value to “yes”
  • Reboot emulator
Notes:
  1. If you receive an out of memory error, start the AVD with the additional flag -partion-size 1024
  2. If you have problems launching the AVD from the command line, use the AVD manager or Eclipse.  Using Eclipse you can specify the additional argument listed in “1.”

[1] http://blog.testobject.org/2012/04/giving-your-android-emulator-boost.html
[2] http://38911bytes.blogspot.de/2012/03/how-to-use-google-maps-api-in-android.html
[3] https://developer.android.com/guide/developing/devices/emulator.html