gentoo linux, java, software libre y otras hierbas
may, 09 2010 - 5:45 pm

Construir aplicaciones Android desde la línea de comandos

android consola

Emacs es algo adictivo sin duda… a tal punto que a veces prefiero programar todo desde la línea de comandos en vez de usar un IDE como Eclipse o Netbans. En esta entrada, que sin duda es de esas que me sirve solo a mi y a unos pocos más, se detalla el proceso de compilación e instalación de aplicaciones para Android sin usar más que el SDK y una línea de comandos. Esta guía es aplicable para cualquier sistema operativo, pero yo lo haré en mi equipo que corre Funtoo Linux.

0. Configuración del entorno de trabajo

Lo primero es tener el SDK instalado, lo cual está explicado aquí: Introducción a la programación con Android. Una vez hayamos instalado y configurado el SDK (incluyendo la adición del directorio tools al path del sistema) y tengamos un proyecto que compilar podemos iniciar el proceso de compilación. Es posible también crear el proyecto desde la línea de comandos así:

android create project -t 1 -p /tmp/ejemplo -k net.casidiablo.ejemplo -a Ejemplo

Donde -t 1 es el id de la plataforma para la que vamos a desarrollar la aplicación (el target). Se puede usar el comando android list targets para ver el listado de targets disponibles. -p indica la ruta de creación del proyecto y -a el nombre de la actividad inicial.

1. Compilación

Es posible usar Ant para compilar y empaquetar todo automáticamente… pero me gusta hacer cada cosa y saber qué está pasando por debajo. Así que haremos todo manualmente. El siguiente comando generará el archivo R.java (si no sabes de lo que hablo: Introducción a la programación con Android):

aapt p -m -J src -M AndroidManifest.xml -S res -I $ANDROID_DIR/android.jar
  • p = package
  • -m -j src indicar el directorio de los archivos fuente
  • -M indicar la ubicación del manifiesto
  • -S indicar la ubicación del directorio de recursos
  • -I $ANDROID_DIR/android.jar añade el paquete android.jar al classpath del proyecto. Importante: en mi caso $ANDROID_DIR apunta a /opt/android/platforms/android-4/ y en el path del sistema se encuentra incluido /opt/android/platforms/android-4/tools/ Es importante tener en cuenta que NO se usa la base del SDK como antiguamente se hacía, sino el correspondiente directorio bajo platforms.

Ahora sí vamos a generar los archivos .class (por supuesto, es necesario tener el JDK de Java instalado):

javac -encoding ascii -target 1.5 -d bin -bootclasspath $ANDROID_DIR/android.jar src/net/casidiablo/ejemplo/*.java

Esto básicamente genera archivos .class en el directorio bin. Si la aplicación usara librerías de terceros, se debería agregar el parámetro -classpath=libs/*.jar

Puesto que los archivos .class están generados para la JVM, es necesario convertirlos a archivos para la Dalvik VM:

dx –dex –output=bin/classes.dex bin # si existieran librerías externas se añade libs/*.jar

Ahora empaquetamos los recursos:

aapt p -f -M AndroidManifest.xml -S res/ -I $ANDROID_DIR/android.jar -F bin/ejemplo.ap_

Ahora empaquetamos usando los bytecodes de Dalvik que creamos (classes.dex) para generar el paquete final:

apkbuilder bin/ejemplo.apk -z bin/ejemplo.ap_ -f bin/classes.dex -rf src -rj libs

Finalmente podemos instalarlo tal como escribí en Manipulación de smartphones con Android desde la consola de Linux:

adb install bin/ejemplo.apk

Links interesantes: How to build Android application package (.apk) from the command line using the SDK tools + continuously integrated using CruiseControl y Developing Android without Eclipse or Ant

4 Comentarios | deja el tuyo

mar, 28 2010 - 10:05 pm

Añadir scroll a Actividades muy largas en Android

Cuando estamos creando interfaces gráficas en Android y la actividad en donde tenemos dicha interfaz es demasiado larga, Android no pone por defecto un scroll que permita navegar entre dicha interfaz. Para hacerlo, podemos usar la clase ScrollView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="Un formulario muy largo"
		android:textSize="20dp" android:textColor="#ED0034" />
	<!-- inicia el ScrollView -->
	<ScrollView android:layout_width="fill_parent"
		android:layout_height="fill_parent">
		<!-- se colocal el LinearLayout que contendra el formulario -->
		<LinearLayout android:orientation="vertical"
			android:layout_width="fill_parent" android:layout_height="fill_parent">
			<TextView android:text="Nombre" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<TextView android:text="Apellido" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<TextView android:text="Dirección" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<TextView android:text="Teléfono" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<TextView android:text="e-mail" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<TextView android:text="twiter" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<TextView android:text="País" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<TextView android:text="Ciudad" android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
			<EditText android:layout_width="fill_parent"
				android:layout_height="wrap_content" />
		</LinearLayout>
	</ScrollView>
</LinearLayout>

Es importante tener en cuenta que dentro de un componente de tipo ScrollView se debe poner UN, y SOLAMENTE UN, componente, en este caso un LinearLayout.  Además, solo soporta scroll vertical. El resultado es algo  como esto:

En este caso he dejado un TextView por fuera del scroll de tal manera que aparezca siempre… pero por supuesto podemos hacer que el scroll ocupe toda la pantalla.

Descargar código fuente ejemplo

10 Comentarios | deja el tuyo

mar, 25 2010 - 11:11 am

Depuración de aplicaciones en Android

Siguiendo con la serie de entradas sobre Android, aprenderemos a depurar de una manera sencilla las aplicaciones que escribamos. Muchas veces, al ejecutar la aplicación obtenemos un mensaje de este tipo:

Cuando estamos desarrollando aplicaciones normales en Java, usualmente imprimimos mensajes en consola que contienen la información de las excepciones que capturamos, y que nos permiten detectar los errores. En Android tendremos hacer uso de la clase Log, que genera logs :roll: (¡capitán obvio al rescate!).

Su uso es bastante simple. Como ejemplo usemos este programa que arrojaría un famoso NullPointerException:

package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class EjemploInvertir extends Activity {
	@Override
	public void onCreate(Bundle b) {
		super.onCreate(b);
		setContentView(R.layout.interfaz_grafica);
		String x = null;
		try {
			x.length();
		} catch (Exception e) {
			Log.d("Al inicio", "El error es: "+e.toString());
		}
	}
}

En este caso se usó el método d de la clase Log, el cual genera mensajes de tipo DEBUG. Existen otros como v, para VERBOSE, e para ERROR, etc. La lista completa la encuentras en el API de la clase.

Para leer el registro de errores desde Eclipse vamos a Window -> Show view -> Other… Dentro del cuadro de diálogo que se abre seleccionamos Android -> Logcat:

Espero que les sea de ayuda. No duden en comentar sus dudas o sugerencias.

2 Comentarios | deja el tuyo

« Entradas anteriores
Entradas recientes »