Está en la página 1de 10

DESARROLLANDOAPLICACIONESNATIVASPARA ANDROIDCONC#

AlejandroTamayoCastillo

RESUMEN
En esta entrega se mostrar la utilizacin de Mono for Android, componente que permite el desarrollo de aplicaciones para Android utilizando C# y Visual Studio. Mono for Android, desarrollado por Xamarin (compaa fundada por Miguel de Icaza, patrocinadora de Mono) permite crear, depurar y empaquetar una aplicacin en un .apk y utilizarla directamente en un telfono Android. A diferencia de otros productos, Mono for Android permite el desarrollo de aplicaciones nativas, significando que se integra al ecosistema Android e interacta con las aplicaciones nativas creadas en Java, utiliza la interfaz (UI) nativa del sistema operativo y sigue el modelo de desarrollodeAndroid.

INTRODUCCIN
Android es un popular sistema operativo basado en Linux que ejecuta tanto en telfonos como en tabletas. El kernel, siendo Linux, est desarrollado en C++, pero el corazn de Android es una implementacin de mquina virtual de Java llamada Dalvik, creada por Google. Por tanto, todas las aplicaciones (Userland) se han venido desarrollando utilizando Java con la ayuda del Android Developer Tools, que es la mezcla de las herramientas de desarrollo de Android (SDK) junto a una personalizacin del IDE Eclipse. El Android Developer Tools se puede obtenergratuitamentedesdehttp://developer.android.com/tools/. Para desarrollar una aplicacin para Android, se debe conocer, primero, el ecosistema android (arquitectura, restricciones, funcionamiento) y luego se debe saber programar en Java que es el lenguaje de trabajo nativo de la plataforma. Existen otras alternativas para el desarrollo, como PhoneGap (http://phonegap.com/download), que utilizanHTML5paraeldiseodelainterfazdeusuario(UI)yJavaScriptcomolenguajededesarrollo,perotienenla desventaja de que al ser aplicaciones HTML5 que ejecutan en un entorno controlado (sandbox), el acceso a las caractersticas nativas del dispositivo es limitado y la experiencia de usuario en cuanto a interfaz (UI) no es la mismaqueladeunaaplicacinnativa. Mono for Android, intenta un acercamiento diferente. Bsicamente intenta sustituir Java por C#, dejando el resto de los componentes intactos, de forma tal que la interfaz de usuario (UI) se disee de igual manera y la aplicacin desarrollada se integre al ecosistema Android como si fuese desarrollada propiamente en Java. Adems, las herramientas de desarrollo se integran con Visual Studio, brindndole a un desarrollador .NET, la gran ventaja de desarrollar una aplicacin Android sin salirse del entorno de desarrollo conocido y utilizando el lenguaje C# que domina.Sepuedeobtenerdesdehttp://xamarin.com/download.

LAAPUESTAPOR.NETYC#
Si bien es atractivo programar para Android en C#, existen tres razones adicionales por lo cual es conveniente apostarpor.NETyC#paraeldesarrollodeaplicacionesmviles: 1. 2. 3. DesarrolloMultiplataforma Reutilizacindebibliotecasdecdigoexistentes Interfazdeusuarionativayrendimientonativo

