Plataforma Android

22.02.2011 21:41

 Introducción

Android constituye una pila de software pensada especialmente para dispositivos móviles y que incluye tanto un sistema operativo, como middleware y diversas aplicaciones de usuario. Representa la primera incursión seria de Google en el mercado móvil y nace con la pretensión de extender su filosofía a dicho sector. 

Todas las aplicaciones para Android se programan en lenguaje Java y son ejecutadas en una máquina virtual especialmente diseñada para esta plataforma, que ha sido bautizada con el nombre de Dalvik.

El núcleo de Android está basado en Linux 2.6. La licencia de distribución elegida para Android ha sido Apache 2.0  [23], lo que lo convierte en software de libre distribución.

A los desarrolladores se les proporciona de forma gratuita un SDK y la opción de un plug-in para el entorno de desarrollo Eclipse varios que incluyen todas las API necesarias para la creación de aplicaciones, así como un emulador integrado para su ejecución. Existe además disponible  una amplia documentación de respaldo para este SDK [24]. 

El proyecto Android está capitaneado por Google y un conglomerado de otras empresas tecnológicas agrupadas bajo el nombre de  Open Handset Alliance (OHA) [25].

El objetivo principal de esta alianza empresarial (que incluye a fabricantes de dispositivos y operadores, con firmas tan relevantes como Samsung, LG, Telefónica, Intel o Texas Instruments, entre otras muchas) es el desarrollo de estándares abiertos para la telefonía móvil como medida para incentivar su desarrollo y para mejorar la experiencia del usuario. 

La plataforma Android constituye su primera contribución en este sentido. 

Cuando en noviembre de 2007 Google anunció  su irrupción en el mundo de la telefonía móvil a través de Android [26], muchos medios especializados catalogaron este novedoso producto como un nuevo sistema operativo, libre y específico para teléfonos móviles. Sin embargo, los responsables del proyecto se han esforzado desde entonces en destacar que la motivación de Android es convertirse en algo más que un simple sistema operativo.

Con Android se busca reunir en una misma plataforma todos los elementos necesarios que permitan al desarrollador controlar y aprovechar al máximo cualquier funcionalidad ofrecida por un dispositivo móvil (llamadas, mensajes de texto, cámara, agenda de contactos, conexión Wi-Fi, Bluetooth, aplicaciones ofimáticas,  videojuegos, etc.), así como poder crear aplicaciones que sean verdaderamente portables, reutilizables y de rápido desarrollo. En otras palabras, Android quiere mejorar y estandarizar el desarrollo de aplicaciones para cualquier dispositivo móvil y, por ende, acabar con la perjudicial fragmentación existente hoy día. 

 

 Arquitectura

Como ya se ha mencionado, Android es una plataforma para dispositivos móviles que contiene una pila de software donde se incluye un sistema operativo,  middleware y aplicaciones básicas para el usuario. Su diseño cuenta, entre otras, con las siguientes características:

 

* Busca el desarrollo rápido de aplicaciones, que sean reutilizables y verdaderamente portables entre diferentes dispositivos.

 

 *Los componentes básicos de las aplicaciones se pueden sustituir fácilmente por otros. 

 

 *Cuenta con su propia máquina virtual, Dalvik, que interpreta y ejecuta código escrito en Java.

 

 *Permite la representación de gráficos 2D y 3D.

 

 *Posibilita el uso de bases de datos.

 

* Soporta un elevado número de formatos multimedia.

 

* Servicio de localización GSM.

 

 *Controla los diferentes elementos hardware: Bluetooth, Wi-Fi, cámara 

fotográfica o de vídeo, GPS, acelerómetro, infrarrojos, etc., siempre y cuando el dispositivo móvil lo contemple.

* Cuenta con un entorno de desarrollo muy cuidado mediante un SDK disponible de forma gratuita.

 

 *Ofrece un plug-in para uno de los entornos de desarrollo más populares, Eclipse, y un emulador integrado para ejecutar las aplicaciones.

 

*La capa más inmediata es la corresponde al  núcleo de Android. Android utiliza el 

núcleo de Linux 2.6 como una capa de abstracción para el hardware disponible en los dispositivos móviles. 

 

Esta capa contiene los drivers necesarios para que cualquier componente hardware pueda ser utilizado mediante las llamadas correspondientes. Siempre que un fabricante incluya un nuevo elemento de hardware, lo primero que se debe realizar para que pueda ser utilizado desde Android es crear las librerías de control o drivers necesarios dentro de este kernel de Linux embebido en el propio Android.

 

La elección de Linux 2.6 se ha debido principalmente a dos razones: la primera, su naturaleza de código abierto y libre se ajusta al tipo de distribución que se buscaba para Android (cualquier otra opción comercial disponible hoy día hubiera comprometido la licencia de Apache); la segunda es que este kernel de Linux incluye de por sí numerosos drivers, además de contemplar la gestión de memoria, gestión de procesos, módulos de seguridad, comunicación en red y otras muchas responsabilidades propias de un sistemas operativo.

 

