Desenvolvimento

20 dez, 2017

Plataformas para desenvolvimento de apps móveis – Parte 03: Desenvolvimento Mobile Multiplataforma com Xamarin

Publicidade

Hoje vamos dar sequência à série sobre plataformas para desenvolvimento de apps móveis feita pelos meus alunos da Universidade de Passo Fundo. O primeiro artigo desta série você pode ver aqui.

Por Fábio Dornel e Giordani Antônio Cé

Com a recente expansão, o mercado mobile já supera o mercado de desktops em números. Assim, o mercado de desenvolvimento de aplicativos apresenta-se aquecido. Quando se pensa em desenvolvimento mobile, logo vem à mente os três sistemas operacionais mais utilizados: Android, iOS e Windows Phone. Tendo em vista estas três alternativas, prontamente pensa-se em como ter uma única codificação para atingi-las.

O processo de desenvolvimento de um aplicativo nativo para cada um destes sistemas, ocasiona altos custos financeiros e temporais. Isso ocorre devido ao fato de que cada um dos sistemas utiliza linguagens, ambientes de desenvolvimento e possuem funcionamento distintos.

Como uma alternativa para diminuir custos (tanto financeiros quanto de codificação), tem-se o método de desenvolvimento Cross-platform, que consiste em um código único para várias plataformas. O Xamarin apresenta-se como uma boa opção para este tipo de projeto.

O Xamarin viabiliza a codificação de aplicativos nativos utilizando a linguagem C#, utilizando-se de features disponíveis no C# e no Framework .Net. Além disso, ele contém um ambiente de desenvolvimento integrado, o Visual Studio. Os recursos disponibilizados pela ferramenta permitem compartilhar grande parte do código, principalmente no que refere-se ao código da camada de negócios da aplicação.

1. Xamarin e Mono – História

A plataforma Mono foi criada no início dos anos 2000, por Miguel de Icaza (um dos grandes nomes do mundo GNU/Linux e um dos fundadores do projeto Gnome), para ser uma alternativa multiplataforma ao Framework .Net da Microsoft (MS). O projeto Mono foi desenvolvido originalmente pela empresa Ximian. Em 2004, poucos anos após o início do projeto, a Ximian foi adquirida pela Novell.

Em meados de 2009, a Novell então lançou o Monotouch e o Mono for Android, implementações baseadas no Mono, para desenvolvimento iOS e Android, respectivamente. Os produtos tinham licença comercial. No ano de 2011 a Novell foi adquirida pela Attachmate. Após a aquisição, a Attachmate anunciou uma reformulação e centenas de funcionários foram demitidos. Entre eles, vários desenvolvedores do projeto Mono.

Em 16 de maio de 2011, Miguel de Icaza e Nat Friedman fundaram a Xamarin. Em julho do mesmo ano, a Novell concedeu uma licença perpétua para Mono, MonoTouch e Mono for Android para a Xamarin, que assumiu a administração oficial dos projetos. No início de 2013, a Xamarin adotou uma nova nomenclatura para seus produtos. O MonoTouch passou a chamar-se Xamarin.iOS e o Mono for Android foi intitulado Xamarin.Android.

Em 24 de fevereiro de 2016, a Microsoft anunciou a aquisição da Xamarin. Segundo a imprensa americana, a transação superou os 400 milhões de dólares. Após a aquisição, a Microsoft tornou a ferramenta e seus recursos gratuitos e Open Source.

2. Plataforma Xamarin

A Plataforma Xamarin é o produto principal da empresa. Ela dispõe de um conjunto de ferramentas para desenvolvimento de aplicativos multiplataforma, que permite a criação de aplicativos nativos Android, iOS e Windows utilizando-se a linguagem de programação C#.

Esta plataforma é uma ferramenta única, pois combina toda a capacidade das tecnologias nativas com recursos eficientes próprios. De acordo com Xamarin, os principais recursos são:

  • Associação completa para os SDKs subjacentes: A ferramenta disponibiliza associações para praticamente todas as APIs iOS e Android disponíveis nativamente.
  • Objective-C, Java, C e C++ Interop: A plataforma oferece recursos para invocar diretamente bibliotecas construídas nas linguagens de desenvolvimento nativas das plataformas. Projetos de associação permitem associar facilmente as bibliotecas Objective-C e Java utilizando uma sintaxe declarativa.
  • Construções de linguagem moderna: Os aplicativos são escritos em C#, uma linguagem moderna que inclui aprimoramentos significativos em relação ao Objective-C e a Java, como recursos de linguagem dinâmica, construções funcionais como Lambdas, LINQ, recursos de programação paralela e genéricos sofisticados.
  • BCL (Biblioteca de Classes Base): O Xamarin utiliza a BCL do .NET (coleção de classes) que fornece acesso a muitos recursos, como por exemplo: banco de dados, suporte XML e etc. Ademais, código C# existente pode ser compilado para uso em aplicativos.
  • IDE (Ambiente de desenvolvimento Integrado) moderno: O Xamarin Studio é o ambiente de desenvolvimento integrado para o Mac OS X e o Visual Studio é o ambiente para Windows. Ambos são IDEs modernos que possuem recursos sofisticados.
  • Suporte mobile multi plataforma: Xamarin oferece suporte às três principais plataformas no mercado, Android, iOS e Windows Phone. As aplicações desenvolvidas chegam a compartilhar 90% dos códigos e também fornecem uma API unificada, a Xamarin.Mobile, para acessar recursos comuns às três plataformas.

Esta tecnologia permite desenvolver uma aplicação mobile multiplataforma a partir de duas abordagens. A primeira abordagem será apresentada na seção 3.1. Além disso, permite também desenvolver aplicações desktop para Mac OS e Windows, mas como este artigo trata apenas de desenvolvimento mobile, estes não serão abordados.

2.1 Desenvolvimento – APIs Nativas

Esta abordagem de codificação de aplicativos permite a utilização de todos os componentes disponíveis nas APIs nativas de cada uma das plataformas. Uma solução Xamarin, internamente pode conter quatro projetos:

  • Portable Class Library ou Shared Projects (Estrutura de compartilhamento de código)
  • Xamarin.Android (Projeto Android)
  • Xamarin.IOS (Projeto iOS)
  • Xamarin.Windows (Projeto Windows)

O primeiro projeto refere-se a estrutura de compartilhamento de código que será utilizada na solução. No momento da criação da solução é possível escolher entre Portable Class Library e Shared Projects. As características de cada uma dessas opções serão discutidas a seguir, na seção 4.

Os demais projetos da solução contêm a estrutura que é específica de cada uma das plataformas, ou seja, o código compartilhado estará no primeiro projeto e os demais abrigarão todo o código e recursos que são específicos da plataforma em questão. As regras de negócio, acesso a banco de dados e serviços externos são codificados no projeto compartilhado. A camada de apresentação e interface com o usuário é codificada nos projetos específicos.

A Figura 1 exemplifica o que está sendo discutido.

Estrutura de compartilhamento de código com Xamarin – Fonte: Adaptado de Xamarin Platform

Nesta abordagem o aproveitamento de código pode alcançar 75%, conforme dados da Xamarin. Além disso, as interfaces podem conter qualquer componente exclusivo da plataforma, visto que o compartilhamento ocorre apenas no back-end da aplicação, a interface com o usuário ainda é desenvolvida de forma específica.

2.2 Desenvolvimento – APIs Xamarin

Na seção anterior, foi apresentado em essência o funcionamento do compartilhamento de código em soluções Xamarin. Esta abordagem utiliza a mesma estrutura apresentada anteriormente para compartilhar código. No entanto, acrescenta-se aqui a utilização do Xamarin.Forms.

A Xamarin.Forms, segundo [MOSH, 2016], é um conjunto de ferramentas que permite desenvolver layouts nativos de interface com o usuário, os quais são compartilhados entre as plataformas. A codificação destas interfaces é realizada utilizando XAML, uma linguagem de marcação criada pela própria Xamarin para definir interfaces com o usuário.

