Trabajando en Android con Maven

1
16081

Trabajando en Android con Maven

0. Índice de
contenidos.

1. Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Mac Book Pro 17″ (2,6 Ghz Intel Core i7, 8 GB DDR3)
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.4
  • Eclipse Juno con soporte Android y Maven
  • Maven 3.0.4
  • Android SDK

2. Introducción

Una de las cosas que más he echado de menos a la hora de trabajar con Android es nuestro querido y ya casi imprescindible Maven para la gestión de estos proyectos. Pues bien ahora, gracias a los chicos suecos de Jayway, tenemos un plugin llamado «maven-android-plugin» que nos permite crear proyectos Maven específicos para Android. Toda la información relativa a este plugin la podéis encontrar aquí.

Nos proporciona comandos específicos de Maven para lanzar el emulador, desplegar la aplicación en todos los dispositivos conectados, arrancar la aplicación y eliminar la aplicación; y sobre todo poder integrar el proyecto fácilmente en nuestro proceso de integración continua.

3. Creación del proyecto

Lo primero que vamos a hacer es crear el proyecto Maven con el arquetipo de Android que nos ofrecen. Para ello abrimos un terminal, nos situamos en el directorio donde queramos crear el proyecto y ejecutamos:

mvn archetype:generate -DarchetypeArtifactId=android-quickstart -DarchetypeGroupId=de.akquinet.android.archetypes   
-DarchetypeVersion=1.0.8 -DgroupId=com.autentia -DartifactId=calc-android -Dversion=1.0-SNAPSHOT

Para ilustrar el ejemplo vamos a hacer una calculadora. Ahora abrimos Eclipse e importamos el proyecto como proyecto de Maven. Si el Eclipse está bien configurado debería detectar el proyecto como un proyecto gestionado por Maven de Android. Para saberlo basta con que pinchemos con el botón derecho sobre la raíz del proyecto y ver que en la sección «Run As» aparece la opción «Android Application».

Si abrimos el fichero pom.xml que nos ha generado, vemos que a parte de las dependencias necesarias, ya tenemos declarado el plugin «maven-android-plugin» con una configuración por defecto.


    com.jayway.maven.plugins.android.generation2
    android-maven-plugin
    3.1.1
    
        ${project.basedir}/AndroidManifest.xml
        ${project.basedir}/assets
        ${project.basedir}/res
        ${project.basedir}/src/main/native
        
            10
        
        true
    
    true

La configuración viene por defecto para la plataforma 10 de Android que se corresponde con la versión 2.3.3 de Android. Por lo que nos vamos a asegurar de tener un emulador compatible creado en el SDK. En caso contrario, lo podemos hacer desde Eclipse, simplemente abriendo el «Android Virtual Device (AVD) Manager» desde la opción Window del menú de Eclipse.

Para crear una nueva instancia pulsamos en «New», establecemos un nombre para el dispositivo (AVD-2.3.3-10), seleccionamos una plataforma objetivo, en este caso Api Level 10 y el resto de opciones las dejamos por defecto.

Para establecer este dispositivo como predeterminado a la hora de lanzar el emulador con el plugin de Maven tenemos que dejar la configuración de esta forma:

  
    com.jayway.maven.plugins.android.generation2  
    android-maven-plugin  
    3.1.1  
      
        ${project.basedir}/AndroidManifest.xml  
        ${project.basedir}/assets  
        ${project.basedir}/res  
        ${project.basedir}/src/main/native  
          
            10  
          
        true  
          
            AVD-2.3.3-10  
          
      
    true  
 

4. Creamos la lógica de negocio

En este caso simple, la lógica de negocio va a consistir en una calculadora que contenga los típicos métodos de suma, resta, multiplicación y división. Como no puede ser de otra forma la implementación de la lógica de negocio la comenzados con un test el cual no irá descubriendo el diseño de nuestra solución. Para ello necesitamos incluir la dependencia JUnit en el pom.xml del proyecto. Después de todos los ciclos de TDD necesarios, este es el código del test resultante.