DesarrollandoaplicacionesnativasparaAndroidconC# El mercado de dispositivos mviles est dominado fundamentalmente por tres plataformas: Android de Google, iOSdeAppleyWindowsPhonedeMicrosoft,queapesardeserminoritariomuestraundiscretocrecimiento.Para hacer una aplicacin que ejecute en estas plataformas de manera nativa, habra que programar en lenguajes y herramientas de desarrollo diferentes: Java en Android, ObjectiveC en iOS y C# en Windows Phone. Para una empresa esto puede significar un reto, ya que tendra que mantener y darle soporte a tres cdigos fuentes diferentes, triplicando los esfuerzos. Es por ello que las alternativas multiplataforma (como PhoneGap o AppceleratorTitanium)hancobradofuerzayaqueayudanaabaratarloscostosysimplificarelesfuerzo.Enelcaso de Xamarin, empresa fundada por Miguel de Icaza, se brinda una solucin integral (IDE+Plataforma) que posibilita la creacin de aplicaciones para iOS, Android, Mac, Linux y Windows ya que cuenta con versiones de Mono as como los compiladores y lasherramientasde desarrollo necesarias para convertir deC#/.NET al cdigo nativo que ejecutaencadaunadeestasplataformas. Contar con C# y .NET nos permite reutilizar las bibliotecas de cdigo existentes que se hayan desarrollado previamente (incluso para otras aplicaciones .NET) y explotar los algoritmos escritos en C# por la comunidad. Utilizando la caracterstica Portable Class Library (PCL) de .NET, es posible incluso desarrollar la lgica de la aplicacinunasola vezy desarrollar para cadaplataformaslo elcdigoespecfico quese requiera.De esta forma sesimplificaelmantenimientodelaaplicacin. Al obtener un resultado que compila directamente e interacta con las caractersticas nativas del dispositivo, se obtienen beneficios de rendimiento con respecto a las aplicaciones HTML5 que requieren capas de abstraccin mscomplejasparasuejecucin.Adems,laexperienciadeusuario(UI)semantieneintacta,yaqueseutilizanlos mismoscomponentesnativosdelaplataformaparaeldesarrollodelainterfazdeusuario. Para valorar la apuesta por .NET/C#, tambin hay que tener en cuenta que las herramientas de desarrollo que brindaXamarintienenuncarctercomercial,yelcostodelalicenciavaraentre$299y$999endependenciadesi es una licencia individual o empresarial. Existe tambin una variante gratuita limitada a 32Kb de cdigo IL y una licencia un 90% ms barata para propsitos acadmicos ($99 la versin empresarial que es la ms completa e incluyelaintegracinconVisualStudio).Porotrapartehayquetenerencuentaquelaaplicacincompilada(enel casodeAndroid,un.apk)contendrelcdigoILquesecompilarJustInTime(JIT)alejecutarlaaplicacin,porlo quesegastarunpocomsdememoria(tantoenespacioendiscocomoenRAM)parapodersoportarelproceso de compilacin JIT. Finalmente, hay que decir que las herramientas de Xamarin se actualizan unos meses (23) despus que sale la versin del sistema operativo y las herramientas de desarrollo nativas, que es un tiempo relativamenterpidoenqueseincorporanlasnuevascaractersticasalaplataformaMono. Recientemente Gartner reconoci a Xamarin como Visionaria en el campo del desarrollo de aplicaciones mviles (http://blog.xamarin.com/gartnermq), y resalt el rendimiento de la plataforma, la posibilidad de creacin de una interfaz de usuario (UI) completamente nativa y la facilidad de acceso a las caractersticas nativas de los dispositivos.

ARQUITECTURADEMONOFORANDROID
Mono es la implementacin de cdigo abierto (open source) de la plataforma .NET sobre Windows y Linux. En el caso de Android, Mono ejecuta sobre el Kernel de Linux, a la par de Dalvik, que es la mquina virtual de Java que soporta todo el ecosistema Android. Lo interesante en este caso (Figura 1) es la coexistencia de Mono con Dalvik. Primeramente hay que destacar los Android Callable Wrappers (ACW) que empaquetan la funcionalidad de Dalvik y la hace disponible como parte de la API de Mono, de forma tal que una aplicacin escrita en C# pueda realizar llamadas a componentes escritos en Java que ejecuten en Dalvik. De manera inversa, estn los Managed Callable Wrappers que son proxies generados en Java que le permiten a las aplicaciones ejecutando en Dalvik, poder 2 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC# acceder a los componentes desarrollados en .NETque ejecutan enMono. Gracias a esta coexistencia, aplicaciones nativasdesarrolladasenJavapuedeninteractuarconlasdesarrolladasen.NETdemaneranaturalaniveldeAPI.

FIGURA1ARQUITECTURADEMONOFORANDROID.TOMADODELSITIODEXAMARIN.

De manera experimental, Xamarin port elcdigo deAndroid,de Java aC#, eliminando la dependencia conDalvik y logrando un Android 100% en C# (proyecto XobotOS). Como resultado se obtuvo un incremento notable en el rendimiento del sistema. Este resultado se le atribuye a caractersticas nicas que tiene la plataforma .NET con respecto a Java, tales como la genericidad real, el uso de structs y las llamadas P/Invoke. La herramienta de conversin de cdigo de Java a C#, desarrollada por Xamarin para este experimento, le permite a esta compaa mejorarMonoforAndroidentantosepuedanireliminandolasdependenciasconDalvikposibilitandolaejecucin directadelcdigosobreelKerneldeLinux.

MIPRIMERAAPLICACINCONXAMARINSTUDIOOVISUALSTUDIO
ParaempezaradesarrollaraplicacionesparaAndroidtenemosdosposiblesentornosdedesarrollo(IDE): XamarinStudio4 VisualStudio2010/2012

XamarinStudioesunaversinpersonalizadaparadesarrollomvildeMonoDevelop,queeselIDEoficialdeMono. Mono for Android, cuenta con una extensin para Visual Studio 2010/2012 que habilita la compilacin y la depuracindeaplicacionesAndroid.Lointeresanteesqueelmismoproyecto/solucinsirvetantoenVisualStudio como Xamarin Studio y se puede utilizar indistintamente tanto uno como el otro, ya que MonoDevelop, en el cual sebasaXamarinStudio,utilizaelmismoformato(.slny.csproj)queVisualStudio.

3 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#

FIGURA2ANDROIDSDKMANAGER.SEMUESTRASOMBREADOLAIMAGENDEANDROID4.2.2COMPATIBLECONLAARQUITECTURAX86DE INTEL

Antesdeempezar,setienequetenerinstaladoelAndroidSDKyunamquinavirtualconAndroidqueesdondese probar y depurar la aplicacin. Utilizando el Android SDK Manager (Figura 2) se pueden descargar de Internet las imgenes (mquinas virtuales) de Android tanto para ARM como para x86. El desarrollo para Android debe realizarse sobre un procesador Intel con Virtualization Technology (VTx) e instalar el componente Intel HAXM, quepermitirlaejecucinnativadeAndroidenelPC.EncasodequesetengaunprocesadorAMDoseutiliceuna imagen de Android con arquitectura ARM, la ejecucin y depuracin de la aplicacin ser un poco tortuosa producto de la lentitud de conversin de instrucciones ARM a x86 o la carencia de VTx. En tal caso (AMD) se recomienda el uso de VirtualBox con una imagen x86 de Android conectada a travs de la red utilizando adb. A pesardequeestavarianteesunhackysepierdelaintegracinconelIDE,espreferibleproductodelagananciaen velocidad. Aquellos que no estn familiarizados con un entorno de desarrollo para Android, pueden descargar el Xamarin Installer desde el sitio web oficial de Xamarin, y ste se encargar de bajar de internet todos los componentes necesarios,instalarlosyconfigurarlos,dejandolistalaPCparaempezaradesarrollar.

4 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#

FIGURA3NUEVOPROYECTODEANDROIDUTILIZANDOXAMARINSTUDIO

Existen diferentes tipos de proyectos de Android. Estos tipos de proyectos estn disponibles tanto desde Xamarin Studio(Figura3)comodesdeVisualStudio2012(Figura4): Android Application (incluyendo las versiones para Tablets, HC y ICS): Es la plantilla de proyectos predeterminada. Permite crear una aplicacin de Android con interfaz de usuario (UI) y genera manera predeterminadaunActivitydeejemplo. Android OpenGL Application: Permite crear una aplicacin OpenGL para Android. Usualmente Juegos y multimedias. Android Class Library: Es el equivalente al proyecto Class Library de .NET lo que utilizando las referencias deMonoforAndroid. Java Binding Library: Proyecto que permite importar un .jar de Java al ecosistema .NET. Similar a los Wrappersqueen.NetselehacenalosobjetosCOM,peroenestecasosonobjetosJava.tilporejemplo parareferenciarcomponentescomoGoogleMapslibraryqueestndisponiblessoloparaJava.

5 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#

FIGURA4NUEVOPROYECTODEANDROIDUTILIZANDOVISUALSTUDIO2012

En elcaso de la plantilla Android Application,el proyecto que segenera se organiza igual acomo se hace en Java. De hecho, se respetan los convenios propuestos por Android en cuanto a nombre de carpetas y elementos a almacenar. Existen dos carpetas importantes, Assets y Resources. En la carpeta Assets se almacena cualquier fichero que se quiera tener disponible como recurso (un fichero html, texto, un binario, etc). En la carpeta Resources, se almacenan recursos especializados, que pueden ser Layouts (interfaz grfica UI), Drawables (imgenes)yValues(recursosdetexto).EstosaspectossonespecficosdeAndroid. Lo interesante de esta organizacin es que Mono no reinventa los componentes de UI ni la disposicin del proyecto, por lo que el conocimiento de cmo disear una interfaz para Android, se puede obtener de cualquier documentacin orientada a Java y el cdigo AXML (lenguaje XML en que se especifica la UI en Android) se puede reutilizarindistintamente. Tanto Xamarin Studio (Figura 5) comoVisual Studio (Figura 6) cuentancon las mismas herramientasde desarrollo. Es posible disear una interfaz de usuario grficamente arrastrando controles desde la barra de herramienta y asignndoleaccionesaloseventos(OnClickporejemplo)quecadacomponentedefine.

6 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#

FIGURA5APLICACINDEEJEMPLOENXAMARINSTUDIO.SEMUESTRAELDISEADORGRFICODELAINTERFAZDEUSUARIO

El cdigo del Layout (Interfaz de Usuario) de la aplicacin de ejemplo, se muestra en el Listado 1. Aquellos que hayan trabajado conXAML/WPF en .NETnotarn cierta semejanzaconel AXMLde Android paradefinir la interfaz de usuario. En este caso, se define un LinearLayout de raz, que es un esquema que posiciona los controles interiores de forma lineal con orientacin horizontal o vertical segn se especifique. Los controles anidados, en este caso el Button, pueden definir el ajuste de ancho y alto con respecto al layout padre utilizando las propiedadeslayout_widthylayout_height.
<?xmlversion="1.0"encoding="utf8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/MyButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/Hello"/> </LinearLayout>
LISTADO1LAYOUTQUEMUESTRAUNBOTNCONELTEXTOHELLOWORLD,CLICKME!