Utilizando o Xamarin.Forms, o código da interface com o usuário passa a ser escrito na estrutura compartilhada da solução, o que proporciona ainda mais compartilhamento de código. Conforme dados da Xamarin, utilizando-se esta abordagem, o montante de código compartilhado aproxima-se de 90%. A Figura 2 apresenta em azul o código que é compartilhado.

Compartilhamento de código com Xamarin.Forms – Fonte: Adaptado de Xamarin Forms

O inconveniente da utilização desta abordagem é a limitação do número de componentes que podem ser utilizados. Isso ocorre, pois é permitida somente a utilização de componentes que sejam comuns entre as plataformas. Desse modo, a utilização desta abordagem é recomendada quando não necessita-se de componentes específicos de cada uma das plataformas.

3. Compartilhamento de Código

Uma das questões chave no desenvolvimento de aplicativos multiplataforma é o compartilhamento de código. Xamarin destaca-se justamente por oferecer uma excelente estrutura de compartilhamento de código entre as plataformas, permitindo o compartilhamento de código de duas maneiras: Portable Class Library e Shared Assets Projects.

3.1 Portable Class Library – PCL

A Portable Class Library é uma biblioteca para compartilhamento de código, considerada a maneira primária de compartilhamento de código no Xamarin. Esta abordagem utiliza um Dynamic Link Library (DLL) para fazer o link da PCL aos projetos das plataformas específicas. Através desse link, é possível ainda utilizar a biblioteca em outras soluções.

Quando se cria uma Portable Class Library deve-se escolher uma combinação de plataformas, nas quais deseja executar o código, tais escolhas são traduzidas em um identificador de perfil, que descreve quais plataformas a biblioteca suportará. A Figura 3 apresenta a arquitetura de um aplicativo multiplataforma que utiliza uma PCL para compartilhar o código, e ainda utiliza de injeção de dependência para passar os recursos dependentes de plataforma.

Estrutura de compartilhamento de código com Portable Class Library – Fonte: Adaptado de Xamarin PlatformEstrutura de compartilhamento de código com Portable Class Library – Fonte: Adaptado de Xamarin Platform

A Portable Class Library é normalmente utilizada em projetos de média e grande complexidade, e geralmente integram o back-end de uma aplicação. O compartilhamento de código centralizado é a principal vantagem desta abordagem, pois possibilita a escrita e teste do código em um único projeto. Tal código pode ser posteriormente consumido por outras bibliotecas ou soluções além da solução corrente. Outra importante característica desta abordagem, constitui-se em que a refatoração de código afeta todo o código da solução.

3.2. Shared Assets Projects – SAP

O Shared Assets Projects é um método de compartilhamento de recursos, sendo a maneira mais simples de compartilhar código, pois meramente consiste em replicar todo o código para cada uma das plataformas.

Esta abordagem de compartilhamento possui um importante recurso denominado de diretrizes de compilação. Tais diretrizes permitem que trechos de código sejam executados apenas em plataformas específicas. Desse modo, é possível codificar um comportamento base, comum a todas as plataformas, juntamente com comportamentos específicos.

A Figura 4 ilustra a arquitetura de uma aplicação utilizando o Shared Assets Projects. Note que, como mencionado anteriormente, todo o código do SAP é replicado nas plataformas específicas.

Exemplo de um projeto fazendo uso de SAP – Fonte: Adaptado de Xamarin PlatformExemplo de um projeto fazendo uso de SAP – Fonte: Adaptado de Xamarin Platform

A abordagem SAP é recorrentemente utilizada em projetos de pequena complexidade e com poucos desenvolvedores. A simplicidade de utilização deste meio de compartilhamento e as diretrizes de compilação, constituem certamente seus atributos mais relevantes. Outra notável característica, é o fato de permitir a utilização de todos os componentes do .Net e APIs das plataformas. O inconveniente do uso desta abordagem é a dificuldade na realização de testes e na manutenção dos códigos, devido a seu alto acoplamento.

4. Compilação para plataforma nativa

Os produtos Xamarin são construídos sobre a plataforma Mono, que é a versão open source do .NET Framework, o qual permite executar código C# em plataformas não Windows utilizando o Mono Runtime. O Mono dá acesso as APIs nativas de cada uma das plataformas, as quais, os desenvolvedores já estão acostumados. Dessa forma, é possível desenvolver em C# e acessar APIs nativas de cada plataforma. Sabendo-se disso, toda compilação feita por um compilador C#, gera uma IL (Intermediate Language), e este código é executado em tempo de execução pelo Mono Runtime.

Em Xamarin.Android quando compila-se o código C# gera-se uma IL, a qual será executada pelo Mono Runtime em tempo de execução. Desta forma ao iniciar-se a aplicação desenvolvida, o Mono Runtime é carregado em memória, logo após compila-se a IL para código nativo da plataforma e este então é executado. Esta última parte do processo para rodar a aplicação é conhecida como Just-In-Time Compilation. Esse mesmo comportamento (JIT) é obtido quando compila-se aplicações para plataforma da Microsoft e para Android.

No Xamarin.IOS o processo de compilação é um pouco diferente, como a  Apple não permite rodar aplicações utilizando-se do JIT, ao compilar o aplicativo para IOS, o compilador C# primeiramente compila o código para IL e então usa o compilador da Apple para compilar novamente e então gerar um  aplicativo nativo. Por conseguinte, faz-se necessário um computador Apple para compilar um aplicativo para IOS. Ademais é importante ressaltar que não ocorre JIT e nem se faz uso da Mono Runtime para executar aplicativos IOS, sendo este tipo de compilação conhecido como Ahead-of-time compilation (AOT). Logo o aplicativo construído não leva consigo a Mono Runtime para dentro do IOS, como acontece no Android/Windows Phone.

Explicado como funciona o processo de compilação no Xamarin.Android e Xamarin.IOS, será abordado agora o processo para o Xamarin.Forms. O Xamarin.Forms é construído sobre as duas bibliotecas já explanadas. Isto posto, existe um assembler chamado Xamarin.Form.Core, que é onde são definidos as classes com as APIs em comuns das diferentes plataformas. Assim sendo, cada plataforma tem um assembler que mapeia esses objetos em comuns para as correspondentes nativas. Observe a Figura 5:

Estrutura do projeto usando o Xamarin.Forms – Fonte: Elaborado pelos autores

Na figura acima, apresenta-se a estrutura do projeto, onde pode-se visualizar as APIs em comum entre as plataformas utilizadas. Ao navegar à um projeto nativo, por exemplo o projeto Android, tem-se um assembler que é responsável por mapear os controles com a sua correspondente na plataforma nativa. Observe na Figura 6 a estrutura do projeto Xamarin.Android:

Estrutura do projeto nativo Android – Fonte: Elaborado pelos autores

Neste assembler é onde tem-se os Renders que são as classes que “sabem” como renderizar um componente em sua plataforma. A mesma estrutura repete-se node demais projetos, como por exemplo, no projeto IOS. Observe a Figura 7:

Estrutura do projeto nativo iOS – Fonte: Elaborado pelos autoresEstrutura do projeto nativo iOS – Fonte:

Elaborado pelos autores

Portanto, um projeto Xamarin.Forms tem a estrutura como apresentada. Primeiramente, há o Xamarin.Forms que é onde estão definidas as APIs em comum de cada plataforma. Em segundo, cada plataforma tem uma classe que mapeia essas APIs para a plataforma específica.

5. Conclusão

Os recursos e ferramentas disponibilizados pela Xamarin tem potencial para acelerar o desenvolvimento e ainda diminuir custos. Isso ocorre, por que engloba as três principais plataformas do mercado mobile, construindo uma única solução compartilhada, a qual possui qualidade muito próxima a de uma solução nativa. Os profissionais ainda precisam conhecer as APIs nativas, contudo, não se faz mais necessário manter três equipes distintas de desenvolvimento, visto que grande parte do código passa a ser compartilhado e a linguagem de programação passa a ser única, a linguagem C#.

