| Artículos | 01 JUN 2009

Desarrollo sobre Android (y II)

Tags: Histórico
Terminamos nuestra aplicación basada en el sistema operativo de Google
José M. Palazón.
Después de la primera entrega que publicamos el pasado mes en PC World, y donde repasamos aspectos como las activities o los diálogos, llega el momento de finalizar nuestro diccionario bajo la plataforma Android. En este caso abordaremos aspectos como el debugging o nuestras preferencias, así como ciertos eventos que necesitamos en nuestra aplicación.

Debugging
En todo lenguaje o plataforma, el momento de mirar con detenimiento qué es exactamente lo que está pasando es otra oportunidad para demostrar su calidad, ya que, proveer al desarrollador de buenas herramientas para depurar y analizar su aplicación es esencial; de hecho, éste es uno de los momentos del desarrollo en el que más tiempo se invierte.
La primera buena noticia es que Android se integra perfectamente con el sistema de depuración de Eclipse. Tan sencillo como pulsar el botón de debugging (parece un escarabajo, a la izquierda del de ejecutar) y Eclipse cambiará (preguntando primero, claro) a la perspectiva de debugging, donde podemos ejecutar el código paso a paso, entrar y salir de las funciones, ver los valores de las variables y expresiones personalizadas en cada momento, añadir y eliminar puntos de ruptura (breakpoints), etc. Queda fuera del alcance de este articulo entrar en más detalle sobre cómo depurar una aplicación. Hacerlo para una aplicación Android es exactamente igual que hacerlo para cualquier aplicación Java.
Además de los problemas con el propio código que estamos escribiendo, hay otra serie de cosas que pueden pasar, como recursos que no hemos incluido, fallos en la comunicación con el dispositivo, problemas con el firmado de certificados y un larguísimo etc., y para solucionarlos, el primer sitio donde queremos mirar es el log del dispositivo (en nuestro caso, de momento, del emulador). El framework de desarrollo nos provee de una herramienta llamada ADB (Android Debug Bridge), que, entre otras cosas, nos va a permitir conectarnos remotamente al teléfono y ejecutar comandos en su sistema operativo. La herramienta se encuentra en el directorio tools del framework. Lo primero que necesitamos saber es cómo se llama el dispositivo al que queremos acceder, para lo cual ejecutamos./adb devices. Esto nos devolverá una lista con los dispositivos Android conectados a nuestro sistema, incluido nuestro emulador (sólo si está ejecutándose, claro). El emulador será listado con algo parecido a emulator-5444. Una vez conocemos este identificador, ya podemos entrar en el dispositivo remotamente:

./adb -s emulator-5554 shell

Para los que estemos familiarizados con Linux, podemos probar unos cuantos comandos para jugar un poco con el entorno (pwd, ls o ps, por ejemplo).
Una vez estamos dentro, veamos qué cosas pueden ser interesantes. Posiblemente, la principal es localizar el fichero de logs, que nos dará mensajes de la actividad en el dispositivo. De hecho, vamos a utilizar esto para solucionar un problema que detectamos en la plataforma en el momento de escribir este artículo. Es posible que durante el desarrollo de la aplicación, al instalarla en el teléfono, la consola de eclipse nos reporte un mensaje como este: Installation error: INSTALL_PARSE_FAILED_NO_CERTIFICATES. Please check logcat output for more details. Un mensaje no muy explicativo, pero que nos redirige al log a ver más detalles. Si mediante nuestro shell ejecutamos en el dispositivo el comando logcat, e intentamos instalar de nuevo la aplicación, veremos un mensaje como este: Package com.pcworld.idiomas has no certificates at entry res/drawable/icon.png; ignoring! Como decíamos, realmente esto no es un problema de certificado en sí, sino algún error del framework. Basta con renombrar el fichero icon.png (y su correspondiente referencia en el fichero de manifest que vimos en la primera parte), intentar instalar de nuevo la aplicación y todo funciona de nuevo correctamente. Esto puede pasar, no sólo con el fichero icon.png, sino también con cualquier fichero xml de la carpeta layouts, y tal vez con algunos otros. Para interrumpir logcat pulsamos Control+C.
Otro sitio donde seguramente queremos mirar es en la base de datos. Hemos creado una clase DictionariesDB y una clase interna a ella, DictionariesDBOpenHelper, que contienen la definición de las tablas, columnas y relaciones de la base de datos que hemos querido crear, así como la lógica de inserción, actualización y borrado de elementos. Si algo no funciona como debiera, la base de datos es el mejor sitio para mirar si, al menos a nivel de persistencia, si las cosas van bien o si hemos cometido algún error en las clases recién mencionadas. El gestor de base de datos con el que estamos trabajando es sqlite3. Para poder trabajar con él en el dispositivo, primero nos colocamos donde se encuentran los ficheros de las bases de datos de nuestras aplicaciones, en nuestro caso ejecutamos cd /data/data/com.pcworld.idiomas/databases y con el comando ls vemos las bases de datos disponibles, en nuestro caso Dictionaries, así que para acceder a ella ejecutamos sqlite3 Dictionaries. Una vez dentro, el comando .help nos muestra las distintas opciones. Si, por ejemplo, queremos ver las instrucciones utilizadas para generar la base de datos, usamos .schema. Si lo que queremos es ver los datos, podemos obtener todo el contenido de la base de datos con .dump.
Existe una documentación bastante completa, con ejemplos de todo lo que permite hacer el Android Debug Bridge en developer.android.com/guide/developing/tools/adb.html.

Preferencias de usuario
Ya hemos visto en la primera parte cómo almacenar datos en sqlite. Android ofrece otro par de alternativas para el almacenamiento de datos, a elegir según conveniencia. En esta ocasión vamos a utilizar las Preferencias, un mecanismo incluido en Android para cuando queremos almacenar un conjunto de pares clave-valor. Lo que vamos a almacenar aquí es el número de palabras por partida que queremos que el juego nos pregunte. Lo primero es crear el marco para la configuración de preferencias, esto es, activar el botón en la pantalla principal y crear la Activity (que vimos en la pasada entrega) para las preferencias. De nuevo, muy parecido a lo que ya hemos hecho hasta ahora. El listado preferences.xml contiene el layout que utilizaremos.

<?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”
android:gravity=”fill_vertical”>
<TextView
android:gravity=”center”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/preferences_title”
android:textSize=”25sp”
android:textStyle=”bold”
android:layout_marginBottom=”15dip”/>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”horizontal”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:gravity=”top”
android:layout_marginBottom=”300dip”>
<TextView
android:id=”@+id/words_per_game_label”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”@string/preferences_words_per_game”
android:layout_marginLeft=”5dip”

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información