miércoles, 15 de octubre de 2014

Crear Librería Android con Gradle

A medida que vamos obteniendo experiencia en desarrollo de aplicaciones, creamos código y recursos que queremos utilizar en otros proyectos.

Esta funcionalidad y recursos pueden ser compartidos por medio de librerías. Crear una librería para Android es sencillo. Aquí describiré como crear una librería con Android y gradle y como incorporarlo en un nuevo proyecto.

Gradle wrapper

Gradle Wrapper es la forma preferida para empezar una construcción Gradle. Cuando se hace una construcción por medio del wrapper, Gradle es descargado y utilizado para correr la construcción.

Gradle wrapper debe ser versionado junto con tu proyecto. Al versionarlo cualquiera puede trabajar con este sin la necesidad de pre instalar Gradle; además de que la construcción está garantizada con la versión con la que se creó. Estas características facilitan la incorporación de proyectos creados con gradle wrapper a servidores de integración continua ya que no requiere configuración en el servidor.

Vamos a crear el archivo gradle.build en el directorio android_ui para definir la construcción de la librería. El código a incluir en el archivo es el siguiente:

task wrapper(type: Wrapper) {
    gradleVersion = '2.1'
}

La línea gradleVersion = '2.1' indica que construiremos el proyecto con la version 2.1 de gradle.

Ahora vamos a abrir una terminal y navegar hasta el directorio creado y ejecutaremos el siguiente comando:

gradle wrapper

Como resultado de ejecución del comando obtendremos la siguiente estructura de directorios, misma que tendremos que versionar en nuestro control de versiones

Agregar plugin Android Library

Una vez configurado el wrapper, lo que haremos será agregar a nuestro script de construcción el plugin para la librería de Android. Vamos a agregar el siguiente código

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.13.0'
    }
}

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"
 
  defaultConfig {
        applicationId "mx.org.miempresa.android_ui"
        minSdkVersion 19
        targetSdkVersion 19
        versionCode 101
        versionName "1.0.1-SNAPSHOT"
        testApplicationId "mx.org.miempresa.android_ui.test"
    }
}

Agregar código librería

Vamos a crear una clase llamada SpinnerExtensor para representar la funcionalidad que deseamos compartir

package mx.org.miempresa.android_ui.extensors;

import java.util.List;

import android.content.Context;
import android.util.Log;
import android.widget.Spinner;

/**
 * Clase utilizada para extender la funcionalidad del {@link Spinner} proporcionado
 * por android.
 * 
 * @author Clemente Morales Fernández
 *
 * @since 07/10/2014
 */
public final class SpinnerExtensor {
    /**
     * Identificador de esta clase en el log de eventos.
     */
    private static final String TAG = SpinnerExtensor.class.getSimpleName();
    
    /**
     * Permite crear ejemplares de la clase {@link SpinnerExtensor} desde dentro
     * de esta clase. 
     */
    private SpinnerExtensor() {
    }

    /**
     * Permite cargar las opciones de un spinner mediante una lista de modelos.
     * 

El modelo que se pasa en la lista, deberá utilizar las siguientes * anotaciones:

*

{@link DescriptionMethod} Para indicar que método será el encargado de * proveer la información a desplegar en las opciones del spinner.

*

{@link IdMethod} Para indicar que método será utilizado para obtener el * identificador del modelo.

* * @param context Contexto en el que se cargan las opciones del control spinner. * @param combo Control en donde se cargarán las opciones. * @param opciones Opciones del {@link Spinner}. * @param Tipo de modelo de las opciones del {@link Spinner}. */ public static void cargarOpcionesSpinner(Context context, Spinner combo, List opciones) { // TODO implement this method } }

Generar librería

Para generar la librería ejecutamos el siguiente comando:

gradlew build

Importar librería en proyecto

Para utilizar la librería creada, vamos a crear un proyecto con Android Studio y vamos a copiar la librería antes generada en el directorio android_ui-->build-->outputs-->aar-->android_ui-release.aar al directorio libs del proyecto creado por Android Studio

Ahora vamos a modificar el archivo build.gradle para incorporar la librería.

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'mx.org.miempresa.android_ui:android_ui:1.0.1-SNAPSHOT@aar'
}

Listo, con esto ya podemos utilizar las clases y métodos de nuestra librería