martes, 6 de diciembre de 2011

Scala en tu Android - Preparando el entorno

Supongamos por un momento que eres una de esas personas que no disfruta programando en Java, a pesar, incluso, de que tus amigos más modernos, tu profesor de la universidad, o tu madre, te hayan hablado de sus bondades y maravillas. Supongamos, también, que te gusta android y la idea de programar aplicaciones para dispositivos móviles. Parece que estés condenado a las largas y tediosas líneas de código Java si quieres poder desarrollar aplicaciones para android, ¿verdad?. Pues NO, no has de resignarte, hay vida más allá de Java en el mundo android, vida que te permitirá programar aplicaciones de manera mucho más útil, divertida y elegante. La alternativa se llama scala, y consiste en un lenguaje de programación de propósito general que es capaz de usar y generar el mismo código bytecode que emplea el compilador de Java.

Scala es un lenguaje orientado a objetos puro, esto quiere decir que en scala, todo, absolutamente todo es un objeto. Scala, es también (al menos en gran parte) un lenguaje funcional. Esta última característica es la que (en mi opión) hace que scala sea realmente útil. En futuras entradas nos meteremos de lleno con la programación funcional, abordando los principios matemáticos en los que se basa. Por el momento dedicaremos varios artículos a mostrar como se puede construir una aplicación sencilla para android en scala. Trataré de mostrar algunas de las características que, en mi opinión, hacen que scala sea un lenguaje mucho más productivo que Java.

Una visión global
Dicho esto, pongámonos manos a la obra. Lo primero que necesitamos para desarrollar aplicaciones para android es preparar el entorno de trabajo y es lo que haremos en este artículo, al terminar de leer tendrás todo lo necesario listo y funcionando para poder desarrollar en scala aplicaciones android. No vamos a emplear ningún IDE, como pueda ser Eclipse, simplemente la consola y un editor de textos, en mi caso es Vim, mi editor de texto favorito. En la página del proyecto android, tenemos bastante documentación sobre como manejarnos con el SDK desde la consola, por lo que nos centraremos principalmente en como configurarlo para poder escribir código scala.
Empezemos por entender y tener una visión global de en que consiste el proceso para generar una aplicación android. Fijémonos en el excelente esquema que ofrece la web de android y que representa una visión gráfica del proceso de creación de una aplicación android usando Java. A su derecha presentamos su homólogo para una aplicación scala.


Esquema creación de un proyecto android con Java
Esquema proyecto en Java
Esquema proyecto en Scala


Como vemos, gran parte del proceso no varía. Para una aplicación con código Java se podría resumir de la siguiente manera:
  1. A partir de los resources (esto abarca desde las imágenes hasta los layouts), se genera el fichero R.java (ya veremos que hace este fichero y su contrapartida en scala, TR.scala) y se compilan esos resources para obtener una versión optimizada de los mismos (de esto se encarga el programa aapt).
  2. El código de la aplicación, junto con el fichero R.java y los posibles ficheros .aidl (ficheros que especifican el interface que emplean dos o más procesos) son compilados.
  3. Los ficheros .class generados por el compilador se convierten a ficheros tipo .dex. Esto es necesario por que la máquina virtual que usa android está optimizada y no entiende el bytecode de java (los ficheros .class) sino que emplea su propio código pseudobinario. Durante este paso se añade el código procedente de librerías externas que añadamos y se convierte a su vez en código .dex.
  4. A partir de aquí el programa apkbuilder empaqueta todo lo necesario para dejarnos un fichero .apk con nuestra aplicación.
Cuando desarrollamos en scala, los pasos son básicamente los mismos, sólo que debemos añadir al proceso el paso de compilar el código scala y el fichero TR.scala que se genera automáticamente. Podemos ver que no hay grandes cambios en el entorno.
En el gráfico se puede ver un paso en el que se ejecuta un programa llamado Proguard, este paso es necesario para optimizar los ficheros .class generados por el compilador (tanto el de Java como el de scala), permitiéndonos eliminar las clases no empleadas y ofuscar el código si así se lo decimos.

