Android, A Complete Course, From Basics to Enterprise Edition

Maven et Android.

Android, A Complete Course, From Basics to Enterprise Edition. 1

Maven et Android. 1

1.1         Synthèse Android-Maven : le Pom Android ultime. 1

 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 :

http://android2ee.com.

La propriété intellectuelle du code appartient à :

Mathias Séguy

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

1.1       Synthèse Android-Maven : le Pom Android ultime

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.

1.1.1       Mise en place de la structure du projet

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.

1.1.1.1       En utilisant le projet générique Android téléchargeable

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.

 

1.1.1.2       En utilisant l’archétype Android-release

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.

1.1.2       Les fichiers Maven

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).

1.1.2.1       Le fichier setting.xml

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>

1.1.2.1.1        Remarques et point de blocage

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.

1.1.2.2       Le fichier Pom du projet parent

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>

1.1.2.3       Le fichier Pom du projet contenant l’application

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>

1.1.2.3.1        Spécification pour le profil android-release

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.

1.1.2.4       Le fichier Pom du projet de tests d’intégration

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>

1.1.3       Lancement des build

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.