Android,
A Complete Course, From
Basics to Enterprise Edition
Android, A Complete Course, From Basics to Enterprise
Edition
1.1 Synthèse Android-Maven : le Pom Android ultime
Cet
article est extraie du livre « Android, A Complete Course »,
disponible sur Android2ee.com.
Les
exemples ou les programmes présents dans cet ouvrage sont fournis pour
illustrer les descriptions théoriques. Ce code est libre de toute utilisation
mais n'est pas distribuable.
La
distribution du code est reservée au site :
La
propriété intellectuelle du code appartient à :
L’utilisation
de ces codes est sous votre unique responsabilité et personne d’autre que vous
ne pourra être tenu responsable des préjudices ou dommages de quelques natures
que ce soit pouvant résulter de son utilisation.
Tous
les noms de produits ou marques cités dans cet ouvrage sont des marques déposés
par leurs propriétaires respectifs.
Publié par http://android2ee.com
Titre Original : Android, A Complete Course, From
Basics to Enterprise Edition. Édition Française.
ISBN : 979-10-90388-00-0
Copyright © 2011 by Mathias Séguy
Aucune
représentation ou reproduction, même partielle, autre que celles prévues à
l’article L. 122-5 2° et 3° a) du code de la propriété intellectuelle ne peut
être faite sans l’autorisation expresse de Mathias Seguy ou, le cas échéant,
sans le respect des modalités prévues à l’article L. 122-10 dudit code
La conclusion de ce chapitre est donc la mise en place d’un projet générique qui soit mavenisé et le plus adapté à la construction d’application Android.
La structure du projet est tripartite : Le projet parent, le projet de l’application et le projet des tests d’intégration. Suite à une série de manipulations, il est possible de créer un seul projet (un seul dossier physique) qui soit vu par Eclipse comme trois projets distincts. Il y aura ainsi trois fichiers Pom distincts et bien sûr le fichier de setting.
Dans ces deux cas, il faut utiliser un projet souche et effectuer des modifications dessus. La mise en place d’un archétype serait le bienvenu.
Pour cela il faut récupérer le projet AndroidGenericProject, puis :
· Importer le projet au sein d’Eclipse (le projet parent) en utilisant « import an existing maven project ».
· Faire un « search and replace » de :
o « net.stinfoservices.android.tuto.maven » par le GroupId de votre projet
o « AndroidGenericProject » par l’artifactId de votre projet
· Supprimer puis réimporter le projet au sein du workspace Eclipse (le projet parent) en utilisant « import an existing maven project ».
· Copier le contenu du fichier setting.xml (à la racine du projet parent) avec votre fichier setting.xml.
· Modifier les valeurs de versions dans le Pom du projet parent (si besoin) et mettre à jour les valeurs des chemins dans le fichier setting.xml.
· Modifier dans votre manifeste la version minimale du SDK que vous souhaitez utiliser : <uses-sdk android:minSdkVersion="3" />
· Effectuer un clean (RunAs->maven Clean)
· Votre projet est opérationnel, mavenisé et prêt pour l’intégration continue.
Pour cela, il faut commencer par générer un projet avec l’archétype Android-Release. Dans votre shell, taper la commande :
mvn
archetype:generate
-DarchetypeArtifactId=android-release
-DarchetypeGroupId=de.akquinet.android.archetypes -DarchetypeVersion=1.0.4 -DgroupId=your.company -DartifactId=my-android-application
Ensuite, il faut effectuer les manipulations suivantes :
· Importer le projet au sein d’Eclipse (le projet parent) en utilisant « import an existing maven project ».
· Ajouter –ap à l’artifactId du projet de l’application (dans son Pom ainsi que dans celui du projet des tests d’intégration).
· Lancer la tache eclipse:eclipse sur le projet de l’application.
· Supprimer le projet du workspace Eclipse (sans le supprimer du disque).
· Réimporter le projet(le projet parent).
· Copier-coller les fichiers Pom et setting fournis par le projet générique Android (ou ceux décris ci-dessous), en ne copiant que les blocs properties, modules, dependencies, dependencyManagement, build et profiles (bref, vous laissez l’en-tête à vos fichiers). Attention : pour le fichier Pom du projet de tests, il faut que vous gardiez intactes vos dépendances vers votre projet d’application.
· Copier le contenu du fichier setting.xml dans votre fichier setting.xml.
· Modifier les valeurs de versions dans le Pom du projet parent (si besoin) et mettre à jour les valeurs des chemins dans le fichier setting.xml.
·
Ajouter dans votre manifeste la
version minimale du SDK que vous souhaitez utiliser : <uses-sdk android:minSdkVersion="3"
/>
· Votre projet est opérationnel, mavenisé et prêt pour l’intégration continue.
Ce chapitre présente les différents fichiers de configurations à mettre en place au niveau du poste de travail et des différents projets (parent, application et tests d’intégration).
Le fichier setting déclare trois types de profils principaux :
· Le profil android-project qui a pour but de déclarer les variables communes à tous les projets Android (chemin du SDK Android et des SDK java, versions des plugins jayway, proguard, jarsigner).
· Les profils de type émulateur qui ont pour but de spécifier l’ensemble des émulateurs disponibles de votre environnement de travail.
· Le profil android-release dont l’objectif est de déclarer les variables de votre KeyStore de production (chemin du KeyStore, mot de passe, nom de la clef, mot de passe de la clef)
Enfin, ce fichier déclare les profils android-project et votre émulateur préférentiel comme étant des profils actifs par défaut, de manière à rendre les variables visibles quel que soit le projet.
De plus, comme pour tous les projets Android, il faut déclarer au sein du bloc « plugin group », le plugin jayway qui permet de faire du développement Android en utilisant Maven.
Ce qui donne :
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
<pluginGroup>
com.jayway.maven.plugins.android.generation2
</pluginGroup>
</pluginGroups>
<!--
********************************************************** -->
<!--The
definition of all the properties to set for android projects-->
<!-- ********************************************************** -->
<activeProfiles>
<activeProfile>android-project</activeProfile>
<activeProfile>AVD-Google10</activeProfile>
</activeProfiles>
<profiles>
<!--The
profile that must be active for all Android project-->
<profile>
<id>android-project</id>
<properties>
<!-- RT and
JSSE jar path-->
<!--
******************* -->
<!-- For
linux/Unix-->
<!--
<rt.jar.path>${java.home}/jre/lib/rt.jar</rt.jar.path>-->
<!-- <jsse.jar.path>${java.home}/jre/lib/jsse.jar</jsse.jar.path>-->
<!-- For
Mac-->
<!--
<rt.jar.path>${java.home}/../Classes/classes.jar</rt.jar.path>-->
<!--
<jsse.jar.path>${java.home}/../Classes/jsse.jar</jsse.jar.path>-->
<!-- For
Windows-->
<rt.jar.path>${java.home}/lib/rt.jar</rt.jar.path>
<jsse.jar.path>${java.home}/lib/jsse.jar</jsse.jar.path>
<!--The path
to the Android SDK-->
<!--
******************* -->
<android.sdk.path>C:\Program Files
(x86)\Android\android-sdk-
windows</android.sdk.path>
<!--version
of the plugin defined in the setting file (here so)-->
<!--
******************************************** -->
<jayway.plugin.version>2.8.3</jayway.plugin.version>
<proguard.plugin.version>2.0.4</proguard.plugin.version>
<proguard.version>4.4</proguard.version>
<jarsigner.plugin.version>1.2</jarsigner.plugin.version>
<build.helper.plugin.version>1.5</build.helper.plugin.version>
</properties>
</profile>
<!-- ********************************************************** -->
<!--The
definition of all the avaiable AVD : ensure one is active by default -->
<!--
********************************************************** -->
<profile>
<id>AVD-Google10</id>
<activation>
<!--Just set
the variable release to true-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--The path
to the Android SDK-->
<avd-name>Google10</avd-name>
</properties>
</profile>
<profile>
<id>AVD-Google9</id>
<properties>
<!--The path
to the Android SDK-->
<avd-name>Google9</avd-name>
</properties>
</profile>
<!--
********************************************************** -->
<!--The
definition of all the properties for the release mode's profil -->
<!--
********************************************************** -->
<!--The
profile to use for the release android mode-->
<profile>
<id>android-release</id>
<activation>
<!--Just set
the variable release to true-->
<property>
<name>android-release</name>
<value>true</value>
</property>
</activation>
<!--Needed
properties to sign the application using the good key-->
<properties>
<sign.keystore>Path_To_Keystore</sign.keystore>
<sign.alias>Key_Name</sign.alias>
<sign.storepass>Keystore_PassWord</sign.storepass>
<sign.keypass> Key_PassWord </sign.keypass>
</properties>
</profile>
</profiles>
</settings>
Vous devez au sein de ce fichier modifier le nom des AVD ainsi que leur id de manière à ce qu’ils soient en cohérence avec votre espace de développement. La balise avd-name est le nom de l’un de vos AVD. En d’autres termes, vous avez créé des AVD, en leur donnant un nom et c’est ce nom que vous mettez dans la balise avd-name. La balise id est libre mais sera utilisée par les différents Pom de vos projets. Elle sert d’identifiant de l’AVD pour Maven.
Vous devez au sein de ce fichier modifier les valeurs associées à votre KeyStore de production et remplacer Path_To_Keystore, Key_Name, KeyStore_PassWord et Key_PassWord par leurs valeurs.
Si lors du lancement du goal mvn install –P android-release, le plugin proguard lève une exception du type :
[proguard] java.io.IOException: Can't read
[proguard.ClassPathEntry@***] (No such file or directory)
Cela signifie que les chemins vers les jars rt et jsse sont mal positionnés, il vous faut modifier les variables rt.jar.path et jsse.jar.path du fichier setting.
Au niveau du projet, le Pom parent définit les éléments suivants :
· Les coordonnées Maven du projet, (GroupId, Version, ArtifactId)
· Les méta-data du projet qui permettent de spécifier les développeurs, l’organisation et l’année de développement. Ces informations sont essentielles et seront dans votre application quand elle ira en production.
· Les propriétés spécifiques du projet : la version du JDK, l’encodage, la version d’Android et la version des plugins JUnit.
· Les sous-modules du projet.
· Les dépendances héritées vers les jar Android et android-test (et optionnellement vers GoogleMap).
· La spécification du comportement du plugin jayway (plugin Android de compilation), du plugin maven-compiler-plugin (plugin Java de compilation), du plugin maven-release-plugin (plugin utilisé pour effectuer les releases), du plugin jar-signer (plugin permettant de signer une application) et du plugin proguard (plugin qui optimise, réduit et protège le code du projet généré en l’obscurcissant).
· La spécification du profil android-release, au moyen du plugin enforce, qui permet de vérifier la présence des variables associées au KeyStore.
Ce qui donne un fichier Pom de 270 lignes :
<?xml version="1.0"
encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.stinfoservices.android.tuto.maven</groupId>
<artifactId>AndroidGenericProject-parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>AndroidGenericProject
- Parent</name>
<!-- *********************** -->
<!-- Meta data of the project -->
<!-- *********************** -->
<inceptionYear>2011</inceptionYear>
<developers>
<developer>
<id>MSE</id>
<name>Seguy Mathias</name>
<email>mathias.seguy@stinfoservices.net</email>
<roles>
<role>developper</role>
</roles>
</developer>
</developers>
<organization>
<name>STI Informatiques Services</name>
<url>http://stinfoservices.net/</url>
</organization>
<!-- ************************* -->
<!-- Properties of the project -->
<!-- ************************* -->
<properties>
<!-- La variable STI
-->
<sti>STI</sti>
<!-- L'encoding du projet
-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- JUnit version -->
<junit.version>3.8.2</junit.version>
<!-- JDK version -->
<jdk.version>1.6</jdk.version>
<java.source.version>1.6</java.source.version>
<java.target.version>1.6</java.target.version>
<!-- Android SDK version
-->
<android.sdk.version>10</android.sdk.version>
<!-- Android jar
dependency-->
<google.com.android.version>2.3.1</google.com.android.version>
</properties>
<!--
********************************************************-->
<!--The following Properties have to
be set set in the setting.xml files-->
<!--*********************************************************-->
<!--<properties>-->
<!--The path to the Android SDK-->
<!--<android.sdk.path>D:\android-sdk_r08-windows\android-sdk-windows</android.sdk.path>-->
<!--version of the plugin defined in
the setting file (here so)-->
<!--<jayway.plugin.version>2.8.3</jayway.plugin.version>-->
<!--<proguard.plugin.version>2.0.4</proguard.plugin.version>-->
<!--<sf.proguard.version>4.4</sf.proguard.version>-->
<!--<jarsigner.plugin.version>1.2</jarsigner.plugin.version>-->
<!--<build.helper.plugin.version>1.5</build.helper.plugin.version>-->
<!--</properties>-->
<!--
********************************************************-->
<!--The list of AVD has to be done in
the setting.xml file-->
<!--*********************************************************-->
<modules>
<module>application</module>
<module>application-it</module>
</modules>
<!--Dependencies inherited -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>${google.com.android.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android-test</artifactId>
<version>${google.com.android.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!--Plugins
(those that add task in the maven's process life) inherited-->
<pluginManagement>
<plugins>
<!-- Plugin de la
compilation Android du projet -->
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>maven-android-plugin</artifactId>
<version>${jayway.plugin.version}</version>
<inherited>true</inherited>
<configuration>
<androidManifestFile>${project.basedir}/AndroidManifest.xml
</androidManifestFile>
<assetsDirectory>${project.basedir}/assets</assetsDirectory>
<resourceDirectory>${project.basedir}/res</resourceDirectory>
<nativeLibrariesDirectory>${project.basedir}/src/main/native
</nativeLibrariesDirectory>
<sdk>
<platform>${android.sdk.version}</platform>
</sdk>
<deleteConflictingFiles>true</deleteConflictingFiles>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
</configuration>
</plugin>
<!-- Plugin de la
compilation Java du projet -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<inherited>true</inherited>
<configuration>
<source>${java.source.version}</source>
<target>${java.target.version}</target>
</configuration>
</plugin>
<!--Plugin utiliser pour
effectuer une release d'un projet -->
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.1</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
<!-- Plugin pour la
signature Android du projet -->
<plugin>
<artifactId>maven-jarsigner-plugin</artifactId>
<version>${jarsigner.plugin.version}</version>
<inherited>true</inherited>
<configuration>
<removeExistingSignatures>true</removeExistingSignatures>
<archiveDirectory />
<archive>${project.build.directory}/${project.build.finalName}.${project.packaging}</archive>
<verbose>true</verbose>
<certs>true</certs>
<keystore>${sign.keystore}</keystore>
<alias>${sign.alias}</alias>
<storepass>${sign.storepass}</storepass>
<keypass>${sign.keypass}</keypass>
</configuration>
</plugin>
<!-- Plugin de l'optimisation
du projet généré-->
<plugin>
<groupId>com.pyx4me</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>${proguard.plugin.version}</version>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard</artifactId>
<version>${proguard.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<configuration>
<proguardVersion>${proguard.version}</proguardVersion>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>android-release</id>
<activation>
<property>
<name>android-release</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-signing-properties</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireProperty>
<property>sign.keystore</property>
<message>The 'sign.keystore' property is missing. It must contain
the path to the keystore used to sign the application.</message>
</requireProperty>
<requireFilesExist>
<files>
<file>${sign.keystore}</file>
</files>
<message>The 'sign.keystore' property does not point to a file.
It must contain the path to the keystore used to sign the application.</message>
</requireFilesExist>
<requireProperty>
<property>sign.alias</property>
<message>The 'sign.alias' property is missing. It must contain
the key alias used to sign the application. </message>
</requireProperty>
<requireProperty>
<property>sign.storepass</property>
<message>The 'sign.storepass' property is missing. It must contain
the password of the keystore used to sign the application.
</message>
</requireProperty>
<requireProperty>
<property>sign.keypass</property>
<message>The 'sign.keypass' property is missing. It must contain
the password of the key used to sign the application.</message>
</requireProperty>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
Le fichier Pom du projet applicatif spécifie les éléments suivants :
· Son projet parent
· Son ArtifactId, son packaging et son nom
· Sa dépendance vers le jar Android (et GoogleMap en option)
· La spécification du comportement du plugin maven-android-plugin pour lui demander de charger les extensions Maven (tel que packaging et les Handlers de type).
· La spécification du profil android-release qui redéfinit les plugins proguard, jarsigner, jayway et build-helper-maven de manière à effectuer une compilation en mode release.
Ce fichier Pom possède 170 lignes :
<?xml version="1.0"
encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.stinfoservices.android.tuto.maven</groupId>
<artifactId>AndroidGenericProject-parent</artifactId>
<version>1.0</version>
</parent>
<artifactId>AndroidGenericProject-ap</artifactId>
<packaging>apk</packaging>
<name>AndroidGenericProject
- Application</name>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>maven-android-plugin</artifactId>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>android-release</id>
<build>
<plugins>
<plugin>
<groupId>com.pyx4me</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<executions>
<execution>
<id>process-classes-with-proguard</id>
<phase>process-classes</phase>
<goals>
<goal>proguard</goal>
</goals>
<configuration>
<proguardVersion>${proguard.version}</proguardVersion>
<maxMemory>256m</maxMemory>
<injar>android-classes</injar>
<libs>
<lib>${rt.jar.path}</lib>
<lib>${jsse.jar.path}</lib>
</libs>
<obfuscate>true</obfuscate>
<addMavenDescriptor>false</addMavenDescriptor>
<proguardInclude>${project.basedir}/proguard.conf</proguardInclude>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jarsigner-plugin</artifactId>
<executions>
<execution>
<id>sign-application-apk</id>
<phase>package</phase>
<goals>
<goal>sign</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>maven-android-plugin</artifactId>
<executions>
<execution>
<id>zipalign-application-apk</id>
<phase>package</phase>
<goals>
<goal>zipalign</goal>
</goals>
</execution>
</executions>
<configuration>
<zipalign>
<verbose>true</verbose>
<inputApk>${project.build.directory}/${project.artifactId}-${project.version}.apk</inputApk>
<outputApk>${project.build.directory}/${project.artifactId}-${project.version}-signed-aligned.apk</outputApk>
</zipalign>
<sign>
<debug>false</debug>
</sign>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>${build.helper.plugin.version}</version>
<configuration>
<artifacts>
<artifact>
<file>${project.build.directory}/proguard_map.txt</file>
<type>map</type>
<classifier>release</classifier>
</artifact>
</artifacts>
</configuration>
<executions>
<execution>
<id>attach-signed-aligned</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>initialize</id>
<phase>install</phase>
<configuration>
<tasks>
<echo>Properties values
Of ${project.name}</echo>
<echo>sti : ${sti}</echo>
<echo>project.build.sourceEncoding
:
${project.build.sourceEncoding}</echo>
<echo>junit.version :
${junit.version}</echo>
<echo>jdk.version :
${jdk.version}</echo>
<echo>java.source.version
: ${java.source.version}</echo>
<echo>java.target.version
: ${java.target.version}</echo>
<echo>android.sdk.version
: ${android.sdk.version}</echo>
<echo>google.com.android.version :
${google.com.android.version}</echo>
<echo>android.sdk.path :
${android.sdk.path}</echo>
<echo>jayway.plugin.version :
${jayway.plugin.version}</echo>
<echo>proguard.plugin.version :
${proguard.plugin.version}</echo>
<echo>proguard.version :
${proguard.version}</echo>
<echo>jarsigner.plugin.version
:
${jarsigner.plugin.version}</echo>
<echo>build.helper.plugin.version
:
${build.helper.plugin.version}</echo>
<echo>avd-name :
${avd-name}</echo>
<echo> Profile variables</echo>
<echo>android-release :
${android-release}</echo>
<echo>android-project :
${android-project}</echo>
<echo>with-emulator :
${with-emulator}</echo>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
Ce paragraphe expose les spécifications effectuées sur les plugins au sein du profil android-release.
Le plugin maven-android-plugin est spécifié pour effectuer la tache zip-align sur le projet généré et construire le projet monProjet-signed-aligned.apk lors de la phase de packaging.
Le plugin proguard-maven-plugin est spécifié pour exécuter la tache proguard lors de la phase process-class avec l’obscurcissement du code (obfuscate).
Le plugin maven-jarsigner-plugin est spécifié pour exécuter les taches sign et verify lors de la phase package.
Enfin, le plugin build-helper-maven-plugin est spécifié pour ajouter le fichier proguard_map à l’application lors de la phase package.
Le fichier Pom du projet applicatif spécifie les éléments suivants :
· Son projet parent
· Son ArtifactId, son packaging et son nom
· Ses dépendances vers le jar Android, le jar android-test, le jar de l’application à tester et l’apk de cette application
· La spécification du comportement du plugin maven-android-plugin pour lui demander de charger les extensions Maven (tel que packaging et les Handlers de type).
· La spécification du profil android-release qui redéfinit les plugins jarsigner, jayway de manière à effectuer une compilation en mode release simple : signée et en mode non debug.
Ce fichier Pom possède 90 lignes :
<?xml version="1.0"
encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.stinfoservices.android.tuto.maven</groupId>
<artifactId>AndroidGenericProject-parent</artifactId>
<version>1.0</version>
</parent>
<artifactId>AndroidGenericProject-it</artifactId>
<packaging>apk</packaging>
<name>AndroidGenericProject
- Integration tests</name>
<properties>
<!--
When not running a release, we are deploying the plain artifact (so no
classifier)
This is overridden during the release.
-->
<zipaligned-classifier></zipaligned-classifier>
</properties>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android-test</artifactId>
</dependency>
<dependency>
<groupId>net.stinfoservices.android.tuto.maven</groupId>
<artifactId>AndroidGenericProject-ap</artifactId>
<type>apk</type>
<version>1.0</version>
<classifier>${zipaligned-classifier}</classifier> <!-- classifier set according to the ran profile -->
</dependency>
<dependency>
<groupId>net.stinfoservices.android.tuto.maven</groupId>
<artifactId>AndroidGenericProject-ap</artifactId>
<type>jar</type>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>maven-android-plugin</artifactId>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>android-release</id>
<properties>
<!--
When running a release, we must deployed the final artifact (signed and
zipaligned).
-->
<zipaligned-classifier>aligned</zipaligned-classifier>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-jarsigner-plugin</artifactId>
<executions>
<execution>
<id>sign-application-it-apk</id>
<phase>package</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>maven-android-plugin</artifactId>
<configuration>
<sign>
<debug>false</debug>
</sign>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
Pour lancer un build normal, mvn:install suffit, pour lancer un build en mode release il faut lancer mvn:install –P android-release.
Un problème majeur rencontré lors de la mise en place de ces différents Pom est l’impossibilité d’activer un profil d’un parent dans un Pom fils. De ce fait, il a fallu déclarer le profil android-project (et l’émulateur préférentiel) comme étant un profil actif par défaut.