Artisan Numérique

/système/virtualisation/kvm/android/ Virtualiser android avec KVM

Lorsque l'on construit des applications mobiles, un émulateur, même s'il n'évite pas les tests sur les terminaux physique, est un outil fondamental. Or pour android, et - je dois bien l'avouer - contrairement à iOS, l'émulateur standard est une grosse crotte à l'extrême limite de l'exploitable. Fort heureusement il y a, grâce au projet Android X86 et à KVM, une vraie solution.

État des lieux

Il existe plusieurs approche pour virtualiser un système Android. La plus terrible donc consiste à utiliser l'émulateur fournit avec le kit de développement du système d'exploitation. Et même en utilisant les images x86, les performances sont tellement basses qu'il est très difficile de travailler avec cet émulateur sous GNU/Linux. On passe donc.

Une autre solution consiste à passer par l'outil commercial Genymotion qui offre d'excellentes performances alliées à un ensemble impressionnant de fonctionnalités. C'est de loin l'outil idéal mais qui souffre malheureusement de gros soucis de stabilité. En effet, la magie de cet outil tient à l'usage de VirtualBox pour émuler un android compilé pour les architectures x86 en laissant de côté l'affichage. VirtualBox boot ainsi un Android headless auquel ce connecte un client OpenGL Maison qui va permettre un affichage très rapide. Et c'est là que le bas blesse finalement car sur mes plateformes Wheezy tournant sur du GPU Intel, la chose est pour le moins instable et le client segfaulte constamment.

Une troisième approche consiste cette fois à utiliser le projet Android-X86. Il s'agit là d'un portage d'Android sur l'architectures de processeur Intel permettant notamment de faire tourner Android sur un eepc, ou sur un émulateur tel VirtualBox ou KVM. D'abord testé avec VirtualBox le résultat était assez "bof-bof" avec des performances certes meilleur que l'émulateur Android, mais bien loin de ce qu'offre Genymotion. En revanche c'était stable.

J'ai donc, en désespoir de cause tenté la même chose avec KVM et cette fois j'ai été très agréablement surpris. Le résultat est aussi fluide que Genymotion, voir plus, tout en étant totalement stable.

Installation de KVM

Pour installer KVM sous Wheezy, rien de bien compliqué. Il faut juste penser à installer libvirt dans la la foulée.

$sudo aptitude install qemu-kvm libvirt-bin

Ensuite, Ajoutez votre utilisateur aux groupes kvm et libvirt

$sudo adduser gaston kvm
$sudo adduser gaston libvirt

Ceci fait, redémarrez votre bécane cela permettra à tous les modules d'être chargés proprement.

Création de la VM

Pour commencer, il faut télécharger l'ISO de KitKat (Android 4.4) sur le site d'Android X86. Créez pour cela un dossier android et placez-là dedans.

Ensuite dans ce dossier nous allons créer un disque virtuel.

$mkdir ~/android
$cd ~/android
$mv ~/téléchargements/android-x86-4.4-r1.iso .
$qemu-img create -f qcow2 android-4.4.img 1G
Formatting 'android-4.4.img', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536

Nous allons maintenant lancer la bête :

$kvm -m 512 -cdrom android-x86-4.4-r1.iso -hda android-4.4.img -boot d

Si tout se passe bien, vous devez obtenir une fenêtre en 800x600 avec un menu Grub de base. Choisissez l'option Installation. Ensuite Create/Modify partitions.

Là nous arrivons à l'ami cfdisk. Rien de bien compliqué ici, se sera [New] puis [Primary]. Laissez la taille à son maximum et validez.

Ensuite sélectionnez [Bootable], puis [Write], dites yes puis lorsqu'il a terminé d'écrire, allez sur [Quit]. Là, retour sur l'installateur, qui cette fois affiche un sda1 comme lieu d'installation que nous allons nous empresser de sélectionner. Choisissez un formatage en Ext3 et dites Yes aux trois questions qui suivent. Le zinzin va mouliner puis proposer le Reboot. N'en faite rien pour l'instant et fermez simplement la fenêtre.

Lancement

Maintenant qu'Android est installé, nous allons démarrer la VM sans cdrom de démarrage :

$kvm -m 512 -hda android-4.4.img -boot d -net nic -net user

Cette fois grub vous propose de lancer Android directement. Petites explications sur la ligne de commande utilisée.

L'option -net nic va créer une nouvelle interface réseau virtuelle tandis que -net user met en place une pile réseau qui ne demande aucun privilège particulier (userland). Votre VM bénéficie donc d'une connectivité fonctionnel que vous pouvez tester avec le navigateur.

Utilisation d'ADB

ADB est un outil indispensable permettant de se connecter sur n'importe quel terminal Android pour y lancer un shell, installer un apk, et même débugger une application hybride via Chrome (Android 4.4 seulement).

Pour accéder au serveur ADB au sein de la VM, nous allons un peu modifier notre ligne de lancement :

$kvm -m 512 -hda android-4.4.img -boot d -net nic -net user,hostfwd=tcp::4444-:5555

L'option ,hostfwd=tcp::4444-:5555 va forwarder le serveur ADB en écoute sur le port 5555 sur le pour 4444 de votre machine. Ainsi nous pouvons tranquillement lancer un shell sur la VM android :

Installation d'adb si ce n'est pas déjà fait
$sudo aptitude install android-tools-adb
$adb connect localhost:44444
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
connected to localhost:4444
$adb shell
shell@x86:/ $

Conclusion

J'avoue avoir été très surpris par les performances de KVM. Il faut dire que ma connaissance de son papa, qemu remonte à une époque lointaine où il était terriblement lent. Alors il est certain que le résultat KVM+Android propose de bien moins de fonctionnalités que Genymotion mais il a le mérite d'être aussi rapide et bien plus stable.

Là seule chose que je n'ai pas réussi à faire est de modifier la résolution d'affichage. J'ai tenté le passage d'arguments au kernel UVESA_MODE=320x480 DPI=160 sans grand succès. Même résultat en passant par adb/shell et wm size 320x480. Alors si quelqu'un a une idée de génie, je suis preneur :)