Si vous êtes développeur Android, vous aurez sans doute remarqué qu’aucun mécanisme ne permet de partager des ressources entre plusieurs projets. Étant l’auteur d’une petite dizaine d’applications, la gestion des ressources communes commence à devenir un véritable problème. En effet, s’il est très simple de partager du code Java par l’intermédiaire de jars, il vous est impossible de partager des images ou des layouts entre plusieurs applications. Ceci vient de la gestion même des ressources dans un projet Android et de leur utilisation. En effet chaque ressource est référencée sous la forme d’une constante dans un fichier ‘R.java’ automatiquement généré. C’est cette constante que vous devez utiliser pour utiliser vos différentes ressources dans vos applications. Comme il n’est pas possible d’inclure un projet Android dans un autre, nous somme bloqués.
Étonnamment, ce besoin ne semble pas intéresser plus que cela la communauté Android. En consultant la liste des demandes d’évolutions, seule une fiche fait référence à ce type de besoin. Cette demande me paraissant pourtant légitime, j’en ai discuté avec Romain Guy, l’un des développeurs Android. Selon lui, la plateforme Android ne permet pas de répondre directement à cette problématique. Tournons-nous donc vers nos outils de builds.
Cet article présente une manière de configurer un build Maven sur une application Android. Après la lecture de cet article, vous saurez comment construire et déployer un projet Android en utilisant Maven, mais également comment découper vos applications pour partager du code entre votre application Android et sa partie serveur, et comment partager du code et des ressources entre différentes applications Android. Le contenu de cet article est largement inspiré de la traduction officielle du chapitre Android du Maven Reference Guide que je viens tout juste de terminer.
Le plugin Maven Android
Le plugin Maven Android permet de construire, déployer et publier des applications Android avec Maven. Vous pouvez ainsi tirer parti des fonctionnalités Maven dans une application Android. Voyons comment utiliser un projet multi-module et la gestion des dépendances pour arriver d’une part à factoriser du code entre l’application Android et ses services web côté serveur, d’autre part à externaliser les assets/ressources communs entre plusieurs projets Android.
git clone git://github.com/jayway/maven-android-plugin.git
cd maven-android-plugin
mvn clean install
Préparez votre environnement Android pour Maven
Avant de pouvoir utiliser Maven pour construire vos applications Android, quelques tâches préalables sont nécessaires :
Installation du SDK Android
Installation des jars de l’API Android dans un dépôt (local et/ou distant)
Configuration de Maven pour simplifier l’utilisation du Maven Android Plugin
Installation du SDK Android
Le plugin Android Maven nécessite la présence du SDK Android dans votre environnement de développement. La variable d’environnement ANDROID_HOME doit être configurée pour pointer vers le répertoire d’installation du SDK Android. Ce SDK doit être installé en suivant les consignes disponibles sur le site officiel Android Developer.
En plus du SDK, vous devez également installer les différentes versions des plates-formes dont vous avez besoin pour votre développement. Il s’agit des différentes versions des runtimes Android dont vous désirez vous servir. Par défaut, vous pouvez choisir de toutes les télécharger. Pour en savoir plus à ce sujet, rendez-vous également sur la documentation officielle.
Enfin, afin de faciliter l’utilisation des outils du SDK en ligne de commande, vous pouvez rajouter le répertoire ANDROID_HOME/tools à votre PATH.
Installation des artefacts Android dans votre dépôt
Une fois que le SDK est installé, vous devez mettre à disposition les différents JARs d’API dans un dépôt Maven. L’outil Maven Android SDK Deployer permet d’effectuer cette tâche. Une fois l’outil téléchargé, rendez vous dans son répertoire et tapez la commande mvn clean install. Par défaut, cette commande installe les JARs android.jar et maps.jar dans votre dépôt local. Cet outil vous permet de n’installer qu’une partie des plateformes dans votre dépôt ou de les déployer dans sur un serveur distant, si ces fonctionnalités vous intéressent, rendez-vous à l’adresse suivante
Configuration de Maven pour Android
Afin de pouvoir utiliser les goals du plugin Maven Android à partir de la ligne de commande en utilisant la version courte du nom du plugin ‘android’, vous devez ajouter l’extrait de configuration suivant dans votre fichier settings.xml.
com.jayway.maven.plugins.android.generation2
Utilisation du Maven Android Plugin dans un projet simple
Une fois que votre environnement est correctement configuré, vous pouvez configurer Maven pour construire vos applications Android. Pour cela, ajoutez ce pom.xml à la racine de votre application.
Ce pom.xml est tout à fait traditionnel excepté les points suivants :
Il dispose d’un nouveau type de packaging ‘APK’
Deux plugins sont configurés dans le build : Maven Android et Maven Compiler
Le type de packaging APK permet d’activer le cycle de vie spécifique à Android. Il fait le lien entre Maven et les outils du SDK Android, permet la gestion des ressources, la conversion du bytecode Java en code exécutable Dalvik …
La dépendance vers le JAR de la plateforme doit utiliser la version de la cible telle qu’elle a été publiée dans le dépôt Maven par l’Android SDK Deployer. Il récupère les versions à partir des valeurs Platform.Version et Pkg.Revision renseignées dans le fichier de propriétés source.properties qui se trouve dans le dossier de la plateforme du SDK Android.
La configuration du plugin Maven Compiler dans le build est également nécessaire, car Android utilise les fonctionnalités Java 5 (annotations, boucles simplifiées…).
Pour construire l’application et l’exécuter sur un émulateur déjà lancé, lancez la commande :
mvn clean install android:deploy
Ajoutez des tests à votre application Android
Le test du code d’une application Android peut-être effectué à la manière d’un test unitaire traditionnel junit dans le cadre du SDK Android, mais aussi par l’intermédiaire de tests d’intégration. Ces derniers sont appelés ‘instrumentation tests’.
Exécution des tests unitaires d’un projet Android via Maven
Le plugin Android Maven lance l’exécution des tests unitaires à la manière du plugin Surefire. Comme le chemin par défaut des classes de tests dans Eclipse et dans l’Android Development Toolkit ne respecte pas la convention Maven, vous devez configurer spécifiquement le dossier d’accès au code de vos tests unitaires.
test
...
Gérez vos tests d’instrumentation Android avec Maven
Les tests d’instrumentation sont des tests d’intégration packagés dans une application qui est lancée dans un émulateur (ou un téléphone) et qui interagit avec une autre application pour tester son comportement. Pour exécuter les ces tests d’instrumentation, vous devez disposer de deux projets distincts : l’un pour l’application, l’autre pour les tests d’instrumentation. Ces modules sont liés par l’intermédiaire d’un pom parent.
La configuration du plugin Maven Android pour l’application contenant les tests d’instrumentation est la même que pour celle de l’application principale avec une seule différence : l’ajout d’une dépendance vers l’application principale. Il est important d’ajouter le type apk sur cette dépendance pour permettre au plugin Maven Android de trouver le package de l’application.
Pour la majorité des applications, l’artefact du SDK (android.jar) suffit, il arrive pourtant que certaines applications nécessitent des Add Ons. L’un des Add-Ons les plus connus est celui de Google Maps. Cet Add-On a été déployé dans votre dépôt Maven par l’outil Maven Android SDK Deployer. Afin de pouvoir utiliser cette API, vous avez besoin d’ajouter une dépendance à votre application :
com.google.android.mapsmaps7_r1provided
Découpez vos projets Android avec Maven
Le plugin Maven Android peut être utilisé sur un projet multi-module de manière transparente, voici comment je vais découper mes projets :
Le socle contient :
Une application contenant le code et les ressources Android communes à toutes mes applications Android
Chaque application contient :
Un projet pour le code Java réutilisé côté serveur. Cela permet de partager du code entre une application Android et une application Web.
Une application web de type WAR contenant la partie serveur de l’application. C’est cette partie qui fournit les services distants à l’application Android.
L’application Android proprement dite est un projet Maven de type APK qui possède une dépendance sur le modèle et une dépendance sur le socle. C’est son pom qui configure le plugin Maven Android. Notez le type particulier de la dépendance vers le socle : apksources, les sources et ressources incluses dans cette dépendance sont poussées dans l’application courante avant sa construction.
Notez cependant que ce plugin Maven Android est toujours en cours de développement, j’ai rencontré de nombreux bugs. Le dernier en date, et pas des moindres : la fonctionnalité ‘apksources’ ne fonctionnait plus. Utilisez ce genre de fonctionnalité que si vous n’avez pas peur de mettre les mains dans les sources du plugin en cas de problème. Tout cela sent encore la peinture fraîche, reste à savoir si elle va tenir.
La solution Maven ne vous a pas séduit ? Il est vrai qu’elle reste lourde et relativement compliquée, mais il existe bon nombre d’alternatives Ant, AndroidAnt, Eclipse Linked Source, ln -s …
Passionné par les technologies Java/JEE depuis sa sortie de l'EPITA, Erwan Alliaume est aujourd'hui consultant chez Xebia. Il intervient depuis 2 ans sur des missions de développement et d'architecture pour l’un des leaders mondiaux de la production et de la distribution de contenus multimédia. Expert technique polyvalent, Erwan a été amené très tôt à prendre des responsabilités sur des projets de taille significative. Il a notamment développé des compétences clé dans la mise en place de socle de développement, la métrologie et les audits de performance et de qualité.
Erwan participe également activement au blog Xebia ou il traite aussi bien de sujets d’actualités que de problématiques techniques.
Thanks for writing this up. A lot is already documented in the android chapter of the book Maven: The Complete Reference I wrote. It is available for free here. http://bit.ly/94A9um
Also if you have an problems with the plugin or the documentation please make sure to file issues on google code as well as potentially help out by bug triaging and testing, adding documentation to the wiki as well as potentially providing patches.
manfred
Published by Mario ,
Il y a 13 ans
Bonjour,
Merci pour ce tutoriel mais je n’arrive à faire marcher mon projet.
J’ai essayer de suivre votre procédure mais j’ai des erreurs.
Est-il possible que vous puissiez mettre vos sources ici?
Utilisez-vous Eclipse pour vos projets Android?
Être un Sapient, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.
Published by Manfred Moser , Il y a 13 ans
Thanks for writing this up. A lot is already documented in the android chapter of the book Maven: The Complete Reference I wrote. It is available for free here. http://bit.ly/94A9um
Also if you have an problems with the plugin or the documentation please make sure to file issues on google code as well as potentially help out by bug triaging and testing, adding documentation to the wiki as well as potentially providing patches.
manfred
Published by Mario , Il y a 13 ans
Bonjour,
Merci pour ce tutoriel mais je n’arrive à faire marcher mon projet.
J’ai essayer de suivre votre procédure mais j’ai des erreurs.
Est-il possible que vous puissiez mettre vos sources ici?
Utilisez-vous Eclipse pour vos projets Android?
Cordialement,
Mario
Published by H3 , Il y a 10 ans
Exactement ce que je recherchais. Merci beaucoup !
Published by Christophe , Il y a 9 ans
Merci pour la partie apksources qui m’a permis de faire capitaliser les resources entre projets via mes libs.
A noter: il faut utiliser apklib dans la librairie et ensuite déclarer la dépendance de apklib car « apksources » est désormais deprecated.
Ce serait utile pour les autres de mettre à jour l’article dans ce sens.
@+
Christophe
Published by Christophe , Il y a 9 ans
Les tags xml se sont faits supprimés :
Dans la lib :
packaging : apklib
Dans l’application, référencer la lib via :
type: apklib