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
fundadaporMigueldeIcaza,patrocinadoradeMono)permitecrear,depuraryempaquetarunaaplicacinenun
.apkyutilizarladirectamenteenuntelfonoAndroid.Adiferenciadeotrosproductos,MonoforAndroidpermite
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
desarrollandoutilizandoJavaconlaayudadelAndroid DeveloperTools,queeslamezcladelasherramientasde
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)yluegosedebesaberprogramarenJavaqueesellenguajedetrabajonativodela
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.
MonoforAndroid,intentaunacercamientodiferente.BsicamenteintentasustituirJavaporC#,dejandoelresto
deloscomponentesintactos,deformatalquelainterfazdeusuario(UI)sediseedeigualmaneraylaaplicacin
desarrollada se integre al ecosistema Android como si fuese desarrollada propiamente en Java. Adems, las
herramientasdedesarrolloseintegranconVisualStudio,brindndoleaundesarrollador.NET,lagranventajade
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. DesarrolloMultiplataforma
2. Reutilizacindebibliotecasdecdigoexistentes
3. Interfazdeusuarionativayrendimientonativo
DesarrollandoaplicacionesnativasparaAndroidconC#

2|P g i n a

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
deXamarin,empresafundadaporMigueldeIcaza,sebrindaunasolucinintegral(IDE+Plataforma)queposibilita
la creacin de aplicaciones para iOS, Android, Mac, Linux y Windows ya que cuenta con versiones de Mono as
comoloscompiladoresylasherramientasdedesarrollonecesariasparaconvertirdeC#/.NETalcdigonativoque
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
aplicacinunasolavezydesarrollarparacadaplataformasloelcdigoespecficoqueserequiera.Deestaforma
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),yresaltelrendimientodelaplataforma,laposibilidaddecreacindeuna
interfaz de usuario (UI) completamente nativa y la facilidad de acceso a las caractersticas nativas de los
dispositivos.
ARQUITECTURADEMONOFORANDROID
Mono es la implementacinde cdigo abierto (open source) de la plataforma .NET sobre Windows y Linux. En el
casodeAndroid,MonoejecutasobreelKerneldeLinux,alapardeDalvik,queeslamquinavirtualdeJavaque
soportatodoelecosistemaAndroid.Lointeresanteenestecaso(Figura1)eslacoexistenciadeMonoconDalvik.
PrimeramentehayquedestacarlosAndroidCallableWrappers(ACW)queempaquetanlafuncionalidaddeDalvik
y la hacedisponible como parte de la APIde Mono, deforma tal queuna aplicacin escrita en C#pueda realizar
llamadasacomponentesescritosenJavaqueejecutenenDalvik.Demanerainversa,estnlosManagedCallable
Wrappers que son proxies generados en Java que le permiten a las aplicaciones ejecutando en Dalvik, poder
DesarrollandoaplicacionesnativasparaAndroidconC#

3|P g i n a

accederaloscomponentesdesarrolladosen.NETqueejecutanenMono.Graciasaestacoexistencia,aplicaciones
nativasdesarrolladasenJavapuedeninteractuarconlasdesarrolladasen.NETdemaneranaturalaniveldeAPI.

FIGURA1ARQUITECTURADEMONOFORANDROID.TOMADODELSITIODEXAMARIN.
Demaneraexperimental,XamarinportelcdigodeAndroid,deJavaaC#,eliminandoladependenciaconDalvik
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
comoXamarinStudioysepuedeutilizarindistintamentetantounocomoelotro,yaqueMonoDevelop,enelcual
sebasaXamarinStudio,utilizaelmismoformato(.slny.csproj)queVisualStudio.
DesarrollandoaplicacionesnativasparaAndroidconC#

4|P g i n a

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.
DesarrollandoaplicacionesnativasparaAndroidconC#

5|P g i n a