¿Qué necesitamos?
Ahora que tenemos una visión más o menos general de en que consiste el proceso, el siguiente paso es conseguir el software necesario para empezar a desarrollar nuestra aplicación de ejemplo. Primeramente necesitamos como es lógico el compilador de scala, puedes instalarlo a través del gestor de paquetes de tu distribución o descargándolo desde la web, la opción es tuya. Simplemente recuerda la ruta donde está instalado. Si quieres puedes comprobar que el compilador funciona ejecutándolo y jugar un poco con el intérprete que trae.
Con proguard haremos lo mismo, descargarlo o instalarlo como más te guste, nuevamente recuerda donde está instalado.
Por último necesitaremos el conjunto de scripts que integra y automatiza todos los pasos vistos anteriormente con el sistema de construcción ant, lo he llamado scaladroide, en un alarde de inefable originalidad.  Una vez que lo tengamos, simplemente ejecutar la orden:
make install
e instalará todo lo necesario bajo $HOME/.landroid y bajo $HOME/bin. No olvides añadir este último directorio a tu PATH para poder empezar a crear proyectos. Para que scaladroide funcione has de tener instalado lua y el módulo xmlreader. La mejor opción para instalarlo de manera rápida y sencilla es que instales lua y luarocks (un gestor de módulos para lua) a través de tu sistema habitual de paquetes. Una vez que esté instalado, añade el módulo xmlreader a través del gestor luarocks con el comando:
luarocks install xmlreader
NOTA: Cuando instales proguard, has de fijarte que los ficheros .jar que incorpora estén bajo un directorio llamado lib. El sistema ant los buscará ahí, si no los tienes en esa ruta, fallará al ejecutarse.

Probando que todo funciona
  Ahora que tenemos todo lo necesario, podemos probar que funciona correctamente. Para ello vamos a crear un proyecto de prueba y compilarlo, tras lo cual tendremos el mítico Hola Mundo, pero en android y programado en scala.
Bajo $HOME/bin tendrás un script llamado CreateAndroidProject.lua, si añadiste esa ruta al PATH, entonces podrás ejecutarlo. Este script es el que se encargará de preparar el árbol de directorios de nuestro proyecto. Para poder realizar su trabajo necesitamos informarle donde está instalado nuestro software: ubicación del SDK de android, lugar donde tenemos scala instalado y la ruta que apunta a proguard. Le daremos esta información a traves de variables de entorno, veamos un ejemplo
export ANDROID_SDK_ROOT=/path/hacia/el/sdk/de/android
export SCALA_ROOT=/path/hacia/scala
export PROGUARD_ROOT=/path/hacia/proguard
CreateAndroidProject.lua
el script se encargará de pedir la información necesaria sobre el nuevo proyecto que vamos a crear, concretamente nos pedirá la siguiente información:
  • Nombre del proyecto
  • Ruta donde crear el proyecto
  • Nombre del paquete
  • Nombre del Activity principal
  • Target - versión del SDK de android
Si todo a funcionado correctamente, y espero que así sea, deberíamos de tener un directorio en el lugar que especificamos antes con el código de nuestro proyecto, scaladroide lo deja listo para compilar y generar el prometido Hola Mundo, por lo que sólo nos falta lanzar el emulador android y probar que todo funciona ejecutando:
ant install
tras lo cual deberíamos ver la nueva aplicación instalada en el emulador.

No funciona, ¿qué hago?
Si algo ha fallado y no obtienes los resultados esperados, puedes estar teniendo alguno de estos problemas, así que revísalos:
  • ¿Proguard instala los .jar bajo un directorio lib?
  • ¿Pasaste la ruta correcta a todo el software necesario en las variables de entorno?
  • ¿Comprobaste el shebang del script CreateAndroidProject.lua?
  • ¿Estás usando el sentido común?
Si aún así no logras solucionar el problema y quieres ponerte en contacto conmigo, no dudes en hacerlo.
En la próxima entrada comenzaremos a escribir código para hacer nuestra aplicación de ejemplo, que será sencilla pero espero incluya las suficientes características para introducirnos con scala.

Saludos y hasta la próxima.