Product Flavors de Gradle en Android Studio

jueves, 18 de diciembre de 2014


Con la llegada de Android Studio como IDE para desarrollar aplicaciones Android, se ha sustituido el sistema de compilación Ant que se utiliza en Eclipse por Gradle. Android Studio utiliza un plugin de Gradle para la compilación de aplicaciones Android. Gradle se basa en Groovy, en lugar de xml, para para los ficheros de configuración. Gradle aporta un mecanismo muy fexible permitiendo personalizar el proceso de compilación.

Mediante configuración de Gradle en Android Studio tenemos la posibilidad de utilizar product flavors, que nos van a permitir crear diferentes versiones de una misma aplicación Android de una forma muy sencilla. Por ejemplo mediante esta característica podemos tener versión gratuita y de pago con funcionalidad añadida en la versión de pago o tambien diferentes entornos como entorno de desarrollo y entorno de producción, este último ejemplo es el que vamos a ver en este artículo.

Introdución a Product Flavors de Gradle

Un product flavor define una característica personalizada de una aplicación. Una aplicación puede tener varios flavors y entre las carácteristicas que se pueden personalizar con el uso de flavors son las siguientes:
  • minSdkVersion
  • targetSdkVersion
  • versionCode
  • nombre del paquete (sobresscribe el valor del manifiesto)
  • Firma de apk en modo release
  • configuracion de compilación
  • nombre de paquete para la aplicación de test
  • InstrumentationTestRunner
  • Recursos como layouts, estilos, strings, menus
  • Y lo que me parece más impactante, se puede personalizar el código fuente, es decir, pueden existir funcionalidades diferentes

Ejemplo

El ejemplo que vamos a ver es como podemos utilizar flavors para tener diferentes entornos de desarrollo. Por ejemplo esto puede ser útil cuando atacamos a una API Rest y en desarrollo y producción son urls diferentes.

Vamos a crear un proyecto con Android Studio y vamos a tener un layout con un TextView, donde vamos a mostrar la url diferente para cada entorno.

Definiendo flavors en Android Studio

Para definir los flavors podemos hacerlo de dos formas:

Una desde el fichero build.gradle del modulo app, añadiendo los flavors a la configuración de android:

android {

    //Código previo 

    //Definición de flavors 
    productFlavors {
        development{
        }
        production {
        }
    }
}


Ahora tenemos que sincronizar el proyecto con los ficheros de gradle, nos lo sugerirá Android Studio en cuanto cambiemos el fichero. El menu para hacerlo es Tools/Android/Sync Project With Gradle Files.

También podemos definir los flavors desde la pantalla Project Structure que podemos abrirla desde el menu File/Project Structure.

Android Studio project structure

Creando personalizaciones para cada flavor

Para crear la personalización de cada flavor tenemos que crear una carpeta por cada flavor al mismo nivel que la carpeta Main. Y luego debe seguir la misma estructura que la carpeta main, es decir, una carpeta java para los ficheros java, una para los recursos y dentro de esta una de values para los strings por ejemplo. En nuestro caso vamos a tener un string personalizado por cada flavor que va a representar la teórica url del servicio rest.



La definición del string se realiza en el xml de cada flavor:

Para el string dentro de development:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="ApiRestUrl">http://dev.example.com/api/</string>
</resources>
Y para el string dentro de production:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="ApiRestUrl">http://example.com/api/</string>
</resources>

Creando el activity y el layout

Creamos el layout y el activity de forma normal como si no hubiera flavors, dando valor al TextView desde el propio layout o desde el activity según tus necesidades, yo lo voy a hacer desde el layout. Y según el flavor con el que ejecutemos cogera el valor de un recurso o de otro.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/ApiRestUrl" android:layout_width="wrap_content"
        android:layout_height="wrap_content"  />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

Build Variants

Cuando ejecutamos desde Android Studio en dispositivo o en emulador podemos elegir el flavor con el que ejecutamos la aplicación. Para seleccionar el flavor en Android Studio existen Build Variants que es una pestaña que existe en la parte izquierda abajo. Donde van a aparecer todas las opciones que son una combinación de tipos de compilacion y flavors.

Android Studio build variants

Paquetes generados

Ahora ya podemos generar los paquetes de nuestro proyecto, podemos generarlos ejecutando la tarea build del panel de gradle de la parte derecha de Android Studio y entonces si vamos a la carpeta de nuestro modulo, y vamos a build/outputs, vemos que se han generado los paquetes:
  • app-development-debug.apk
  • app-development-debug-unaligned.apk
  • app-development-release-unsigned.apk
  • app-production-debug.apk
  • app-production-debug-unaligned.apk
  • app-production-release-unsigned.apk
Esto nos va a generar para compilación release de los flavors el apk sin firmar, para generarlos firmados tenemos que hacerlo desde el menu build/Generate Signed Apk.

Resultado

Si ejecutamos la app en modo development debug, seleccionando previamente esta opción desde el panel de build variant, nuestra aplicación se ve asi:



Si cambiamos el build variant a production debug se ve asi:

Resumen

En este artículo hemos visto que son los flavors de gradle y como podemos mediante Android Studio utilizarlos para crear versiones diferentes de una misma aplicación sin mucho esfuerzo.

Hemos visto un ejemplo sencillo de tener un valor diferente en cada flavor en un string que sera la url de la API Rest con la que conectar, pero lo importante es ver que con los flavors existen muchas posibilidades como tener diferentes imagenes, incluso código java diferente para cada flavor o diseños diferentes.

Libros relacionados

Android Studio Development Essentials

Android Studio - Getting Started

Gradle in Action

2 comentarios: