viernes, 5 de julio de 2013

Maven y Android

Actualización: He creado un proyecto en github (android-maven-blank): Es un proyecto plantilla con lo mínimo para que funcione con las dependencias explicadas en esta entrada.

Si te gusta tener todos tus proyectos gestionados con Maven, los proyectos de Android no iban a ser menos, pero la verdad es que Google no nos lo pone nada fácil.

A continuación voy a poner los pasos que he seguido para tener un proyecto de Android con las siguientes dependencias:

Y por supuesto, tener automatizado el proceso de generar el apk final que se subiría al play store.

Vamos a ponernos manos a la obra.

Pasos Previos

Las dependencias más complicadas de incluir van a ser precisamente las de Google, ya que no tiene un repositorio donde mantenga estos proyectos vía Maven. Por ello, lo primero que hay que hacer es descargarnos TODOS los extras del SDK Manager e instalarlos como módulos en nuestro repositorio local.



Después nos descargamos el proyecto maven-android-sdk-deployer, que se encargará de instalar todo en nuestro repositorio local. Una vez descargado nos ponemos en el directorio raíz y ejecutamos:
mvn install -P 2.2
(En mi caso pongo 2.2, porque es un SDK que tengo descargado).

Paso previo sólo si se va a utilizar Google Maps

Por lo que he visto, el proyecto maven-android-sdk-deployer despliega el módulo google-play-services, pero no lo instala correctamente porque no incluye el jar google-play-services_lib\libs\google-play-services.jar. Esto es así porque recientemente el SDK Manager ha cambiado la forma en la que distribuye este módulo. Seguro que dentro de poco el proyecto maven-android-sdk-deployer se modificará para que este paso previo no sea necesario.

Lo que he hecho para solucionarlo es instalar este jar manualmente como un módulo jar de maven:
mvn org.apache.maven.plugins:maven-install-plugin:2.4:install-file \
  -DgroupId=com.google.android.gms \
  -DartifactId=google-play-services-jar \
  -Dversion=7 \
  -Dpackaging=jar \
  -Dfile=libs/google-play-services.jar \
  -Djavadoc=google-play-services-jar-7-javadoc.jar

Paso previo sólo si se va a utilizar Google Analytics 

En caso de que vayamos a utilizar Google Analytics, tendremos que descargarnos el jar de la siguiente dirección:


y después instalar en el repositorio local el jar con la librería:
mvn org.apache.maven.plugins:maven-install-plugin:2.4:install-file
-DgroupId=com.google.android.analytics
-DartifactId=libGoogleAnalytics
-Dversion=2.0beta5
-Dpackaging=jar
-Dfile=libGoogleAnalytics.jar 

POM.XML

Copio el pom.xml que me ha quedado y lo voy comentando:


 4.0.0
 NUESTRO_GROUPID
 NUESTRO ARTIFACTID
 1.0.0-SNAPSHOT
 apk
 NUESTRO NOMBRE

 
  
   jakewharton
   http://r.jakewharton.com/maven/release/
  

  
   The mavenized Facebook Android API
   http://avianey.github.io/facebook-api-android-maven/
  

 

 

  
   com.google.android
   android
   4.0.1.2
   provided
  
  
  
   com.google.android.annotations
   annotations
   22.0.1
   provided
  
  
  

  
   com.actionbarsherlock
   actionbarsherlock
   4.3.1
   apklib
   
    
     com.google.android
     support-v4
    
   
  


  

        
            com.google.android.gms
            google-play-services
            7
            apklib
        

        
            com.google.android.gms
            google-play-services-jar
            7
        


  
  
  
   android.support
   compatibility-v13
   13
  

  
  
  
  
   com.google.android.analytics
   libGoogleAnalytics
   2.0beta5
  

  
  
  
  
   org.roboguice
   roboguice
   2.0
  

  
  
  
   com.github.avianey
   facebook-android-api
   3.0.1
   apklib
   
    
     com.google.android
     support-v4
    
   
  


  
        
            com.pivotallabs
            robolectric
            0.9.8
            test
        


        
            junit
            junit
            4.8.2
            test
        


 

 
  ${project.artifactId}
  src
        tests
  
   
    org.apache.maven.plugins
    maven-source-plugin
    2.1.2
    
     
      attach-sources
      verify
      
       jar-no-fork
      
     
    
   
   
    maven-compiler-plugin
    2.3.2
    
     1.6
     1.6
    
   
   
    com.jayway.maven.plugins.android.generation2
    android-maven-plugin
    3.6.0
    
     
      PATH_SDK
      15
     
     
      NOMBRE_EMULADOR
     
     true
                    false
    
    true
   
  

 

 
  
   sign
   
    
     
      org.apache.maven.plugins
      maven-jarsigner-plugin
      1.2
      
       
        signing
        
         sign
                                    verify
        
        package
        true
        
                                    true
         
         
          target/*.apk
         
         RUTA_KEYSTORE
         STOREPASS
         KEYPASS
         ALIAS
         
          -sigalg
          MD5withRSA
          -digestalg
          SHA1
         
        
       
      
     
     
      com.jayway.maven.plugins.android.generation2
      android-maven-plugin
      true
      
       
        false
       
                            
                                true
                                ${project.build.directory}/${project.artifactId}.apk
                                ${project.build.directory}/${project.artifactId}-signed-aligned.apk
                            
      
                        
                            
                                alignApk
                                package
                                
                                    zipalign
                                
                            
                        
     
    
   
  
 





Por supuesto que donde he puesto (PATH_SDK, NOMBRE_EMULADOR, RUTA_KEYSTORE, STOREPASS, KEYPASS, ALIAS) tendréis que poner vuestros valores.

Generar APK final para el Play Store

Una vez tenemos el pom.xml bien configurado, para generar el apk final tendremos que ejecutar:
mvn clean package -P sign
y dentro del directorio target nos generará dos apk: ${project.artifactId}.apk y ${project.artifactId}-signed-aligned.apk. El que termina en signed-aligned.apk es el que tendremos que utilizar para subir al Play Store, ya que es necesario que se le haya hecho un zip-align.