Android Flavors

4
15377

Android Flavors

0. Índice de contenidos.

1. Introducción

Con el desarrollo de Android Studio ha venido un cambio a nivel interno que ha añadido más flexibilidad al desarrollo de aplicaciones para Android. Este cambio ha sido el remplazo de Ant por Gradle.
Al realizar el cambio, la gente de Android ha tenido (y están) que desarrollar un plugin para Gradle para que a partir del código fuente que realicemos, se puedan construir aplicaciones para Android.
Y con esto, una de las funcionalidades de las que han dotado al plugin de Gradle es el uso de Flavors (sabores).

¿Y para que sirve esto? Seguro que habéis visto en más de una ocasión cuando habéis querido instalar alguna app desde Google Play (o cualquier otro sitio) que hay una versión «lite» y una «pro», o una versión con plublicidad y otra con pagos «in app».
Eso, en la mayoría de las ocasiones implicaba tener dos proyectos, extraer el máximo código posible a librerías para compartirlas, en otras ocasiones implicaba crear tareas de ant o perfiles de maven para realizar ese trabajo. Gracias a esta funcionalidad, se simplifica mucho nuestro trabajo.

En este tutorial vamos a ver como podemos hacer uso de esta funcionalidad, fácil fácil 😛

2. Entorno

  • Hardware
    • Mackbook Pro
      • Intel Core i7 2Ghz
      • 8GB RAM
      • 250GB SSD
      • Sistema Operativo: Mac OS X (10.9)
  • Software
    • Android Studio 0.5.4
    • Gradle 1.10

3. Manos a la obra.

Nuestro objetivo va a ser crear una aplicación muy simple que haga uso de los flavors. La aplicación consistirá de una imagen y un texto que serán distintos dependiendo del flavor que construyamos.

El primer paso es crear una aplicación con Android Studio, basta con que dejéis los valores por defecto.

Una vez que tenemos el proyecto creado, vamos a añadir los dos sabores o flavors.

Botón derecho encima del módulo de la aplicación y clickamos en «Open Module Settings».

A continuación vamos a Flavors

y por último añadimos los dos flavors que vamos a usar: autentia y adictosaltrabajo

Aceptamos y tendremos preparado el proyecto para usar los dos flavors. Un vistazo a build.gradle nos lo confirma

//Continua  
}  
    productFlavors {  
        autentia {  
        }  
        adictosaltrabajo {  
    }  
}  
//Continua 

El siguiente paso es crear las carpetas en donde alojaremos el código dependendiente de cada flavor. Las carpetas se han de colocar bajo la carpeta src y deben tener el mismo nombre que hemos usado al crear los flavors. El código común se seguirá ubicando bajo main

Cuando construyamos la aplicación, el plugin de Android escogerá los fuentes de la carpeta del flavor que esté construyendo y los mezclará con el directorio main dando lugar a la aplicación resultante.

3.1 Recursos

Como hemos dicho al principio, vamos a crear una aplicación que muestre una imagen dependiendo del flavor. Para ello vamos a usar un layout común a los dos flavors que contendrá un ImageView en el que mostraremos la imagen.

Modificamos el layout activity_main para cambiar el texto por una imagen. Fijaos que estoy tocando el layout que cuelga de main (y no en los flavors).

  
  
      
 

Lo que vamos a hacer a continuación es añadir los correspondientes logos a los dos flavors que hemos creado.

Aunque estemos usando otro directorio para dejar los fuentes de la aplicación, tenemos que usar la misma estructura que si estamos usando main.
Fijaros en el detalle de la carpeta res en la que Android Studio ya me la marca con un icono de recursos. Es posible que Android Studio os marque en rojo indicando que no existe el logo, ignorarlo, es un bug.

En mi caso ha quedado así:

Si os fijáis, AS me ha marcado sólo una de las dos carpetas res como recursos. Eso es porque tengo seleccionado en Android Studio ese flavor

Y si la siguiente pregunta es: ¿y como cambio de flavor?. Si buscáis por el borde de AS encontraréis un botón que pone Build Variants en donde podemos establecer el activo. Build Variants es un concepto que se compone de Build Types y Flavors, pero en este tutorial solo abarcaremos flavors,

y en mi caso tengo activado la variante debug del flavor adictosaltrabajo

Aquí podemos hacer dos cosas: Darle al botón de play y ejecutar en el emulador (o en un dispositivo) la versión del flavor que tenemos seleccionado o también podemos ejecutar gradlew build y generar un apk por cada flavor.

