jeudi, décembre 10 2009

Du café dans l'petit robot

Avec tous ces androids qui fleurissent un peu partout dans mon entourage ces derniers temps il fallait bien que je craque un jour ou l'autre... Première étape du craquage : je me replonge (légèrement) dans le Java[1] pour jouer un petit peu avec le SDK et les émulateurs android fournis par Google. Et comme je sens que les étapes d'initialisations d'un projets ou d'une VM sont du genre à disparaitre de ma mémoire en moins de temps qu'il n'en faut à Windows ME pour planter je me suis dit que j'allais en faire un petit billet pour ce blog, à moitié sous forme de mémo donc, histoire de conserver une trace de toutes les étapes à mener pour jeter les premières fondations d'une appli android[2]

Creative Commion - Based on the pictures by "Joi" and "DeaPeaJay" on Flickr

Téléchargement de l'environnement

Première étape : récupérer le SDK chez Google. Jusque là : facile ;) Ensuite on décompresse l'archive tar xvzf android-sdk_r3-linux.tgz. Toujours rien de compliqué jusqu'à présent. Pas d'improvisation, soyons discipliné cd android-sdk-linux && cat "SDK Readme.txt", la ligne suivante nous est donnée directement par le petit texte du Readme, ./tools/android update sdk. Ca ouvre un GUI...bon, c'est l'heure d'improviser. Visiblement le GUI permet de télécharger des composants essentiels qui ne sont pas inclus dans l'archive, par exemple ce qu'il faut pour créer des android virtuels (je me disait bien que 15M pour le tout ça faisait léger...). Je choisis un SDK pour Android 2.0 (la version la plus récente), et j'espère que ça suffira pour commencer (le bébé pèse tout de même plus de 40M et je suis en train de faire un gros emerge world à coté donc ma bande passante est assez limitée ;) )

Préparation de l'environnement

Une fois le téléchargement et l'installation (automatique) terminés on a toutes les briques de bases. Préparons tout ça pour que ça soit en état de fonctionner. Dans la fenêtre de GUI que je n'ai pas encore fermée (mais qu'on peut retrouver aisément en lançant juste ./tools/android sans arguments) je choisis le menu "Virtual Devices" et hop je clique sur "New", rien de super compliqué là, je prend les valeurs par défaut puis je clique sur "Create AVD" (Android Virtual Device). Ca a l'air d'avoir marché puisque ma VM (pardon, "mon AVD" ) apparait maintenant dans une liste de choix qui était auparavant vide. Je la sélectionne, je clique sur "Start" et là la magie s'opère : l'android virtuel démarre bien.

  • Première constatation : je n'aurai peut-être pas du laisser le skin par défaut, il est vraiment laid (mais au moins il a l'air fonctionnel, je vais sans doute m'y habituer, et rien ne dit que les autres sont mieux lol).
  • Seconde constatation : le démarrage est lent, mais alors vraiment lent ! Je pensais que sur émulateur ça irait plus vite que sur les vrais téléphones mais non (ceci dit mon pc n'est pas une machine de guerre...mais quand même). Je suppose que c'est la faute de Java, de toute façon quand quelque chose rame c'est forcément la faute de Java ;) !


Android AVD started

Hello World

Démarrer le projet

Bien, maintenant qu'on arrive à faire tourner des android virtuels, il est temps de sacrifier à l'éternelle tradition du "Hello World". Seulement voilà : je n'aime pas le Java[3], et je n'aime pas Eclipse non plus, donc je ne vais pas pouvoir suivre à la virgule près le tutoriel officiel...qu'à celà ne tienne, je vais essayer d'y coller au mieux et au moins je comprendrai sans doute un peu mieux comment ça se passe que ceux qui se contentent de cliquer sur des gros boutons Eclipse "Auto Write Code And Compile And Debug And Deploy And Become Rich" ;)
Première étape : démarrer un nouveau projet android. Pour ce faire j'aurai besoin de :

  • Connaitre ma plateforme cible (i.e. la version d'android pour laquelle je veux écrire un programme). Comme je n'en ai téléchargé qu'une (pour android 2.0, souvenez vous) je suis prêt à parier que ma cible porte le numéro "1", mais bon, vérifions tout de même : ./tools/android list targets Gagné : l'indice 1 (le seul présent) correspond bien à l'API level 5, android 2.0 :)
  • Un nom pour mon application. Je vais faire original : Hello
  • Un répertoire pour stocker mon projet (s'il n'existe pas il sera créé en même temps que le projet). Encore une fois soyons original : ~/android_hello
  • Le nom de la classe d'Activité par défaut de mon projet. Alors là ça demande une petite explication de texte : d'après ce que j'ai compris en survolant les site parlant d'android une "Activity" serait, en gros, l'équivalent d'un thread. Donc là il me demande plus ou moins le nom de la classe à lancer au démarrage de mon appli. Continuons dans l'originalité : HelloActivity
  • Le namespace du package de mon projet, comme en Java. Hop : fr.ozwald.android.hello

Une fois ces éléments décidés, plus qu'à taper la commande magique :

./tools/android create project --target 1 --name Hello --path ~/android_hello --activity HelloActivity --package fr.ozwald.android.hello

Voilà, ça semble avoir marché. En tout cas il m'a créé tout pleins de fichiers dans ~/android_hello (qu'il a créé pour l'occasion) et ne m'a sorti aucun message d'erreur. J'aime quand un plan se déroule sans accroc !

Modifier le squelette de projet

Petit coup d'oeil dans le répertoire ~/android_hello/src/fr/ozwald/android/hello/, on y trouve un fichier Java qui correspond à priori au squelette de ma toute nouvelle application (et qui est le même que celui trouvé dans le tuto officiel avec Eclipse, elle est pas belle la vie ;) ?). Plus qu'à suivre les modifications proposées par le tuto officiel afin d'obtenir le code suivant :

package fr.ozwald.android.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloActivity extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       TextView tv = new TextView(this);
       tv.setText("Hello, Android");
       setContentView(tv);
   }
}