Librerías más importantes

La librería  libc incluye todas las cabeceras y funciones según el estándar del  lenguaje C. Todas las demás librerías se definen en este lenguaje.  La librería  Surface Manager es la encargada de componer los diferentes  elementos de navegación de pantalla. Gestiona también las ventanas pertenecientes a las distintas aplicaciones activas en cada momento.

 

OpenGL/SL y  SGL representan  las librerías gráficas y, por tanto, sustentan la capacidad gráfica de Android.  OpenGL/SL maneja gráficos en 3D y permite utilizar, en caso de que esté disponible en el propio dispositivo móvil, el hardware encargado de proporcionar gráficos 3D. Por otro lado,  SGL proporciona gráficos en 2D, por lo que será la librería más habitualmente  utilizada por la mayoría de las aplicaciones. Una característica importante de la  capacidad gráfica de Android es que es posible desarrollar aplicaciones que  combinen gráficos en 3D y 2D.

 

La librería Media Libraries proporciona todos los códecs necesarios para el  contenido multimedia soportado en Android (vídeo, audio, imágenes estáticas y  animadas, etc.)

 FreeType, permite trabajar de forma rápida y sencilla con distintos tipos de fuentes.

 La librería  SSL posibilita la utilización de dicho protocolo para establecer  comunicaciones seguras.

 A través de la librería SQLite, Android ofrece la creación y gestión de bases de datos relacionales, pudiendo transformar estructuras de datos en objetos fáciles de manejar por las aplicaciones.

 

 La librería  WebKit proporciona un motor para las aplicaciones de tipo navegador, y forma el núcleo del actual navegador incluido por defecto en la plataforma Android.

 

Framework de aplicaciones

Representa fundamentalmente el conjunto de herramientas de desarrollo de cualquier aplicación. Toda aplicación que se desarrolle para Android, ya sean las propias del dispositivo, las desarrolladas por Google o terceras compañías, o incluso las que el propio usuario cree, utilizan el mismo conjunto de API y el mismo framework, representado por este nivel.

 

API más importantes ubicadas aquí, se pueden encontrar las siguientes:

 

Activity Manager, importante conjunto de API que gestiona el ciclo de vida de las aplicaciones en Android (del que se hablará más adelante). Window Manager, gestiona las ventanas de las aplicaciones y utiliza la librería ya vista Surface Manager.

Telephone Manager, incluye todas las API vinculadas a las funcionalidades propias del teléfono (llamadas, mensajes, etc.) Content Providers, permite a cualquier aplicación compartir sus datos con las demás aplicaciones de Android. Por ejemplo, gracias a esta API la información de contactos, agenda, mensajes, etc. será accesible para otras aplicaciones.   View System, proporciona un gran número de elementos para poder construir interfaces de usuario (GUI), como listas, mosaicos, botones,  check-boxes, tamaño de ventanas, control de las interfaces mediante tacto  o teclado, etc. Incluye también algunas vistas estándar para las funcionalidades más frecuentes.

Location Manager, posibilita a las aplicaciones la obtención de información de localización y posicionamiento, y funcionar según ésta.

 Notification Manager, mediante el cual las aplicaciones, usando un mismo formato, comunican al usuario eventos que ocurran durante su ejecución: una llamada entrante, un mensaje recibido, conexión Wi-Fi disponible, ubicación en un punto determinado, etc. Si llevan asociada alguna acción, en Android denominada  Intent, (por ejemplo, atender una llamada recibida) ésta se activa mediante un simple clic.

 XMPP Service, colección de API para utilizar este protocolo de intercambio de mensajes basado en XML.

 

El último nivel del diseño arquitectónico de Android son las  aplicaciones. Éste nivel incluye tanto las incluidas por defecto de Android como aquellas que el usuario vaya añadiendo posteriormente, ya sean de terceras empresas o de su propio desarrollo. Todas estas aplicaciones utilizan los servicios, las API y  librerías de los niveles anteriores. 

 

La máquina virtual Dalvik

En Android, todas las aplicaciones se programan en el lenguaje Java y se ejecutan mediante una máquina virtual de nombre Dalvik, específicamente diseñada para Android. Esta máquina virtual ha sido optimizada y adaptada a las peculiaridades propias de los dispositivos móviles (menor capacidad de proceso, baja memoria, alimentación por batería, etc.) y trabaja con ficheros de extensión .dex (Dalvik Executables). Dalvik no trabaja directamente con el  bytecode de Java, sino que lo transforma en un código más eficiente que el original, pensado para  procesadores pequeños.  

 

Gracias a la herramienta “dx”, esta transformación es posible: los ficheros .class de Java se compilan en ficheros .dex, de forma que cada fichero .dex puede contener varias clases. Después, este resultado se comprime en un único archivo de extensión .apk (Android Package), que es el que se distribuirá en el dispositivo móvil. Dalvik permite varias instancias simultáneas de la máquina virtual, y a diferencia de otras máquinas virtuales, está basada en registros y no en pila, lo que implica que las instrucciones son más reducidas y el número de accesos a memoria es menor [28]. Así mismo, Dalvik no permite la compilación Just-in-Time.

Según los responsables del proyecto, la utilización de esta máquina virtual responde a un deseo de mejorar y optimizar la ejecución de aplicaciones en dispositivos móviles, así como evitar la fragmentación de otras plataformas como Java ME.

 

 

 

Componentes de una aplicación

Todas las aplicaciones en Android pueden descomponerse en cuatro tipos de bloques o componentes principales. Cada aplicación será una combinación de uno o más de estos componentes, que deberán ser declarados de forma explícita en un fichero con formato XML denominado “AndroidManifest.xml”, junto a otros datos asociados como valores globales, clases que implementa, datos que puede manejar, permisos, etc.

 

*Activity

Sin duda es el componente más habitual de las aplicaciones para Android. Un componente  Activity refleja una determinada actividad llevada a cabo por una aplicación, y que lleva asociada típicamente una ventana o interfaz de usuario; es importante señalar que no contempla únicamente el aspecto gráfico, sino que éste forma parte del componente Activity a través de vistas representadas por clases como View y sus derivadas. Este componente se implementa mediante la clase de mismo nombre Activity.

 

Android permite controlar por completo el ciclo de vida de los componentes Activity.Muy vinculado a este componente se encuentran los  Intents, una interesante novedad introducida por Android. Un  Intent consiste básicamente en la voluntad de realizar alguna acción, generalmente asociada a unos datos. Lanzando un Intent, una aplicación puede  delegar el trabajo en otra, de forma que el sistema se encarga de buscar qué aplicación entre las instaladas es la que puede llevar a cabo la acción solicitada. Por ejemplo, abrir una URL en algún navegador web, o escribir un correo electrónico desde algún cliente de correo.

 

 

*Broadcast Intent Receiver

Un componente Broadcast Intent Receiver se utiliza para lanzar alguna ejecución dentro de la aplicación actual cuando un determinado evento se produzca (generalmente, abrir un componente  Activity). Por ejemplo, una llamada entrante o un SMS recibido. No tiene interfaz de usuario asociada, pero puede utilizar el API  Notification Manager, mencionada anteriormente, para avisar al usuario del evento producido a través de la barra de estado del dispositivo móvil. Este componente se implementa a través de una clase de nombre BroadcastReceiver.Para que  Broadcast Intent Receiver funcione, no es necesario que la aplicación en cuestión sea la aplicación activa en el momento de producirse  el evento. El sistema lanzará la aplicación si es necesario cuando el evento monitorizado tenga lugar. 

 

 

 

Service

Un componente  Service representa una aplicación ejecutada sin interfaz de usuario, y que generalmente tiene lugar en segundo plano mientras otras aplicaciones (éstas con interfaz) son las que están activas en la pantalla del dispositivo. 

 

Content Provider

 

Con el componente Content Provider, cualquier aplicación en Android puede almacenar datos en un fichero, en una base de datos SQLite o en cualquier otro  formato que considere. Además, estos datos pueden ser compartidos entre distintas aplicaciones. Una clase que implemente el componente Content Provider contendrá una serie de métodos que permite almacenar, recuperar, actualizar y compartir los datos de una aplicación. Existe una colección de clases para distintos tipos de gestión  de datos en el paquete android.provider. Además, cualquier formato adicional que se quiera implementar deberá pertenecer a este paquete y seguir sus estándares de funcionamiento.

 

Ciclo de vida de las aplicaciones Android

Android lanza tantos procesos como permitan los recursos del dispositivo. Cada proceso, correspondiente a una aplicación, estará formado por una o varias actividades independientes (componentes Activity) de esa aplicación. Cuando el usuario navega de una actividad a otra, o abre una nueva aplicación, el sistema duerme dicho proceso y realiza una copia de su estado para poder recuperarlo más tarde. El proceso y la actividad siguen existiendo en el sistema, pero están dormidos y su estado ha sido guardado. Es entonces cuando crea, o despierta si ya existe, el proceso para la aplicación que debe ser lanzada, asumiendo que existan recursos para ello.

onCreate(), onDestroy(): abarcan todo el ciclo de vida. Cada uno de estos métodos representan el principio y el fin de la actividad. 

 onStart(), onStop(): representan la parte visible del ciclo de vida.

Desde onStart() hasta onStop(), la actividad será visible para el usuario, aunque es posible que no tenga el foco de acción por existir otras actividades superpuestas con las que el usuario está interactuando. Pueden ser llamados múltiples veces. 

 onResume(),  onPause(): delimitan la parte útil del ciclo de vida.

Desde onResume() hasta onPause(), la actividad no sólo es visible, sino que además tiene el foco de la acción y el usuario puede interactuar con ella

 

Política de eliminación de procesos

 

Cada aplicación Android se ejecuta en su propio proceso. Este proceso se crea cada vez que una aplicación necesita ejecutar parte de su código, y seguirá existiendo hasta que la aplicación finalice o hasta que el sistema necesite utilizar parte de sus recursos para otra aplicación considerada prioritaria.  Por ello, es importante saber cómo los componentes de una aplicación en Android (Activity, Broadcast Intent Receiver, Service y Content Provider) determinan e influyen en el ciclo de vida de la aplicación. No usar los componentes correctamente a la hora de construir una aplicación puede significar que el sistema operativo la termine cuando en realidad está haciendo una tarea importante para el usuario. Android construye una jerarquía donde evalúa la clase de componentes que están ejecutándose y el estado de los mismos. En orden de importancia, serían los siguientes:

 

 

1. Procesos en primer plano: aquellos necesarios para lo que el usuario está haciendo en ese momento. Un proceso se encuadra en esa categoría  si cumple alguna de las siguientes condiciones:

a. tiene un componente  Activity ejecutándose, con la que el usuario está interactuando.

b. tiene un componente Broadcast Intent Receiver ejecutándose.

c. ha lanzado algún otro proceso que tiene un componente  Serviceejecutándose en el momento  Idealmente, sólo debería haber algunos de estos procesos en el sistema, y su eliminación debería darse únicamente en casos extremos en los que la falta de recursos impide siguen ejecutándolos todos.

2. Procesos visibles: aquellos procesos que contienen un componente  Activityvisible en la pantalla, pero no con el foco de actividad en ese momento.

 

 

3. Procesos de servicio: aquellos procesos que tienen un componente  Service  y que están ejecutándose en background. Aunque no sean visibles directamente al usuario, desempeñan tareas sí percibidas por este.

4. Procesos en segundo plano: procesos con un componente Activity, que no son visibles al usuario. Estos procesos no tienen una importancia directa para el usuario en ese momento.

5. Procesos vacíos: procesos que ya no ejecutan ninguna actividad, pero que se mantienen en memoria para agilizar una posible nueva llamada por parte del usuario.

 

 

Seguridad en Android

 

En Android cada aplicación se ejecuta en su propio proceso. La mayoría de las medidasde seguridad entre el sistema y las aplicaciones deriva de los estándares de Linux 2.6, cuyo kernel, recuérdese, constituye el núcleo principal de Android.

Cada proceso en Android constituye lo que se llama un cajón de arena o sandbox, que proporciona un entorno seguro de ejecución. Por defecto, ninguna aplicación tiene permiso para realizar ninguna operación o comportamiento que pueda impactar negativamente en la ejecución de otras aplicaciones o del sistema mismo. Por ejemplo, acciones como leer o escribir ficheros privados del usuario (contactos, teléfonos, etc.), leer o escribir ficheros de otras aplicaciones, acceso de red, habilitación de algún recurso hardware del dispositivo, etc., no están permitidas. La única forma de poder saltar estas restricciones impuestas por Android, es mediante la declaración explícita de un permiso que autorice a llevar a cabo una determinada acción habitualmente prohibida.

Gestión de la información

A diferencia de lo que ocurre en otros sistemas, en Android cualquier repositiorio de datos, como por ejemplo archivos, son privados y únicamente accesibles por la aplicación a la que pertenecen. Sin embargo, esto no implica necesariamente que no puedan ser compartidos o accedidos por otras aplicaciones; Android facilita una serie de mecanismos que posibilitan en ciertas circunstancias el acceso a dicha información. 

En los siguientes apartados se explican las distintas formas que  tiene una aplicación para almacenar y recuperar información, así como los mecanismos a utilizar en caso de desear compartirla con las demás aplicaciones. 

 

Preferencias de usuario

 

Las preferencias son todos aquellos valores asociados a una determinada aplicación y que permiten adaptar ésta a los gustos o necesidades del usuario. Solamente se puede acceder a las preferencias dentro de un mismo paquete; Android no permite compartir estos valores con otras aplicaciones. 

Para poder compartir las preferencias entre todos los componentes que forman la aplicación, dentro del mismo paquete, debe asignarse un nombre al conjunto de valores que forman las preferencias de usuario. Después, éstas se pueden recuperar a lo largo de todo el paquete haciendo una llamada a  Context.getSharedPreferences(). Si las preferencias solamente serán accedidas desde un componente Activity y no es necesario compartirlas con los demás componentes, es posible omitir el nombre asociado a las preferencias y recuperarlas simplemente llamando a Activity.getPreferences(). 

 

Ficheros

Para leer o escribir ficheros, Android facilita los métodos Context.openFileInput() y Context.openFileOutput(), respectivamente. Estos ficheros deben ser locales a la aplicación en curso, es decir, al igual que con las preferencias, un fichero “estándar” de datos no puede ser compartido con otras aplicaciones.

Si el fichero es estático y puede ser adjuntado a la aplicación en el momento que se compila, éste puede ser añadido como un recurso más. Su ubicación correcta será en la carpeta de recursos, concretamente en “\res\raw\nombrefichero.extension”. Esto permitirá que acompañe al paquete completo y que pueda ser leído directamente con el método Resources.openRawResource (R.raw.nombrefichero). 

 

 Bases de datos

 

Android incluye una librería de SQLite que permite crear bases de  datos relacionales, navegar entre las tablas, ejecutar sentencias en SQL y otras funcionalidades propias del sistema SQLite. La base de datos resultante puede ser accedida desde el código de la aplicación como si de un objeto más se tratara, gracias a las clases contenidas en el paquete android.database.sqlite.

Cualquier base de datos será accesible desde los demás componentes de la misma aplicación, pero no fuera de ésta. 

 

Acceso por red

Como es lógico, Android permite la comunicación entre dispositivos a través de una infraestructura de red, siempre y cuando ésta esté disponible. Los paquetes java.net y android.net ofrecen multitud de clases y posibilidades en este sentido. Más adelantese verán con mayor detenimiento sus capacidades. 

 Content Provider

Hasta ahora, se han mencionado algunas formas para almacenar y recuperar información de forma siempre local y sin poder compartirla con otras aplicaciones del mismo dispositivo. Android ofrece un mecanismo que posibilita el acceso a información de forma compartida: usando un Content Provider o proveedor de contenidos. Ésta es la única forma habilitada para facilitar datos más allá del propio paquete de la aplicación.

Por defecto, Android incluye una serie de componentes Content Provider que permiten publicar todo tipo de datos básicos que pueden resultar útiles entre aplicaciones:

información de los contactos, fotografías, imágenes, vídeos, mensajes de texto, audios, etc. Todos estos Content Provider ya definidos y listos para utilizar se pueden encontrar en el paquete  android.provider. Además, Android ofrece la posibilidad de que el desarrollador pueda crear sus propios Content Provider.

Un Content Provider es un objeto de la clase  ContentProvider, ubicada en el paquete android.content, y que almacena datos de un determinado tipo que pueden ser accedido desde cualquier aplicación. Cada elemento Content Provider tiene asociado una URI única que lo representa y a través de la cual los otros componentes de una aplicación pueden acceder a él. 

 

Para crear un Content Provider, se deben seguir los siguientes pasos:

1. Crear una clase que extienda a ContentProvider.

2. Definir una constante denominada CONTENT_URI donde quede recogida la URI que identificará a este nuevo Content Provider. Esta cadena  siempre ha de comenzar por el prefijo “content://” seguida de la jerarquía de nombres que se desee establecer. Por ejemplo “content://miaplicacion.misdatos”

3. Establecer el sistema de almacenamiento deseado. Lo habitual es establecer una base de datos en SQLite, pero se puede utilizar cualquier mecanismo de almacenamiento.

4. Definir también como constantes el nombre de las columnas de datos que pueden ser recuperadas, de forma que el futuro usuario de este Content Provider puede conocerlas.

5. Implementar los métodos básicos de manipulación de datos. Estos son:

 query(), debe devolver un objeto Cursor.

 insert()

 update()

 delete()

 getType()

 

API  Demos

Como parte del SDK de Android, Google ha incluido un gran número de clases dentro de un bloque denominado “APIDemos”. Estas clases ejemplifican de forma práctica muchas de las características y posibilidades ofrecidas por el sistema Android. Algunas de ellas son las siguientes:

 APIDemos\app: incluye ejemplos de cómo trabajar con los principales componentes de Android, como por ejemplo  Activity o  Service, y algunas aplicaciones sencillas de ejemplo. En estas clases se pueden encontrar ilustraciones sobre cómo guardar el estado de una actividad cuando es dormida,

usar las preferencias de usuario, devolver un valor desde otra actividad, lanzarcomponentes  Service en el mismo o distinto proceso, o sobre cómo lanzar alarmas y notificaciones al usuario.

 APIDemos\View: en esta útil carpeta se pueden ver ejemplos de distintos tipos de vistas y diseños para las interfaces de usuario. Aquí se encuentran clases que ilustran la creación de formularios, distribuciones verticales y horizontales de elementos, vistas que se adaptan al contenido, ventanas con  scroll, listados de elementos, botones compuestos por imágenes, galerías de imágenes o barras de progreso.  

 APIDemos\Graphics: aquí se ofrecen ejemplos de la capacidad gráfica de Android, tanto de la definición de imágenes con movimientos como de  la construcción de figuras geométricas básicas. 

 APIDemos\Media: ejemplos sobre el manejo formatos multimedia, como vídeo,sonidos o imágenes.

Funciones del emulador

El SDK de Android incluye un completo emulador que permite probar y depurar eficientemente las aplicaciones que se van desarrollando. Este emulador incluye diferentes  skins para representar gráficamente un dispositivo móvil real, con pantalla,teclado y botones de función, así como aplicaciones de usuario preinstaladas queincluyen navegador web o visor de mapa, y una consola que permite interactuar con él a través de Telnet.

El emulador, como se ha comentado, es muy completo y escapa al propósito de esteapartado su explicación detallada. Aún así, se mencionan a continuación algunas de las principales características de esta útil herramienta para el desarrollo en Android.

Puede ser lanzado tanto a través de una ventana de comandos, con  el ejecutable de nombre “emulator.exe” de la carpeta “\tools” o, la que probablemente será la mejor, a  través del  plug-in para Eclipse. En este último caso, cada vez que se ejecute una aplicación, se hará automáticamente a través del emulador  incluido en el SDK. Las opciones de lanzamiento desde Eclipse se pueden revisar en Debug/Run -> Target

Uso de imágenes

En el emulador de Android pueden utilizarse imágenes de datos que  se guardan en el propio equipo de desarrollo. Estas imágenes simulan memorias internas, tipo flash, y otras.

En concreto, el emulador dispone de tres tipos de ficheros imagen:

 Imagen de sistema: contiene datos y especificaciones para la ejecución, fundamentales para el emulador. Es únicamente de lectura ya que se lee al principio y no se vuelve a acceder a ella hasta la próxima ejecución. Se almacenan en la carpeta “\lib” y se llaman “kernel.img”,  “system.img”, “ramdisk.img” y “userdata.img”.

 Imagen de ejecución: el emulador dispone de dos ficheros imagen para lectura y escritura de datos. El primer de ellos, “userdata-qemu.img”, almacena los datos del usuario como preferencias, ficheros, contenidos de la  base de datos SQLite, etc. Al arrancar, el emulador comprueba si existe este fichero: si no, lo crea como una copia exacta de la imagen de sistema “userdata.img”; si existe, lo abre sin más. Si al terminar los datos han sido modificados, serán guardados en esta imagen. Si se utilizan varios emuladores, deberán ser configurados para que cada uno cuente con su propia imagen “userdata-qemu.img”. La otra imagen deejecución se denomina “sdcard.img”, y se utiliza para simular dispositivos de almacenamiento extraíbles. Para crear una imagen de este tipo, que es opcional, es necesario utilizar la herramienta “mksdcard” de la carpeta “\tools”.

 Imagen temporal: al ejecutarse el emulador, siempre se crean dos ficheros imagen para datos temporales: uno que hace una copia del sistema completo, y otro que se utiliza como caché para el navegador web y otros servicios. Ambas imágenes se eliminan al terminar la emulación.

Aspectos de red 

Android incorpora a su emulador un pequeño router/firewall virtual, de  forma que el sistema emulado desconoce tanto la máquina de desarrollo como las demás instancias del mismo emulador. Sin embargo, este comportamiento es configurable.

 

 

Todas las instancias del emulador tienen asignada una dirección de red de la forma10.0.2/24. Por defecto, las direcciones definidas para cada instancia son las mostradas en la siguiente tabla:

IP Descripción

10.0.2.1  Gateway virtual

10.0.2.2 Máquina de desarrollo.

10.0.2.3 Servidor DNS principal.

10.0.2.4 / 10.0.2.5 / 10.0.2.6 Servidores DNS secundarios.

10.0.2.15 El sistema emulado, esto es, localhost.

 

Órdenes desde consola

Aunque el emulador ya esté funcionando, hay muchos aspectos de este que pueden ser configurados al momento utilizando la consola a través de un Telnet al puerto 5554 y posteriores, según la instancia del emulador deseada.

Algunos de los comandos aceptados por la consola son los siguientes:

 help: muestra una lista de los comandos disponibles.

 event: permite enviar diferentes tipos de eventos al emulador.

 geo: permite establecer una localización fija mediante coordenadas. Será la que devuelva el dispositivo de GPS al ser invocado desde una aplicación.

 gsm: emula llamadas telefónicas.

 kill: finaliza la instancia del emulador. 

 network: diferentes aspectos relacionados con el control de los distintos tipos de conexiones (GSM, GPRS, UMTS, EDGE), como los valores de latencia.

 power: controla la simulación del nivel de batería del dispositivo móvil. 

 quit/exit: cierra la conexión con el emulador y la consola.

 redir: permite redireccionar puertos entre el emulador y la máquina de desarrollo.

 sms: permite enviar mensajes SMS al emulador.

 vm: control de la máquina virtual Dalvik.

 window: configuración del skin del emulador.

 

Dalvik Debug Monitor

El emulador incluye una potente herramienta llamada Dalvik Debug Monitor, que será de gran ayuda para testear las aplicaciones. Esta aplicación  permite hacer un seguimiento de los puertos utilizados, ver mensajes de log, información acerca de los procesos en ejecución, gestión de memoria, eventos entrantes como llamadas y SMS, así como otras muchísimas opciones orientados a la depuración. 

Para utilizarla, debe ser lanzado en primer lugar un emulador. Entonces, en la carpeta“Tools” se debe ejecutar un fichero de nombre “ddms.exe”.

 

 Instalación de Eclipse con el SDK de Android

 

En este apartado se exponen los pasos necesarios para empezar a  desarrollar y a entender aplicaciones para Android. Las instrucciones de instalación aquí descritas se basan en el sistema operativo Windows XP o Windows Vista, y en el entorno de desarrollo Eclipse Classic versión 3.4, conocida como Ganymede. Aunque esta guía de instalación no los contempla, el SDK de Android también puede correr  en otros sistemas operativos como Mac OS X o Linux (verificado para Ubuntu 6.06 LTS).

 

Descargar el SDK de Android

Android es una plataforma de software libre, por lo que cuenta con un SDK disponible para todo desarrollador que lo desee que incluye, entre otros elementos, el conjunto completo de API que este sistema soporta. Para descargarlo, basta con visitar la web de Android [32] y asegurarse de acceder a la última versión publicada (durante la redacción de estas líneas, la última versión es la 1.0 de septiembre de 2008). 

Una vez descargado el SDK, es necesario descomprimirlo. La ubicación de los ficheros resultantes no es relevante, pero conviene recordar la ruta para pasos posteriores. 

 

Descargar Eclipse Ganymede

La descarga de Eclipse no es muy diferente al SDK de Android. La web de Eclipse [33]

ofrece multitud de versiones de este entorno de desarrollo según las necesidades del desarrollador. En este caso, es suficiente con obtener la versión 3.4, denominada Ganymede. 

Finalizada la descarga, no se realiza ningún proceso de instalación; simplemente se debe descomprimir los ficheros y pulsar el ejecutable para abrir la aplicación. La primera vez que se inicie Eclipse, pide al usuario una localización para el workspace, donde se ubicarán por defecto todos los proyectos desarrollados.

3.10.3 Instalar el plug-in de Android 

 

El siguiente paso consisten en instalar un  plug-in específico de Android para laplataforma Eclipse. Esta herramienta, llamada ADT (Android Development Tools), facilita enormemente la creación de proyectos, su implementación, depuración y ejecución, por lo que es altamente recomendable si se quiere trabajar con Android. 

 

 

 

 

Para instalar el  plug-in ADT en Eclipse Ganymede, es necesario seguir las siguientes

indicaciones:

1. Iniciar Eclipse 

2. Seleccionar la pestaña Help >  Software Updates. Esta acción abrirá una nueva ventana llamada Software Updates and Add-ons.

3. Pinchar en la pestaña Available Software y pulsar el botón Add Site.

4. Introducir la siguiente URL y pulsar OK:

https://dl-ssl.google.com/android/eclipse/

5. Volviendo a la ventana  Software Updates and Add-ons, marcar la casilla correspondiente a Developer Tools y pulsar el botón Install. Se abrirá una nueva ventana.

6. Cerciorarse de que las opciones  Android Developer Tools y  Android Editors están marcadas y pulsar el botón Finish.

 

El proceso de instalación dará comienzo y puede llevar algunos minutos. Con el fin de que los cambios tengan efecto, es necesario reiniciar Eclipse. 

 

Referenciar el SDK de Android

Tras abrir de nuevo Eclipse, debe indicarse en las preferencias de Eclipse la localización del SDK a utilizar para los proyectos de Android:

1. Seleccionar la pestaña Window > Preferences, lo que abrirá una nueva ventana.

2. Elegir Android en el panel izquierdo.

3. Pulsar el botón Browse e indicar la ruta del SDK de Android.

4. Pulsar el botón Apply y después OK.

 

Actualizaciones del plug-in

Es posible que con el tiempo haya disponible una nueva versión del ADT correspondiente a la versión del SDK de Android instalado. Para comprobar las posibles actualizaciones a través de Eclipse, se debe realizar lo siguiente:

1. Iniciar Eclipse.

2. Seleccionar la pestaña Help >  Software Updates. Esta acción abrirá una nueva ventana llamada Software Updates and Add-ons.

3. Elegir la pestaña Installed Software.

4. Pulsar el botón Update.

5. Si existe alguna actualización para el ADT, seleccionarla  y pulsar el botón finish

 

Primera aplicación en Android: “Hola Mundo”

La mejor forma de empezar a comprender las características de cualquier nuevo sistema o entorno de desarrollo es mediante la creación de un ejemplo sencillo. En este caso, y

como viene siendo habitual, se creará una aplicación que mostrará por pantalla el mensaje “Hola Mundo”.