FIGURA3NUEVOPROYECTODEANDROIDUTILIZANDOXAMARINSTUDIO
ExistendiferentestiposdeproyectosdeAndroid.EstostiposdeproyectosestndisponiblestantodesdeXamarin
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.
AndroidClassLibrary:EselequivalentealproyectoClassLibraryde.NETloqueutilizandolasreferencias
deMonoforAndroid.
Java Binding Library: Proyecto que permite importar un .jar de Java al ecosistema .NET. Similar a los
Wrappersqueen.NetselehacenalosobjetosCOM,peroenestecasosonobjetosJava.tilporejemplo
parareferenciarcomponentescomoGoogleMapslibraryqueestndisponiblessoloparaJava.
DesarrollandoaplicacionesnativasparaAndroidconC#

6|P g i n a

FIGURA4NUEVOPROYECTODEANDROIDUTILIZANDOVISUALSTUDIO2012
EnelcasodelaplantillaAndroidApplication,elproyectoquesegeneraseorganizaigualacomosehaceenJava.
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 obtenerde cualquier
documentacinorientadaaJavayelcdigoAXML(lenguajeXMLenqueseespecificalaUIenAndroid)sepuede
reutilizarindistintamente.
TantoXamarinStudio(Figura5)comoVisualStudio(Figura6)cuentanconlasmismasherramientasdedesarrollo.
Es posible disear una interfaz de usuario grficamente arrastrando controles desde la barra de herramienta y
asignndoleaccionesaloseventos(OnClickporejemplo)quecadacomponentedefine.

DesarrollandoaplicacionesnativasparaAndroidconC#

7|P g i n a

FIGURA5APLICACINDEEJEMPLOENXAMARINSTUDIO.SEMUESTRAELDISEADORGRFICODELAINTERFAZDEUSUARIO
El cdigo del Layout (Interfaz de Usuario) de la aplicacin de ejemplo, se muestra en el Listado 1. Aquellos que
hayantrabajadoconXAML/WPFen.NETnotarnciertasemejanzaconelAXMLdeAndroidparadefinirlainterfaz
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
pantallavisibleesunActivity.ElActivityesquienensamblaelfuncionamientoconlavista(Layout)yseescribeen
cdigoC#(Listado2).
DesarrollandoaplicacionesnativasparaAndroidconC#

8|P g i n a

FIGURA6APLICACINDEEJEMPLOENVISUALSTUDIO.SEMUESTRAELDISEADORGRFICODELAINTERFAZDEUSUARIO
Como se puede observar, en C# un Activity hereda de la clase Activity e implementa al menos el mtodo
OnCreatequeseejecutacadavezqueselanceelActivity.AquseutilizaelmtodoSetContentViewparaasociar
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
DesarrollandoaplicacionesnativasparaAndroidconC#

9|P g i n a

El Activity principal, aquel que se lanza por primera vez cuando se carga la aplicacin de Android, se identifica
utilizandoelparmetroMainLauncherdelatributo[Activity]conquesedecoralaclase.
EsinteresantenotarcmoelcdigodelActivitysebeneficiadelascaractersticasdellenguajeC#ylaplataforma
.NET. Los desarrolladores de Xamarin han realizado un buen trabajo incorporando, ya que no han portado
directamenteelcdigodeJavaaC#,sinoquehanmejoradolasintaxisutilizandocaractersticascomodelegados,
genericidadypropiedades.
Enjava,elcdigoequivalentealalocalizacindelbotnylaasignacindelclickseraelsiguiente:
final But t on myBut t on = ( But t on) f i ndVi ewByI d( R. i d. myBut t on) ;
myBut t on. set OnCl i ckLi st ener ( new OnCl i ckLi st ener ( ) {
@Over r i de
public void onCl i ck( Vi ew ar g0)
{
myBut t on. set Text ( St r i ng. format( " {0} cl i cks! " , 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.
DesarrollandoaplicacionesnativasparaAndroidconC#

10|P g i n a

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 XamarinStudio oVisual Studio, sepueden 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.

También podría gustarte