Normalement ça devrait suffire pour le Hello World.

Compiler le projet

Compilons donc la chose, en mode debug (ce qui simplifie un peu le déploiement en zappant l'étape de signature du jar mais en interdit l'exécution hors des environnement virtuels) cd ~/android_hello && ant debug. Bon...bug. M'étonnes pas venant de Java -_- Il s'emmèle les pinceaux entre les JRE et les JDK que j'ai sur mon poste. Après 5mn à trifouiller je m'en sort avec un petit emerge -uv --oneshot java-config. suivi d'un java-config -S 2 afin de redéfinir ma JAVA_HOME actuelle pour pointer sur l'un des JDK que j'ai, plutôt que sur un JRE. Reprenons : ant debug. Le script semble content puisqu'il me parle de façon polie (i.e. pas de gros "FAIL" et autres "ERRORS") et effectivement dans le répertoire ~/android_hello/bin je trouve bien un "Hello-debug.apk"[4]. Youpi :) !

Tester l'appli

Plus qu'à installer notre appli sur notre android virtuel, et le tour sera joué. Pour ce faire je redémarre mon AVD et, depuis le répertoire "tools" du SDK android, je lance l'incantation magique qui devrait installer l'appli dessus pendant qu'il fonctionne ./adb install ~/android_hello/bin/Hello-debug.apk. Je regarde à présent dans l'AVD et, miracle, une nouvelle application est là : HelloActivity (bon, pas très joli tout ça, mais on s'en fout pour l'instant). Je la lance...Ca marche :) !

Android HelloWorld
Voilà, finalement ça a presque été facile et ce post ne me servira peut être jamais tellement avoir un trou de mémoire là dessus semble peu probable, mais "sait-on jamais"... Et d'ailleurs pour conclure voici une mini astuce : à la place de compiler (ant debug) puis d'installer (adb install ~/android_hello/bin/Hello-debug.apk), vous pouvez (à condition qu'il n'y ai qu'un AVD en route) remplacer ces deux commandes par un unique ant install qui fera la compilation en debug puis l'installation à la volée. Vachement pratique ^_^ !

Notes

[1] Le Python est supporté depuis peu via le "Android Scripting Environment" mais, hélas, il ne permet pas (encore ?) de réaliser des applications complètes déployables via le market :(

[2] Oui, je ne suis pas le premier, et certainement pas le meilleur auteur, mais comme prévenu : ce billet a pour premier but de me servir d'aide mémoire pour une fois ^_^

[3] Oui je sais : ça ne se voit pas trop ;)

[4] apk c'est l'extension des applications pour android...à priori c'est des JAR ;)