Il y a quelques jours, j’ai découvert le développement Android et Eclipse par la même occasion. Ayant abandonné il y a longtemps les IDE, j’ai tout de même décidé de sauter le pas histoire de ne pas mourir idiot.
Il faut le reconnaître, l’intégration Android dans Eclipse est très bien pensée et plutôt efficace : auto-complètement, assistants à tout va, débogueur, etc. Seulement voilà, il faut se rendre à l’évidence : quand on est habitué à Vim, l’éditeur de texte d’Eclipse fait plutôt pâle figure. Et en y réfléchissant bien, l’essentiel du développement Android reste l’écriture de code toute bête ou la modification de fichiers XML : pourquoi ne pourrait-on pas simplement utiliser une console et l’éditeur de texte de notre choix ?
Voici donc ce que propose ce tutorial : l’installation d’un environnement de développement simplifié pour Android.
Prérequis
Avant de poursuivre ce tutorial, vérifiez que vous :
- Êtes habitué au développement “console”. Si vous n’avez jamais utilisé que des IDE, je ne peux que trop vous conseiller de rester dans cet environnement. Le développement Android en console n’est pas recommandé par Google et de plus beaucoup moins facile d’accès que pour d’autres langages (C, C++).
- Savez ajouter/modifier/supprimer des variables d’environnement.
- Avez téléchargé et installé le Android SDK. Si vous ne connaissez pas la marche à suivre, elle est indiquée dans cet article.
- Êtes prêt à passer pour un fanatique auprès de vos amis qui utilisent un IDE.
Si vous remplissez toutes ces conditions, c’est parti !
Développons en Java
On a beau se passer d’Eclipse, on ne peut évidement se passer d’utiliser Java.
Commencez par télécharger le kit de développement Java (JDK) pour votre système d’exploitation, puis installez-le.
Pour ma part, j’ai choisi le chemin d’installation par défaut, c’est à dire “C:\Program Files\Java” sur mon Windows Seven 64 bits.
On se retrouve avec les deux répertoires suivants :
La dernière étape concernant Java, consiste à ajouter le sous-répertoire “C:\Program Files\Java\jdk1.6.0_22\bin” au PATH de l’environnement.
Ouvrez une fenêtre console et saisissez la commande suivante :
1 |
javac |
Si vous obtenez la sortie suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
C:\Users\Julien>javac Usage: javac <options> <source files> where possible options include: -g Generate all debugging info -g:none Generate no debugging info -g:{lines,vars,source} Generate only some debugging info -nowarn Generate no warnings -verbose Output messages about what the compiler is doing -deprecation Output source locations where deprecated APIs are used -classpath <path> Specify where to find user class files and annotation processors -cp <path> Specify where to find user class files and annotation processors -sourcepath <path> Specify where to find input source files -bootclasspath <path> Override location of bootstrap class files -extdirs <dirs> Override location of installed extensions -endorseddirs <dirs> Override location of endorsed standards path -proc:{none,only} Control whether annotation processing and/or compilation is done. -processor <class1>[,<class2>,<class3>...]Names of the annotation processors to run; bypasses default discovery proces s -processorpath <path> Specify where to find annotation processors -d <directory> Specify where to place generated class files -s <directory> Specify where to place generated source files -implicit:{none,class} Specify whether or not to generate class files for implicitly referenced files -encoding <encoding> Specify character encoding used by source files -source <release> Provide source compatibility with specified release -target <release> Generate class files for specific VM version -version Version information -help Print a synopsis of standard options -Akey[=value] Options to pass to annotation processors -X Print a synopsis of nonstandard options -J<flag> Pass <flag> directly to the runtime system |
C’est que tout est bien configuré
Un peu de ménage
Avant d’installer le JDK, je me suis rendu compte que j’avais déjà une version du runtime Java installée.
Si c’est également votre cas, rien ne vous empêche de la garder, mais pour éviter les conflits potentiel, et ne pas gaspiller inutilement de l’espace disque, j’ai choisi de procéder manuellement à sa désinstallation avant d’installer le JDK.
J’ai également à ce moment là, fait le ménage dans les variables d’environnement qui faisaient référence à Java.
Ant, un “Makefile-like” pour Java
Le Android SDK utilise Ant pour automatiser la compilation des projets. Pour ceux qui connaissent, c’est une alternative orientée Java à Makefile, CMake, SConstruct ou encore BJAM.
Pour les plus curieux, vous pouvez faire un tour sur la page officielle de Ant.
Sinon, passons directement au téléchargement : Télécharger Ant.
Décompressez l’archive où bon vous semble (j’ai choisi encore une fois de tout mettre dans C:\) et ajoutez les variables d’environnement suivantes :
- ANT_HOME : Le chemin vers l’archive décompressée. Chez moi : “C:\apache-ant-1.8.1″
- JAVA_HOME : Le chemin vers l’installation du JDK. Chez moi : “C:\Program Files\Java\jdk1.6.0_22″
- PATH : Ajoutez le chemin vers les binaires de Ant. Chez moi : “C:\apache-ant-1.8.1\bin”
Une fois que tout est configuré, ouvrez une nouvelle console et tapez :
1 |
ant |
Si vous obtenez la sortie suivante :
1 2 3 |
C:\Users\Julien>ant Buildfile: build.xml does not exist! Build failed |
C’est que Ant est correctement installé.
Si ça ne fonctionne pas, vérifiez bien que l’environnement de votre console est bien à jour. Sous Windows, il faut fermer toutes les fenêtres consoles et les ré-ouvrir pour appliquer les modifications faites à l’environnement.
C’est tout ?
Oui. Il n’en faut pas plus pour avoir un environnement de compilation simple pour Android.
Nous pouvons d’ores et déjà voir comment créer un nouveau projet, le compiler et le déployer sur un émulateur.
Création d’un projet
Pour créer un nouveau projet, nous allons utiliser la commande “android”.
Voici la syntaxe pour créer un nouveau projet :
1 2 3 4 5 6 7 |
android create project \ --target <em><version_cible></em> \ --name <em><nom></em> \ --path <em><chemin></em> \ --activity <em><activité></em> \ --package <em><</em>espace_de_nom<em>> </em> |
La signification des différents paramètres est la suivante :
- version_cible : l’identifiant de version Android cible à utiliser. Pour avoir la liste des identifiants disponibles sur votre poste, utilisez la commande “android list targets”.
- nom : Le nom de votre projet. Ce paramètre est optionnel, mais s’il est spécifié, ce nom sera celui du paquet “.apk” généré ultérieurement.
- chemin : Le répertoire cible où sera créé votre nouveau projet.
- activité : Le nom complet de l’activité. Exemple : “MyAndroid”.
- espace_de_nom : L’espace de nom (ou “namespace”) utilisé par votre projet. Exemple : “org.freelan.myandroid”.
Google donne la commande exemple suivante :
1 2 3 4 5 6 |
android create project \ --target 1 \ --name MyAndroidApp \ --path ./MyAndroidAppProject \ --activity MyAndroidAppActivity \ --package com.example.myandroid |
Qui crée dans le répertoire courant un sous-répertoire “MyAndroidAppProject” contenant le nouveau projet.
Nous ne rentrerons pas ici dans les détails de cette arborescence, mais voici tout de même dans les grandes lignes les choses intéressantes :
- Les fichiers source Java sont situés dans le répertoire “src”.
- Tout ce qui concerne les chaînes de caractères, fichiers XML représentant l’interface graphique (ou “Layouts”) ou images sont dans le répertoire “res”.
- Ne touchez jamais aux fichiers “*.properties” ! Ils sont utilisés par Ant pour la phase de “build” et n’ont pas vocation à être modifiés manuellement.
Compilation du projet
Le projet, tel que créé par défaut est simpliste mais fonctionnel. Le rôle de ce tutoriel n’étant pas d’apprendre à concevoir une application Android mais de simplement maitriser les outils du SDK, nous ne ferons aucune modification de ce projet.
Pour être diffusée, une application Android doit être signée. Ceci implique plusieurs démarches dont nous traiterons dans un autre tutoriel. Pour l’heure, nous choisissons de compiler notre projet en “debug”, ce qui nous permet de nous affranchir de cette étape.
Dans la même console, toujours à la racine du projet, tapez simplement la commande :
1 |
ant debug |
Qui a pour effet de générer dans le répertoire “bin” différentes choses, dont le fichier “MyAndroidApp-debug.apk”.
Ce n’est pas plus compliqué que ça.
Création d’un périphérique virtuel
Pour tester notre application, il nous faut soit un téléphone sous Android relié en USB et configuré en mode développeur, soit un téléphone virtuel lancé dans un émulateur.
Si vous n’avez pas encore créé de téléphone virtuel, voici la marche à suivre :
Dans votre console, tapez la commande :
1 |
android |
Ce qui a pour effet d’ouvrir la fenêtre suivante :
Cliquez sur “New…”, puis spécifiez les caractéristiques de votre téléphone virtuel :
Puis validez en cliquant sur “Create AVD”.
Si tous les paramètres sont corrects, votre téléphone virtuel est créé. Vous pouvez d’ores et déjà le démarrer en le sélectionnant dans la liste et en cliquant sur le bouton “Start…”.
Ce premier démarrage peut être assez long, aussi, soyez patient.
Installer son application sur le téléphone
Une fois le paquet “apk” créé, l’installation sur un téléphone (qu’il soit virtuel ou non) se fait très simplement :
1 |
adb install <em>bin\MyAndroidApp-debug</em>.apk |
La commande prends quelques secondes et vous indique le succès ou l’échec de l’opération.
Si vous disposez de plusieurs émulateurs, ou d’un émulateur et d’un téléphone physique, adb ne peut pas deviner où installer votre paquet.
Utilisez alors la syntaxe suivante pour spécifier le périphérique à utiliser :
1 |
adb -s emulator-5554 install bin\MyAndroidApp-debug.apk |
Ou positionnez la variable d’environnement ANDROID_SERIAL avant vos appels à adb.
Pour obtenir la liste des numéros de série des périphériques, vous pouvez utiliser la commande suivante :
1 |
adb devices |
La commande “adb install” possède tout un tas d’option qu’il ne serait pas raisonnable de détailler ici. Vous devriez cependant y jeter un coup d’oeil. Pour les lister, tapez simplement :
1 |
adb install |
Qui produit la sortie suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
C:\Users\Julien>adb install Android Debug Bridge version 1.0.26 -d - directs command to the only connected USB device returns an error if more than one USB device is present. -e - directs command to the only running emulator. returns an error if more than one emulator is running. -s <serial number> - directs command to the USB device or emulator with the given serial number. Overrides ANDROID_SERIAL environment variable. -p <product name or path> - simple product name like 'sooner', or a relative/absolute path to a product out directory like 'out/target/product/sooner'. If -p is not specified, the ANDROID_PRODUCT_OUT environment variable is used, which must be an absolute path. devices - list all connected devices connect <host>:<port> - connect to a device via TCP/IP disconnect <host>:<port> - disconnect from a TCP/IP device device commands: adb push <local> <remote> - copy file/dir to device adb pull <remote> [<local>] - copy file/dir from device adb sync [ <directory> ] - copy host->device only if changed (see 'adb help all') adb shell - run remote shell interactively adb shell <command> - run remote shell command adb emu <command> - run emulator console command adb logcat [ <filter-spec> ] - View device log adb forward <local> <remote> - forward socket connections forward specs are one of: tcp:<port> localabstract:<unix domain socket name> localreserved:<unix domain socket name> localfilesystem:<unix domain socket name> dev:<character device name> jdwp:<process pid> (remote only) adb jdwp - list PIDs of processes hosting a JDWP transport adb install [-l] [-r] [-s] <file> - push this package file to the device and install it ('-l' means forward-lock the app) ('-r' means reinstall the app, keeping its data) ('-s' means install on SD card instead of internal storage) adb uninstall [-k] <package> - remove this app package from the device ('-k' means keep the data and cache directories) adb bugreport - return all information from the device that should be included in a bug report. adb help - show this help message adb version - show version num DATAOPTS: (no option) - don't touch the data partition -w - wipe the data partition -d - flash the data partition scripting: adb wait-for-device - block until device is online adb start-server - ensure that there is a server running adb kill-server - kill the server if it is running adb get-state - prints: offline | bootloader | device adb get-serialno - prints: <serial-number> adb status-window - continuously print device status for a specified device adb remount - remounts the /system partition on the device read-write adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program adb reboot-bootloader - reboots the device into the bootloader adb root - restarts the adbd daemon with root permissions adb usb - restarts the adbd daemon listening on USB adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port networking: adb ppp <tty> [parameters] - Run PPP over USB. Note: you should not automatically start a PPP connection. <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1 [parameters] - Eg. defaultroute debug dump local notty usepeerdns adb sync notes: adb sync [ <directory> ] <localdir> can be interpreted in several ways: - If <directory> is not specified, both /system and /data partitions will be updated. - If it is "system" or "data", only the corresponding partition is updated. |
Démarrer une activité
Une fois installée, vous pouvez démarrer l’activité sur votre téléphone comme vous le feriez pour n’importe quelle autre application. Mais si vous le souhaitez, vous pouvez également le faire en ligne de commande (voire automatiquement, si vous mettez toutes les commandes dans un script).
La commande ci-après démarre votre activité sur le téléphone spécifié (ou sur le seul téléphone connecté) :
1 |
adb shell am start -a android.intent.action.MAIN -n com.example.myandroid/.MyAndroidAppActivity |
Vous pouvez d’ailleurs démarrer n’importe-quelle activité en utilisant cette méthode.
Une seule commande pour tout
Astuce qu’il est agréable de connaître : Il est possible de réunir les dernières étapes en une seule commande en utilisant la commande suivante :
1 |
ant install |
Qui va se charger de faire un “ant debug”, “adb install…” pour vous. Plutôt sympa non ?
Conclusion
Le développement Android en mode console s’avère moins pénible à mettre en place que je ne l’aurais pensé. Google a fait un travail impressionnant en fournissant aux développeurs des outils simples et facile à intégrer à n’importe quel environnement.
Certains argueront que l’apprentissage du développement Android est bien plus facile sous Eclipse, et je pense que dans un sens ce n’est pas faux : il est clair qu’avoir le complètement automatique et des assistants permet d’apprendre peu à peu et facilement les différentes structures de données à utiliser. Cependant, la découverte de cet environnement console permet assurément de comprendre tout ce qu’Eclipse fait pour nous de façon automatique.
L’utilisation directe de “adb” peut notamment fournir au développeur des outils avancés indispensables et une aide précieuse au développement.
Hello Julien,
Parfait comme tutorial, il vient de me permettre de faire tourner une application qt via qt android-lighthouse sur un téléphone androïd 2.1 (LG Gt 540).
Cela irait si je t’envois un billet sur tout ça demain pour validation et peut-être publication ?
Merci et super pour l’idée d’article !
On va d’ailleurs faire encore mieux que ça. Je te crée un compte de suite et tu pourras le publier toi-même
Ping : « Développer avec Qt pour android
Merci beaucoup pour le tuto, je ne parvenais pas à créer une application HelloWorld qui fonctionne sur mon téléphone avec Eclipse, là avec “ant debug” ça m’a créé un apk fonctionnel.
Et je trouve ça plus pratique en ligne de commande.
Je ne sais pas si c’est plus pratique au quotidien pour tout le monde, mais je partage ton avis, étant un inconditionnel de la ligne de commande
Dans tous les cas, ça permet au moins de comprendre ce qui se base “en dessous” de l’environnement Eclipse. Les IDE font tellement de choses ces jours-ci qu’on risque parfois de perdre de vue le fonctionnement bas-niveau, souvent indispensable.
Ravi d’avoir pu aider
Bonjour,
Mon eclipse ramant énormément j’ai donc cherché a développer pour android sans eclipse et suis tomber sur ce site.
J’ai réussi à tout installer mais quand je fais ant debug j’ai ce message d’erreur qui s’affiche :
BUILD FAILED
C:\users\Administrateur\Desktop\android\premiertest\build.xml:8: The following error occured while executing this line :
jar:file:C:/apache-ant_1.8.1/lib/ant/ant.jar!/org/apache/tools/ant/antlib.xml:37 : Problem: failed to create task or type componentdef
cause: The name is undefined
Action: Check the spelling
Action: Check that any custom tasks/type have been declared
Action: Check that any / declaration have taken place
Cela fait maintenant deux soirs que je cherche en tapant le message d’erreur dans google, je tombe sur des forum anglais et même avec la traduction je n’arrive pas savoir d’ou ça vient…
Si quelqu’un pourrait m’aidez s’il vous plait
Bonjour,
J’avoue que ça va être difficile de t’aider, n’ayant jamais rencontré cette erreur et n’ayant pas non plus la moindre idée de sa signification.
As-tu suivi le tutorial point par point à partir d’une installation propre ? Souvent, quand on est perdu le meilleur moyen de retrouver son chemin c’est de reprendre du début : essaye de désinstaller tout l’environnement (Java, Eclipse, ant, le SDK android) en prenant soin de ne pas oublier les variables d’environnement et de redémarrer après coup.
J’ai suivi ces étapes plusieurs fois sur des postes différents et je n’ai jamais rencontré de problème.
Salut,
Merci pour ton partage de connaissances, très intéressant.
Je suis sur un projet de génération d’application android automatique, je vais donc suivre ton tuto mais j’aurai besoin également de signer mes applications.
“Pour être diffusée, une application Android doit être signée. Ceci implique plusieurs démarches dont nous traiterons dans un autre tutoriel.”
Peux tu m’aiguiller?
Cdlt,
Salut,
Je t’avoue ne l’avoir jamais fait moi-même autre qu’en debug. Je n’ai rien publié sur l’Android Market, principalement par manque de temps.
Google propose cependant des explications plutôt claires (mais en anglais) sur cette page : http://developer.android.com/guide/publishing/app-signing.html
Je sais qu’il y a certains pré-requis pour signer une application en “release”. Il faut notamment avoir une clé et un certificat qui expirent après 2033.
J’ignore si Google fournit des outils pour la génération de certificats, mais dans tous les cas, on devrait aussi pouvoir utiliser OpenSSL (en ligne de commande) pour ça. J’envisage depuis quelque-temps déjà d’écrire un article à ce sujet.
Peut-être prochainement
Hey !
J’ai suivi ton tuto comme il se doit mais je me retrouve bloqué au moment de la création du projet : ‘android’ n’est pas reconnu en tant que commande interne ou externe etc..
Les étapes avec javac et ant sont ok pourtant :/
Une idée?
Salut Awy À vue de nez, je dirais que le fichier ‘android.exe’ n’est probablement pas dans ton PATH. Peux-tu vérifier dans une console si la sortie de la commande : echo %PATH% Liste bien l’endroit, sur ton système, où se trouve ‘android.exe’ ? Normalement, il devrait être dans un des sous-répertoires du SDK Android. Si ce n’est pas le cas, modifie ton PATH (comme tu l’as surement déjà fait pour Ant en suivant ce tuto) pour y ajouter le chemin vers ‘android.exe’ et n’oublie pas de relancer tes consoles ouvertes quand ce sera fait. Si ça ne fonctionne toujours pas, n’hésite pas à venir me dire si tu as pu avancer. Bon courage !
Bonjour Julien
Merci pour ce tuto. Avant d’arriver ici je suis tombé sur des tutos avec Eclipse, mais à mes yeux c’est bien plus compliqué que cette méthode.
J’ai cependant un petit problème.
La commmande “ant debug” ne génère pas l’apk .
Je joins les lignes concernant ce problème dans le résultat de la commande.
-package:
[apkbuilder] Current build type is different than previous build: forced apkbuil
der run.
[apkbuilder] Creating MonApplication-debug-unaligned.apk and signing it with a deb
ug key…
BUILD FAILED
Qu’aurais-je bien pu oublié dans le processus d’installation ?
Merci de votre aide.
Sylvinho
Bonjour,
Hélas les choses ont du changer depuis que j’ai écrit cet article.
Je te conseille de regarde du côté de ce lien officiel : http://developer.android.com/tools/projects/projects-cmdline.html
Ce sera certainement plus a jour que ce que j’ai écrit et peut-être cela règlera-t-il ton problème.
Ping : Android en ligne de commande – ®om's blog