Hay que resaltar que existe una separacin entre el diseo de la interfaz y la funcionalidad. En el AXML slo se define la forma. Android sigue una filosofa ModeloVistaControlador (MVC) que potencia la separacin de responsabilidades (SoC). En este caso, el Layout sera la Vista y el controlador sera el Activity. En Android, cada pantalla visible es un Activity. El Activity es quien ensambla el funcionamiento con la vista (Layout) y se escribe en cdigoC#(Listado2). 7 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#

FIGURA6APLICACINDEEJEMPLOENVISUALSTUDIO.SEMUESTRAELDISEADORGRFICODELAINTERFAZDEUSUARIO

Como se puede observar, en C# un Activity hereda de la clase Activity e implementa al menos el mtodo OnCreate que se ejecuta cada vez que se lance el Activity. Aqu se utiliza el mtodo SetContentView para asociar lavista,queenestecasoseligaconelLayoutMain.axmlyluegoselocalizanloscontrolesdadosuIDyseleasocia funcionalidadmedianteundelegado.
[Activity(Label="Borrar",MainLauncher=true,Icon="@drawable/icon")] publicclassActivity1:Activity { intcount=1; protectedoverridevoidOnCreate(Bundlebundle) { base.OnCreate(bundle); //Setourviewfromthe"main"layoutresource SetContentView(Resource.Layout.Main); //Getourbuttonfromthelayoutresource, //andattachaneventtoit Buttonbutton=FindViewById<Button>(Resource.Id.MyButton); button.Click+=delegate{button.Text=string.Format("{0}clicks!",count++);}; } }
LISTADO2CDIGOFUENTEENC#DEUNACTIVITY

8 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC# El Activity principal, aquel que se lanza por primera vez cuando se carga la aplicacin de Android, se identifica utilizandoelparmetroMainLauncherdelatributo[Activity]conquesedecoralaclase. Es interesante notar cmo el cdigo del Activity se beneficia de las caractersticas del lenguaje C# y la plataforma .NET. Los desarrolladores de Xamarin han realizado un buen trabajo incorporando, ya que no han portado directamente el cdigo de Java a C#, sino que han mejorado la sintaxis utilizando caractersticas como delegados, genericidadypropiedades. Enjava,elcdigoequivalentealalocalizacindelbotnylaasignacindelclickseraelsiguiente: final Button myButton = (Button)findViewById(R.id.myButton); myButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { myButton.setText(String.format("{0} clicks!", count++)); } }); Comosepuedeobservar,loscast(Button)sereemplazaronporgenericidad<Button>,losListenersdeJavapor eventosdeC#yelaccesor.setTextdeltipoButtonseremplazporlapropiedadText,haciendoelcdigoms legible y corto. Adicionalmente se reescribi la API para cumplir convenios de calidad de cdigo (por ejemplo, findViewByIdsellevaFindViewByIdparaseguirelconvenidodelamaysculaenmtodos).

FIGURA7DEPURANDOLAAPLICACINDEANDROIDENVISUALSTUDIO

Unodelosaspectosmsinteresanteseslaposibilidaddedepurarlaaplicacinypoderaccederalosvaloresdelas variables(Figura1).Estoessignificativo,yaquelaejecucindelaaplicacinestsucediendodentrodelamquina virtualdeAndroidenelemulador. 9 | P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#

CONCLUSIONES
JavaisnottheonlywaytobuildnativeappsonAndroid.Infact,itsnoteventhebestway MigueldeIcaza La combinacin de C# y .NET, gracias a los esfuerzos invertidos en el proyecto Mono, ha llegado a otras plataformas como Linux, Mac y ahora, en un mbito mvil, hasta iOS y Android. Con la fundacin de Xamarin, Mono se ha convertido en una plataforma de clase empresarial, que cuenta con un amplio soporte y una abundante documentacin. Desde http://docs.xamarin.com se puede acceder a tutoriales, guas y ejemplos que facilitaneldesarrollodeaplicacionestantoparaiOScomoparaAndroidutilizandoC#y.NET. Utilizando ya sea Xamarin Studio o Visual Studio, se pueden desarrollar, depurar y empaquetar aplicaciones, que ejecutarndemaneranativaconunrendimientonotableenestasplataformasmviles. En una prxima entrega, veremos cmo crear una aplicacin multiplataforma en C#/.NET que ejecute en diferentesplataformas,utilizandotecnologaXamarin.

10|P g i n a