package com.autentia.logic;

import org.junit.Assert;
import org.junit.Test;

public class CalculadoraTest {
	
	@Test
	public void addTwoOperands(){
		Double op1 = Double.valueOf(3.0);
		Double op2 = Double.valueOf(4.0);
		
		Assert.assertEquals(Double.valueOf(7.0), Calculadora.add(op1, op2));
		
	}
	
	@Test
	public void sustractTwoOperands(){
		Double op1 = Double.valueOf(5.0);
		Double op2 = Double.valueOf(2.0);
		
		Assert.assertEquals(Double.valueOf(3.0), Calculadora.sustract(op1, op2));
	}
	
	@Test
	public void multiplyTwoOperands(){
		Double op1 = Double.valueOf(6.0);
		Double op2 = Double.valueOf(2.0);
		
		Assert.assertEquals(Double.valueOf(12.0), Calculadora.multiply(op1, op2));
	}
	
	@Test
	public void divideTwoOperands(){
		Double op1 = Double.valueOf(10.0);
		Double op2 = Double.valueOf(2.0);
		
		Assert.assertEquals(Double.valueOf(5.0), Calculadora.divide(op1, op2));
	}
}

Y el código resultante para la clase Calculadora

package com.autentia.logic;

public class Calculadora {

	public static Double add(Double op1, Double op2) {
		return op1 + op2;
	}

	public static Double sustract(Double op1, Double op2) {
		return op1 - op2;
	}
	
	public static Double multiply(Double op1, Double op2) {
		return op1 * op2;
	}
	
	public static Double divide(Double op1, Double op2) {
		return op1 / op2;
	}
}

5. Definición de la interfaz de usuario

Ahora vamos a crear la pantalla que permita al usuario introducir los dos operandos y seleccionar la operación a realizar. Para ello, editamos el fichero res/layout/main.xml que nos ha creado el plugin con un contenido por defecto.

Utilizando el «Graphical Layout» de Eclipse creamos visualmente la interfaz deseada que se podría parecer a la que se muestra a continuación.

La interfaz es claramente mejorable pero para el propósito de este tutorial es suficiente. Tenemos que tener presente los ids que le damos a los distintos elementos, en mi caso:

  • Campo de texto ‘Operando 1’: strOp1
  • Campo de texto ‘Operando 2’: strOp2
  • Botón de sumar: btnAdd
  • Botón de restar: btnSustract
  • Botón de multiplicar: btnMultiply
  • Botón de dividir: btnDivide
  • Etiqueta de ‘Resultado’: txtResult

Tendremos que tener en cuenta estos ids a la hora de interactuar con el interfaz gráfico desde la actividad.

6. Creamos la actividad

Toda aplicación de Android necesita al menos de una actividad; por lo que nosotros vamos a renombrar la actividad que el plugin te crea por defecto ‘HelloAndroidActivity’ por ‘CaclActivity’. No olvidéis cambiar el nombre también en la declaración de la actividad dentro del fichero AndroidManifest.xml.

Ahora vamos a incluir los manejadores de los eventos cuando pulsamos algún botón de operación y un manejador para borrar el resultado cuando se pulse encima del campo de texto. El código resultante de la actividad sería:

package com.autentia;

import com.autentia.logic.Calculadora;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class CalcActivity extends Activity {

    private static String TAG = "calc-android";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
		Log.i(TAG, "onCreate");
        setContentView(R.layout.main);
        
        //Cuando el usuario pulsa el campo de texto Resultado se borra el contenido
        final TextView txtResult = (TextView) findViewById(R.id.txtResult);
		txtResult.setOnClickListener(new EditText.OnClickListener() {
			public void onClick(View v) {
				txtResult.setText("");
			}
		});

		//Cuando el usuario pulsa el botón Add se realiza la suma de los operandos
		final Button btnAdd = (Button) findViewById(R.id.btnAdd);
		btnAdd.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				Double[] operands = getOperandsInView();
				txtResult.setText(String.valueOf(Calculadora.add(operands[0], operands[1])));
			}
		});
		
		//Cuando el usuario pulsa el botón Sustract se realiza la resta de los operandos
		final Button btnSustract = (Button) findViewById(R.id.btnSustract);
		btnSustract.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				Double[] operands = getOperandsInView();
				txtResult.setText(String.valueOf(Calculadora.sustract(operands[0], operands[1])));
			}
		});
		
		//Cuando el usuario pulsa el botón Multiply se realiza la multiplicación de los operandos
		final Button btnMultiply = (Button) findViewById(R.id.btnMultiply);
		btnMultiply.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				Double[] operands = getOperandsInView();
				txtResult.setText(String.valueOf(Calculadora.multiply(operands[0], operands[1])));
			}
		});
		
		//Cuando el usuario pulsa el botón Sustract se realiza la resta de los operandos
		final Button btnDivide = (Button) findViewById(R.id.btnDivide);
		btnDivide.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				Double[] operands = getOperandsInView();
				txtResult.setText(String.valueOf(Calculadora.divide(operands[0], operands[1])));
			}
		});
		
    }
    
    private Double[] getOperandsInView(){
    	final String strOp1 = ((EditText) findViewById(R.id.strOp1)).getText().toString();
		final String strOp2 = ((EditText) findViewById(R.id.strOp2)).getText().toString();

		Double op1 = Double.valueOf(0);
		if (!"".equals(strOp1)){
			op1 = Double.valueOf(strOp1);
		}
		
		Double op2 = Double.valueOf(0);
		if (!"".equals(strOp2)){
			op2 = Double.valueOf(strOp2);
		}
		
		Double[] operands =  new Double[2];
		operands[0] = op1;
		operands[1] = op2;
		
		return operands;
		
    }

Ejecutamos un ‘mvn clean install’ del proyecto para ver que todo es correcto y para que nos genere el .apk que tenemos que instalar en el dispositivo móvil.

7. Probando la aplicación

Para probar la aplicación vamos a lanzar el emulador que creamos anteriormente. Para ello simplemente abrimos un terminal, nos situamos en el directorio raíz del proyecto y ejecutamos ‘mvn android:emulator-start’. Pasados unos segundos el sistema nos mostrará el emulador con el que podremos interactuar como si de un móvil se tratase.

Ahora vamos a instalar el .apk del proyecto en el emulador o cualquier dispositivo que tengamos conectado. Para ello desde el terminal ejecutamos ‘mvn android:deploy’. Una vez finalizado si accedemos a las aplicaciones del móvil debemos ver la nuestra. Ahora podemos ejecutar la aplicación directamente en el emulador o ejecutar desde línea de comandos ‘mvn android:run’ para poder interactuar con la aplicación.

Para eliminar la aplicación del dispositivo basta con ejecutar ‘mvn android:undeploy’. En caso de querer actualizar alguna modificación en la aplicación podríamos ejecutar ‘mvn android:redeploy’ sin olvidar antes volver a ejecutar ‘mvn clean install’.

5. Conclusiones

Si todavía no has empezado con Android, este puede ser un buen punto de partida para tener un proyecto en Android con todas las ventajas de Maven. Para temas específicos del lenguaje recomiendo los siguientes tutoriales:

Cualquier duda o sugerencia en la zona de comentarios.

Saludos.

1 COMENTARIO

  1. Hola Buen dia.
    Me ha parecido genial su tutorial. Hes exactamente lo que estaba buscando.

    Actualmente me encuentro colaborando en el desarrollo de un proyecto, espero usted pueda ayudarme.

    Mi colaboracion consta en la adaptacion de este proyecto a una aplicacion para dispositivo movil, he decidido trabajar en android.

    Quisiera saber su opinion hacerca de la adaptacion que quiero realizar.

    El proyecto esta desarrollado en maven, utiliza flexmojos, flexSDK,jboss mysql.

    Dejo el link sobre el proyecto para mas informacion.
    https://github.com/eder-toledo/MultiGame

    Muchas 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