Artisan Numérique

/développement/android/ Mise en œuvre du kit de développement pour Android

Android est fournit avec un kit de développement qui permet de faire beaucoup de chose qui n'ont rien à voir avec du développement. Il est grâce à ce kit possible d'ouvrir un shell sur le terminal mobile via USB, rediriger des ports (et ainsi utiliser la connexion 3G d'un téléphone sur un portable), faire des copies d'écran et même émuler différentes version d'Android sur un terminal virtuel, par exemple pour tester des applications.

Rapide présentation d'Android

Android est un système d'exploitation pour terminaux mobiles (dont les smartphones) développé par une petite société, Android inc, qui a été rachetée par Google en 2005. Le CEO de cette société est du coup devenu le directeur de la section "plateformes mobiles" de Google. Android est dés lors monté en puissance avec pour objectif officieux de dégommer l'iPhone OS d'Apple, et plus marginalement le WebOS de Palm et le Windows Mobile de MicroSoft.

Un OS pour terminaux mobiles sans terminaux mobile ne faisant pas gagner une telle guerre, Google a dés l'origine du projet réuni autours de lui un ensemble de partenaires (HTC, LG, Motorola, Samsung, Sony, etc.) sous la bannière de l'Open Handset Aliance. Pour l'heure Apple et son iPhone ne souffrent pas encore trop, mais le fait qu'Android ait passé ce mois-si la barre des 200000 activation par jour avec plus de 59 terminaux mobiles l'utilisation, risque à terme de compromettre très sérieusement l'hégémonie de Jobs. Situation relativement cocasse lorsque l'on sait qu'Eric Schmidt est toujours au board de la marque à la pomme...

Pour revenir à un peu plus de technique, Android est donc un OS, une interface (avec bureaux virtuels et widgets) et une série d'applications clef en main (gmail, gmap, etc.). Du point de vue développeur, Les applications pour Android utilisent un kit de développement basé Java. Plus exactement, Android embarque une machine virtuelle Java optimisée appelée Dalvik, le langage Java et un sous-ensemble de ses librairies. A ce titre, et contrairement à beaucoup de téléphones du marché, Android n'est pas nième une mouture de J2ME (Java Mobile Edition) mais une toute nouvelle plateforme Java, ce qui ne l'empêche cependant pas de pouvoir exécuter des applications J2ME sous réserve d'installer une JVM compatible (ex. JBed).

Donc ce qui nous intéresse avec ce système d'exploitation c'est que, contrairement à celui de l'iPhone, il est disponible sous licence Apache (version 2) et peut donc être considéré comme libre. A titre d'exemple, sur mon Hero, je tournait sur un Android 2.1 vanilla, totalement compilé par l'équipe CyanogenMod. En fait il est même carrément libre (basé sur un linux kernel) au delta de ce que l'on appelle les Google Bits (Google Map, GMail, etc...) dont on peut techniquement se passer...

Installation du Kit de développement pour Android

Le kit de développement pour Android ne sert pas qu'aux développeurs. Il permet de compiler soit même des applications Andoid (par exemple la dernière version du client Funambol), ou encore de bénéficier d'outils bien pratiques comme l'émulateur d'Android (une sorte de VirtualBox pour cette plate-forme), ddms qui permet de se connecter sur son téléphone pour en auditer le fonctionnement mais surtout de faire des copies d'écran, et enfin adb que nous allons étudier un peu plus loin.

L'installation du kit de développement s'est grandement simplifié depuis CupCake. Aujourd'hui un centre de contrôle unique permet de télécharger les différentes plateformes, les mises à jour, créer et lancer l'émulateur, etc.

La première chose à faire est donc de télécharger cette application et la décompresser où bon vous semble (ex. /opt/android-sdk). Ensuite, si vous êtes en 64bits, vous devez installer certaines librairies 32bits nécessaire au lancement des outils.

  • libSDL
  • libx11
  • libalsa2

Une fois que tout est en place, il ne reste plus qu'à aller dans le dossier /opt/android-sdk/tools pour lancer la commande ./android. Là nous découvrons une interface GTK de base mais propre et simple à utiliser. La première chose à faire et d'aller dans la rubriquer settings pour empêcher l'usage d'https pour le téléchargement des plate-formes.

Ceci fait, nous allons dans installed packages pour appuyer sur le bouton Update All.... Apparaît alors la liste des paquets disponibles. Là vous pouvez sélectionner la dernière version 2.1 d'android et clicker sur Install Accepted.

Le téléchargement commence et risque de prendre un certain temps. Lorsque c'est terminé, tous les outils sont en place.

Utilisation de l'émulateur

L'émulateur est bien pratique pour tester une version de la plate-forme, y installer des applications, tester des ROM, etc. Avec le centre de contrôle, il est très simple de créer un profile d'émulation pour une version donnée d'android (sous réserve de l'avoir installé, voir étape précédente). Pour cela vous devez aller dans la section Virtual Devices et clicker sur New...

Apparaît alors un panneau de configuration où vous pouvez saisir un nom de machine (ce qui vous chante), sélectionner un niveau de compatibilité (ex. Android 2.1), une taille d'écran, etc. Lorsque cela vous convient, clickez sur Create AVD et la machine virtuelle correspondante devrait apparaître dans la liste des Virtual Devices.

Il ne reste maintenant plus qu'à sélectionner la machine virtuel et clicker sur Start....

Paramétrage de l'USB debug et copie d'écran

Pour utiliser ADB et DDMS, nous allons devoir communiquer avec l'androphone en passant par le câble USB. Par défaut, le lien USB est utilisé pour synchroniser le téléphone avec un ordinateur de bureau ou encore de transformer le téléphone en disque externe. Pour utiliser nos outils et contrôler l'androphone à partir de GNU/Linux, nous allons devoir le configurer pour que l'USB fonctionne selon un troisième mode "USB Debug". Pour cela, allez dans les réglages du téléphone, dans la section Applications, puis Développement et cochez Débogage USB.

Lorsque c'est fait, vous pouvez raccorder le téléphone à votre ordinateur par le câble USB. En tapant dmesg dans une console, vous devez obtenir les informations suivantes :

rootdmesg
usb 8-4: new high speed USB device using ehci_hcd and address 69
usb 8-4: New USB device found, idVendor=0bb4, idProduct=0c02
usb 8-4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb 8-4: Product: Android Phone
usb 8-4: Manufacturer: HTC
usb 8-4: SerialNumber: HT97FL903160
usb 8-4: configuration #1 chosen from 1 choice
scsi70 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 69
usb-storage: waiting for device to settle before scanning
scsi 70:0:0:0: Direct-Access     HTC      Android Phone    0100 PQ: 0 ANSI: 2
sd 70:0:0:0: [sdd] Attached SCSI removable disk
sd 70:0:0:0: Attached scsi generic sg4 type 0
usb-storage: device scan complete
Mobile Android en mode débogage USB

La liaison USB est maintenant prête à être utilisée. Pour tester, toujours dans le dossier tools, lancez la commande ./ddms. Apparaît alors une nouvelle application qui n'est autre que le debugger/moniteur de la machine virtuelle du téléphone (aka Dalvik). Si ce dernier est correctement reconnu, vous devriez voir apparaître sa référence en tête d'une petit arborescence. Dans le cas contraire vous aurez des points d'interrogation indiquant que DDMS n'arrive point à communiquer avec le téléphone. Si vous avez bien branché le câble et bien activé le mode Debug, il se peut que ce soit là un problème de droit sur le périphérique USB. Dans ce cas, tentez de créer le fichier suivant

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="0c02", MODE="0666"

Notez que nous faisons correspondre les identifiants 0bb4 et 0c02 avec ce que nous voyons dans la trace donnée plus haut. Une fois le fichier sauvegardé, débranchez et rebranchez le câble pour vérifier que l'ami ddms se porte mieux.

Une fois que le téléphone est correctement pris en charge, vous pouvez créer une copie de l'écran en cours en allant dans Device/Screen Capture..., tout simplement. Bien évidement DDMS est beaucoup plus utile que cela... pour un développeur :-)

Android Debug Bridge

Non, l'outil qui lui va nous être vraiment très utile est ADB. ADB (pour Android Debug Bridge) est un couteau suisse que tout bidouilleur d'Android se doit de connaître. Il permet en effet de communiquer en direct avec Android par la même connexion USB que DDBS pour y exécuter un tas de commandes utiles allant jusqu'à un véritable shell (un peu comme un ssh).

Comme nous savons grâce à l'étape précédent que la connexion USB du téléphone est fonctionnelle, il ne reste plus qu'à lancer un adb shell pour se balader dans le téléphone

root./adb shell
gastonls
sqlite_stmt_journals
cache
sdcard
etc
system
sys
sbin
proc
logo.rle
init.rc
init.hero.rc
init.goldfish.rc
init
default.prop
data
root
dev
gastonexit
Lancement de la commande adb

Ici fonctionne la majorité des commandes dont vous avez l'habitude en console unix (ls, find, rm, etc..) mais comme vous le constatez, le $ vous signifie bien que vous n'êtes pas root sur cette machine. Beaucoup d'opérations vous seront donc interdites.

Beaucoup d'autres commandes existent pour cet outil. Vous pouvez en obtenir la liste en tapant simplement ./adb. Vous pouvez ainsi lire et écrire sur le système de fichier en utilisant les commande ./adb push un_fichier un_dossier distant ou dans l'autre sens ./adb pull un_fichier_distant un_dossier_local. Ou encore, avec adb logcat obtenir les traces du système android en temps réel.

root./adb logcat
I/Contact WidgetView(  122): com.htc.android.mail.intent.change changed mContentChanged? true changed false
D/NotificationFlashLightUtility getIncomingCall(  343): load fail~~~~~~~~~~
D/NewMailNotification(  343): 06021143 createNotification: isFlashEnabled> true, sound> 0, vibrate>1
D/NewMailNotification(  343): 06021143 enableJogBallLight>
I/Contact WidgetView(  122): android.intent.action.NOTIFICATION_ADD changed mContentChanged? true changed false
D/HardwareService(   65): vibratePattern , repeat=-1
I/HardwareService(   65): vibrating with pattern:  0 250 250 250
D/HardwareService(   65): VibrateThread , run start
D/MailWidget(  122): BroadcastReceiver:  ACTION_HTC_MAIL_CHANGE...
D/MailWidget(  122): BroadcastReceiver:  EXTRA_HTC_MAIL_FLAG_CHANGE: false, true, false, false, false
I/Contact WidgetView(  122): com.htc.android.mail.intent.change changed mContentChanged? true changed false
D/Rosie   (  122): request to update icon, itemId : 2
D/Rosie   (  122): request to update icon, itemId : 33
D/Rosie   (  122): request to update icon, itemId : 73
D/KeyguardViewMediator(   65): wakeWhenReadyLocked(6)
D/KeyguardViewMediator(   65): handleWakeWhenReady(6)
...
adb logcat - les traces d'android

Conclusion

Comme vous le voyez, le kit de développement d'Android est vrai paradis pour bidouilleur. Le seul regret reste ici qu'il ne soit toujours pas fournit en version 64 bits.