3.2 Código

No solo podemos configurar recursos, también podemos tener código dependiente de cada flavor. Vamos a crear una clase que nos va a devolver un texto diferente dependiendo del flavor.

La implementación para el flavor adictosaltrabajo es:

package com.adictosaltrabajo.tutoriales.android.flavors;  
  
public class PhraseGenerator {  
  
    public static String get() {  
        return "Visitanos en http://www.adictosaltrabajo.com/";  
    }  
} 

y la implementación para el flavor autentia es:

package com.adictosaltrabajo.tutoriales.android.flavors;  
  
public class PhraseGenerator {  
  
    public static String get() {  
        return "Somos pocos, somos buenos, estamos motivados y nos gusta lo que hacemos";  
    }  
} 

Es un ejemplo muy sencillo en el que espero que se vea que podemos tener distintas implementaciones en los distintos flavors.

Mi estructura de directorios queda así:

Ocurre como con el directorio res: Como tengo seleccionado el flavor de adictosaltrabajo, AS interpreta que es un paquete y me lo pinta así y en el caso de autentia me lo muetra como carpetas.

Modificamos de nuevo nuestro layout para añadir un texview

.....  
  
      
  
 

y modificamos la clase MainActiviy para establecer el valor del textview

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    //modificamos el texto del textview  
    ((TextView)findViewById(R.id.tvText)).setText(PhraseGenerator.get());  
} 

3.3 Configuración

También podemos modifica valores de la configuración dependiendo del flavor.

Al principio del tutorial, veíamos como al añadir los flavors, AS nos modificaba el fichero build.gradle. Esto nos abre otra posibilidad de personalización.

Os pongo un par de ejemplo, pero también se podría cambiar el nombre del paquete, certificados de firma..

 ....  
    productFlavors {  
        autentia {  
            //Numero de version 20  
            versionCode 20  
        }  
        adictosaltrabajo {  
            versionCode 18  
        }  
    }  
}  
  
dependencies {  
    //Dependencia sólo para el flavor autentia  
    autentiaCompile 'commons-lang:commons-lang:2.6'  
} 

3.4 Ejemplo

Y así es como queda cada una de los sabores de nuestra aplicación.

Autentia

Adictos al trabajo


4. Conclusiones

Y hasta aquí hemos llegado con flavors. Si por alguna razón necesitamos generar distintas versiones de la aplicación, vemos que solo necesitamos un mínimo de configuración y seguir una estructura de directorios, el resto nos lo gestiona el sdk de Android. Sencillo ¿no? ;P

Para cualquier comentario, duda o sugerencia, tenéis el formulario que aparece a continuación.

Un saludo.

4 COMENTARIOS

  1. Muy buen tutorial. La verdad que estaba buscando algo sencillo y eficaz para la creación de Flavors y este me ha venido a la perfección¡ Saludos¡

  2. Buenas:

    Antes de nada quería darte las gracias por este magnífico tutorial. Ahora mismo me encuentro con un problema que no sé cómo solucionar.

    He cogido el código de una app y quiero instalar la misma app con mis modificaciones en mi dispositivo sin tener que borrarla. En mi build.gradle tengo esto:
    android {
    compileSdkVersion 22
    buildToolsVersion «23.0.3»
    defaultConfig {
    applicationId «com.xxx.yyy»
    minSdkVersion 22
    targetSdkVersion 21
    multiDexEnabled true
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.txt’
    }
    }
    productFlavors {
    demo{
    applicationId «com.xxx.yyydemo»
    versionName»1.0-demo»
    }
    full{
    applicationId «com.xxx.yyyfull»
    versionName»1.0-full»
    }
    }

    defaultConfig es la que se me generó por defecto, y como no puedo borrarla del menú, la he metido aquí. En el module settings => menu => flavors me aparecen las tres, defaultConfig (que no se puede borrar) demo y full.

    El problema es que al instalar el apk (ya sea full o demo) me da fallo. El código es el mismo en demo que en full, lo que quiero es, que la app que ya está instalada, no borrarla e instalar la que yo he creado ¿cómo puedo realizarlo?

  3. Hola tengo un problema con los flavors hice una aplicacion pro y una lite con el main en común el problema cuando corro en el emulador la aplicacion ya sea la lite o la pro me genera 3 iconos diferentes como arreglo para que me genere solo uno gracias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad