1. AOSP
Les sources d'Android sont disponibles par l'intermédiaire de l'Android Open Source Project (AOSP). Ce projet contient tout le nécessaire pour compiler une image Android. AOSP est une sorte de distribution Linux ; il contient les sources du framework Android, de Bionic (la libc), de la machine virtuelle Dalvik, etc. Mais il intègre aussi les sources d'autres projets (sqlite3, libzip, tcpdump, ...). Bien sûr, la toolchain, ainsi que les scripts de compilation, sont disponibles.
1.1. Préparation de l'environnement
Toutes les instructions nécessaires à la compilation d'une image sont disponibles sur http://source.android.com/source/initializing.html Nous nous contenterons d'en faire une rapide résumé.
Il faut commencer par récupérer certains paquets (java-sun, git, …), puis le script de téléchargement des sources (repo). On peut ensuite commencer le téléchargement :
|
|
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1 |
Il y a un peu plus de 6Go à télécharger (vous pouvez prendre un café).
J'ai fait mes tests sur la version 4.0.3_r1, qui est la dernière en date. Vous pouvez aussi utiliser la branche master, qui est la branche de développement (pour ça, il suffit d'omettre l'option -b).
La documentation préconise d'utiliser une Ubuntu 10.04 ; avec cette distribution, la compilation devrait se dérouler sans problème.
Personnellement, j'ai utilisé une Gentoo, ainsi qu'une Fedora 16, et on arrive au même résultat, mais au prix de quelques erreurs de compilation sur la route (#include manquant par exemple). Normalement, saisir l'erreur GCC dans Google donne la solution.
La compilation nécessite l'utilisation de make en version 3.81 pour cette branche, mais cette contrainte n'est plus valable pour la branche master. Pour Fedora, il suffit de récupérer le RPM de make dans les archives de la Fedora 13.
1.2. Compilation
Une fois l'environnement en place, rendez-vous dans le répertoire des sources et entrez les commandes suivantes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
$ source build/envsetup.sh $ lunch You're building on Linux Lunch menu... pick a combo:      1. full-eng      2. full_x86-eng      3. vbox_x86-eng                                                                                     4. full_stingray-userdebug                                                                          5. full_wingray-userdebug                                                                           6. full_crespo4g-userdebug                                                                          7. full_crespo-userdebug                                                                            8. full_maguro-userdebug                                                                            9. full_toro-userdebug                                                                              10. full_tuna-userdebug                                                                             11. full_panda-eng                                                                             Which would you like? [full-eng]                                                                    $ make -j10 |
Le fichier envsetup.sh fournit différentes commandes utilisées pour la compilation et en particulier lunch. Cette dernière vous demande pour quel matériel vous souhaitez compiler ; l'option full-eng compilera pour l'émulateur.
On lance la compilation proprement dite avec make.
Si la compilation réussit, les images seront dans out/target/product/generic/et nommées system.img, ramdisk.img, userdata.img.
Attention, inutile d'installer ces images sur votre téléphone, AOSP ne fournit pas les drivers à part pour certains matériels comme le Galaxy Nexus (maguro), la PandaBoard (panda), ...Et bien sûr l'émulateur.
Dans cet article, nous ferons tous nos tests sur l'émulateur.
1.3. Émulateur
Vous pouvez maintenant lancer l'émulateur avec l'image que vous venez de compiler. Pour cela, dans le même terminal où vous avez fait la compilation, lancez :
|
|
$ out/host/linux-x86/bin/emulator |
L'émulateur Android doit apparaître.
Vous pouvez accéder à un shell avec la commande suivante (depuis n'importe quel terminal cette fois-ci) :
|
|
$ out/host/linux-x86/bin/adb shell |
2. Script de construction
Comme on l'a vu, AOSP utilise make pour construire une image. En pratique, chaque sous-projet contient un fichier Android.mk à la racine ; ce fichier est un fragment de Makefile. Il utilise divers variables et macros définies dans le dossier build.
Lors de la compilation, le système recherche tous les fichiers Android.mket les assemble dans un grand Makefile. make peut alors créer son arbre de dépendances et compiler chaque sous-projet.
3. Mise en pratique : Webkey
3.1. Qu'est-ce que Webkey ?
Pour comprendre le fonctionnement du système de compilation, nous allons voir comment intégrer une nouvelle application à une image. J'ai choisi Webkey comme exemple. C'est une application qui permet de contrôler un système Android depuis un navigateur.
Captures d'écran de la partie navigateur et Android
Cette application est intéressante, car elle est constituée d'un exécutable (sous forme de démon) et d'une application Android.
Commençons par récupérer les sources de Webkey à l'adresse suivante : http://androidwebkey.com/html/webkey/webkey-2.03.zip
Après avoir décompressé l'archive, si on navigue dans les sources, on constate que l'auteur se préoccupe peu des bonnes pratiques de distribution logicielle. On trouve l’exécutable dans les sources, ainsi que les fichiers *.o et *.a. On voit tout de même apparaître deux dossiers intéressants : le dossier service avec le binaire Webkey et le dossier java avec l'application Android.
3.2. Compilation du binaire
3.2.1. Mise en place des sources
Dans AOSP, les sources des binaires issues d'autres projets sont placées dans le dossier external. Il nous faut donc copier le dossier service issu de l'archive vers un dossier external/webkey. On se place maintenant dans external/webkey, et on fait un peu de ménage :
|
|
rm -rf *.o *.a minizip/*.o libjpeg libpng sqlite webkey shellinabox |