Además de ilustrar el funcionamiento de  Android, se podrá comprobar la utilidad de disponer de una herramienta como el ADT para Eclipse y se explicarán los elementos que componen un proyecto para Android. 

 

Crear un nuevo proyecto

La creación de un nuevo proyecto de Android no representa mayor dificultad que crear cualquier otro tipo de proyecto en Eclipse. Una vez abierto este entorno de desarrollo, deben realizarse los siguientes pasos:

 

1. Crear el proyecto

Seleccionar la pestaña File > New > Project, y en el menú resultante desplegar la opción Android y elegir Android Project. Pulsar el botón Next.

2. Especificar las propiedades

A continuación se muestra una ventana donde es necesario detallar  algunas propiedades del proyecto. En concreto, se precisa asignar un valor para:

 Project name: es el nombre del proyecto. En la práctica, será el nombre que reciba la carpeta donde se guardará todo lo relativo al presente  proyecto, dentro del workspace. Por ejemplo, “HolaMundo”.

 Package name: el nombre del paquete bajo el cual será desarrollado todo el código. Por ejemplo, se le puede asignar el valor “com.android.hola”.

 Activity name: es el nombre de la clase Activity que será creada de forma automática por el  plug-in. Esta clase  Activity simplemente es una clase ejecutable, capaz de realizar alguna tarea, y es imprescindible en la mayoría de las aplicaciones para Android. Por ejemplo, póngase el nombre

“HolaMundo”.

 Application name: el nombre de la aplicación que se va a desarrollar.

Constituye el nombre visible para el usuario del dispositivo móvil. Por ejemplo, “Saludo al Mundo”.

Tras pulsar el botón Finish, Eclipse mostrará en el explorador de paquetes los elementos que conforman el actual proyecto.

 

 

Ejecutar la aplicación

Antes de lanzar y probar la aplicación, debe crearse una configuración específica para la ejecución. En esta configuración se debe indicar el proyecto a ejecutar, la Activity que iniciará la ejecución, las opciones del emulador y otros valores opcionales. 

 

1. Seleccione la pestaña Run > Run Configurations. Se abrirá una nueva ventana.

2. En el panel de la izquierda, hay que localizar Android Application y pulsar elicono con la leyenda New launch configuration.

3. Asignar un nombre para esta configuración. Por ejemplo, “Hola Mundo Conf”.

4. En la etiqueta  Android, pulsar el botón  Browse para localizar el proyecto

“HolaMundo” y seleccionar la opción  Launch para localizar la actividad “com.android.hola.HolaMundo”.

5. Pulsar el botón Run.

Esto lanzará el emulador de Android. La primera vez que se lanza, puede tardar unos segundos en arrancar. Es recomendable no cerrar el emulador mientras se esté editando y probando un proyecto, para evitar así tener que repetir siempre el proceso de carga.

Si se muestra un error parecido a “Cannot create data directory”, es necesario acudir a Run Configurations > pestaña  Target, y buscar el campo  Additional Emulator Command Line Optiones. En dicho campo, introducir la orden “-datadir C:\” si, por ejemplo, se desea crear los ficheros imagen del emulador en el directorio C:\

 

 Contenido de un proyecto Android

Al crear un proyecto Android, en el workspace de Eclipse se genera una nueva carpeta con el nombre de dicho proyecto. Esta carpeta contiene una serie de  subcarpetas y de ficheros que constituyen la anatomía completa de un proyecto Android.

 

Carpeta \src

Carpeta que contiene los archivos fuente .java del proyecto. Utiliza la misma jerarquía de carpetas que la indicada por el nombre del paquete que se haya  asignado

 

Carpeta \res

La carpeta “\res” alberga los recursos utilizados en el proyecto. Por recurso se entiende cualquier fichero externo que contenga datos o descripciones referentes a la aplicación, y que debe ser compilado junto a los ficheros fuente. Esta compilación  permite al recurso ser accedido de forma más rápida y eficiente.

Android contempla muchos tipos de recursos, como XML, JPEG o PNG, entre otros. En la mayoría de los casos, un recurso constituye (o viene acompañado de) un fichero XML que lo describe y/o configura. Por ejemplo, un caso típico de recurso en Android son las traducciones de una aplicación a distintos idiomas. A pesar de ser cadenas de texto, se representan como recurso a través de un documento XML. 

 

Cada uno de los recursos utilizados en una aplicación para Android ha de estarlocalizado en la carpeta adecuada, en función de su naturaleza. De esta forma, dentro de la carpeta de recursos “\res” se pueden encontrar las siguientes subcarpetas:

 

 

 \anim: aquí se ubican aquellos ficheros XML que describen una animación para un determinado elemento. Las animaciones son movimientos y efectos gráficos básicos.

 

 

fuente:  http://e-archivo.uc3m.es/bitstream/10016/6506/1/PFC_Jaime_Aranaz_Tudela_2010116132629.pdf