Vale ressaltar que a utilização do Xamarin inclui custos não ligados ao adotar esta tecnologia, mas ligados ao Sistema Operacional. As ferramentas da Xamarin rodam sobre a plataforma da Microsoft ou da Apple, o que requer a compra da licença das mesmas. Se comparado com outras tecnologias para desenvolvimento multiplataforma, com por exemplo, Ionic, tem-se este custo a mais, embora não seja algo impeditivo, visto que a plataforma da MS ainda é a mais utilizada. Embora no “mundo” do desenvolvimento, muito se tem optado por utilizar GNU/Linux.

Portanto, a plataforma Xamarin, seus recursos e ferramentas representam uma solução muito eficiente e significativa no desenvolvimento multiplataforma de aplicativos nativos. Quanto ao desenvolvimento, atualmente pode-se desenvolver Xamarin em Windows e Mac. Fica a expectativa  quanto ao lançamento de opções que permitam o desenvolvimento também em sistema operacional GNU/Linux.

Referências

  • WIKIPÉDIA. Mono (Software).

Disponível em: https://en.m.wikipedia.org/wiki/Mono_(software). Acesso em Set 2017.

  • WIKIPEDIA. Xamarin.

Disponível em: https://en.wikipedia.org/wiki/Xamarin. Acesso em Set 2017.

  • XAMARIN. Site Oficial da Xamarin.

Disponível em: https://www.xamarin.com/platform. Acesso em Set 2017.

  • XAMARIN. Xamarin Developers.

Disponível em: https://developer.xamarin.com/. Acesso em Set 2017.

  • YOUTUBE. Microsoft Brasil.

Disponível em: https://www.youtube.com/user/MicrosoftBrasil. Acesso em Set 2017.

  • MACHADO, Henrique. Xamarin: Como compartilhar código com PCL e SAP.

Disponível em: http://www.devmedia.com.br/xamarin-como-compartilhar-codigo-com-pcl-e-sap/37872. Acesso em Set 2017.

  • SMITH, JT. Talking with Miguel de Icaza of Ximian.

Disponível em: https://www.linux.com/news/talking-miguel-de-icaza-ximian. Acesso em Set 2017.

  • QUORA. What is XAMARIN? Is it a framework? Or Compiler? Or is is a just a code translator?

Disponível em: https://www.quora.com/What-is-XAMARIN-Is-it-a-framework-Or-compiler-Or-is-it-a-just-a-code-translator. Acesso em Set 2017.

  • LavishT@TWC. What is Xamarin? How does it help in cross-platform mobile app developement?

Disponível em: http://www.thewindowsclub.com/what-is-xamarin-and-cross-platform-mobile-development. Acesso em Set 2017.

  • Oamkumar, Reema. Why Xamarin becoming the first choice for building enterprise mobile apps.

Disponível em: http://www.software-developer-india.com/why-xamarin-is-becoming-the-first-choice-for-building-enterprise-mobile-apps/. Acesso em Set 2017.

  • STACKOVERFLOW. What are the advantages o just-in-time compilation versus ahead-of-time compilation

Disponível em: https://stackoverflow.com/questions/2106380/what-are-the-advantages-of-just-in-time-compilation-versus-ahead-of-time-compila. Acesso em Set 2017.

  • ALTEXSOFT. The Good and The Bad of Xamarin Mobile Development.

Disponível em: https://www.altexsoft.com/blog/mobile/the-good-and-the-bad-of-xamarin-mobile-development/. Acesso em 2017.

  • WELITON, Carlos. Entendendo a Xamarin.

Disponível em: http://comocriaraplicativos.com.br/entendendo-a-xamarin/. Acesso em Set 2017.

  • HAMEDANI, Mosh. What is Xamarin Form?

Disponível em: https://www.youtube.com/watch?v=93ZU6j59wL4. Acesso em Set 2017.