Você está na página 1de 11

See

discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/257365979

Desarrollando aplicaciones nativas para Android


con CSharp

Article October 2013

CITATIONS READS

0 19,708

1 author:

Alejandro Tamayo
University of Havana
15 PUBLICATIONS 5 CITATIONS

SEE PROFILE

All content following this page was uploaded by Alejandro Tamayo on 17 February 2017.

The user has requested enhancement of the downloaded file.


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
desarrollandoutilizandoJavaconlaayudadelAndroidDeveloperTools,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.Existenotrasalternativasparaeldesarrollo,comoPhoneGap(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 aplicacinAndroid sin salirse del entorno de desarrollo conocidoyutilizando el lenguajeC#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#

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.

Alobtenerunresultadoquecompiladirectamenteeinteractaconlascaractersticasnativasdeldispositivo,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
esunalicenciaindividualoempresarial.Existetambinunavariantegratuitalimitadaa32KbdecdigoILyuna
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.

RecientementeGartnerreconociaXamarincomoVisionariaenelcampodeldesarrollodeaplicacionesmviles
(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
Monoeslaimplementacindecdigoabierto(opensource)delaplataforma.NETsobreWindowsyLinux.Enel
casodeAndroid,MonoejecutasobreelKerneldeLinux,alapardeDalvik,queeslamquinavirtualdeJavaque
soportatodoelecosistemaAndroid.Lointeresanteenestecaso(Figura1)eslacoexistenciadeMonoconDalvik.
PrimeramentehayquedestacarlosAndroidCallableWrappers(ACW)queempaquetanlafuncionalidaddeDalvik
ylahacedisponiblecomopartedelaAPIdeMono,deformatalqueunaaplicacinescritaenC#puedarealizar
llamadasacomponentesescritosenJavaqueejecutenenDalvik.Demanerainversa,estnlosManagedCallable
Wrappers que son proxies generados en Java que le permiten a las aplicaciones ejecutando en Dalvik, poder

2|P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#

accederaloscomponentesdesarrolladosen.NETqueejecutanenMono.Graciasaestacoexistencia,aplicaciones
nativasdesarrolladasenJavapuedeninteractuarconlasdesarrolladasen.NETdemaneranaturalaniveldeAPI.


FIGURA1ARQUITECTURADEMONOFORANDROID.TOMADODELSITIODEXAMARIN.

Demaneraexperimental,XamarinportelcdigodeAndroid,deJavaaC#,eliminandoladependenciaconDalvik
ylograndounAndroid100%enC#(proyectoXobotOS).Comoresultadoseobtuvounincrementonotableenel
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
conversindecdigodeJavaaC#,desarrolladaporXamarinparaesteexperimento,lepermiteaestacompaa
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.

3|P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#


FIGURA2ANDROIDSDKMANAGER.SEMUESTRASOMBREADOLAIMAGENDEANDROID4.2.2COMPATIBLECONLAARQUITECTURAX86DE
INTEL

Antesdeempezar,setienequetenerinstaladoelAndroidSDKyunamquinavirtualconAndroidqueesdondese
probarydepurarlaaplicacin.UtilizandoelAndroidSDKManager(Figura2)sepuedendescargardeInternet
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
recomiendaelusodeVirtualBoxconunaimagenx86deAndroidconectadaatravsdelaredutilizandoadb.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

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:PermitecrearunaaplicacinOpenGLparaAndroid.UsualmenteJuegosy
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.

5|P g i n a

DesarrollandoaplicacionesnativasparaAndroidconC#


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,porloqueelconocimientodecmodisearunainterfazparaAndroid,sepuedeobtenerdecualquier
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.

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
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 existeuna 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).Enestecaso,elLayoutseralaVistayelcontroladorseraelActivity.EnAndroid,cada
pantallavisibleesunActivity.ElActivityesquienensamblaelfuncionamientoconlavista(Layout)yseescribeen
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
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

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.

EsinteresantenotarcmoelcdigodelActivitysebeneficiadelascaractersticasdellenguajeC#ylaplataforma
.NET. Los desarrolladores de Xamarin han realizado un buen trabajo incorporando, ya que no han portado
directamenteelcdigodeJavaaC#,sinoquehanmejoradolasintaxisutilizandocaractersticascomodelegados,
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.

UtilizandoyaseaXamarinStudiooVisualStudio,sepuedendesarrollar,depuraryempaquetaraplicaciones,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

View publication stats

Você também pode gostar