quinta-feira, 18 de agosto de 2011

[Atualizado] Ferramentas para Desenvolvimento: Flex ou Java?

Essa semana pelo twitter, o Diego do @mestreandroid postou uma dúvida: Usar AIR Mobile (Flex) ou Java para desenvolver apps para android? E após um comentário meu no fórum do blog, fui convidado a escrever um artigo para um guest post.

Ferramentas para Desenvolvimento: Flex ou Java?

 

Hello World!

Acho que desde o primeiro commit do projeto AIR Mobile de algum engenheiro de software da Adobe essa pergunta existe: Usar Flex ou Java para desenvolver aplicações para Android? E desde a Adobe Max de 2009 essa pergunta foi se replicando na cabeça de cada desenvolvedor Flash e Android… E agora?!

E agora temos duas excelentes opções na hora de desenvolver nossas apps para ganharmos muito dinheiro no Market! Mas como sempre “cada um no seu quadrado”, usar uma ou outra plataforma traz seus benefícios, mas também seus limites.
Quando se fala de Flash ou Flex em dispositivos móveis, vêm milhares de problemas na cabeça: performance, bateria, suporte, etc… Mas esses são problemas recorrentes em qualquer plataforma de desenvolvimento, seja em Java para Android, Cocoa para IOS ou C# para Windows Phone (uurrrghhh…).
Por causa da carta do Jobs (Thoughts on Flash) e vários outros FanBoys da Apple e Microsoft que postaram absurdos sobre a plataforma, o Flash ganhou uma fama ruim quando colocamos na mesma frase a palavra “smartphone”. Na verdade, a plataforma Adobe Flash (como deve ser chamada) é muito mais que um interpretador de SWFs compilados pelo Flex SDK.
Por outro lado, desenvolver apps nativas usando Java tem seus benefícios diretos. Além do suporte nativo a recursos do dispositivo, certamente a performance é otimizada pois não há nada entre suas apps e o OS que está rodando. Outro ponto importante é em relação aos novos recursos. Por exemplo, a Google lança uma atualização para o Android com suporte à um recurso XYZ.
Se você faz suas apps em Java, teoricamente é só baixar o novo SDK, implementar o novo recurso e publicá-la no Market. Mas caso suas apps forem feitas em AIR Mobile, você terá que esperar sair uma nova versão do player mobile da Adobe (que de suporte ao novo recurso) para implementá-lo em seus apps. A proposta da Adobe é manter esse espaço de tempo bem curto, mas todos nós sabemos quem nem sempre isso acontece.

 

AIR Mobile / Flex

O Adobe Flex é um framework voltado para aplicações robustas para a web, que encapsula vários componentes visuais como botões, listas, grids, bibliotecas para consumo de serviço web Java, PHP, ColdFusion, entre outros. O Adobe AIR é uma extensão do Adobe Flex com classes e bibliotecas para acesso à baixo nível (hardware, manipulação de arquivos, controle do OS, etc…) e o AIR Mobile é a mesma idéia do Adobe AIR para desktops, mas para Android e com grandes otimizações de performance em relação ao Flex e AIR Desktop.
Desta forma, programadores que já estão familiarisados com a plataforma podem “migrar” seus projetos para AIR Mobile facilmente. E também, novos projetos podem ser distribuidos para vários ambientes de forma mais simples, sem ter muitas modificações no projeto.
Por exemplo, você quer fazer um app que twite algo quando o dispositivo receber um novo SMS, mas quer vendê-lo no Market e na AppStore. Foi pensando em casos como esse que a Adobe criou o braço AIR Mobile, para que o desenvolvedor crie seu app independente da plataforma. Pegando uma frase do próprio Java podemos definir o seguinte: “write once run anywhere” (em tradução livre: escreva uma vez, rode em qualquer lugar).
“Mas como nem tudo são flores na vida de Adobe Climber”, o Adobe AIR Mobile ainda é um projeto novo e não tem a mesma generalidade, performance e outros que um app nativo poderia ter. O ponto principal é que o player mobile da Adobe só roda em Androids 2.2 (Froyo) ou superior, desta forma deixamos quase metade dos usuários de fora de nossos apps.

 

Integração

Outro ponto importante é a integração com o Android, o AIR Mobile tem um vasto suporte à funcionalidades nativas, como conexão com internet, browser nativo, câmera, GPS, aceletômetro, microfone, multitouch, manipulação de arquivos, entre outros. Só com um ou dois ítens da lista já podemos fazer milhares de aplicações que nos atendam nos mais diferentes segmentos: redes sociais, jogos, etc…
E estão muito bem integrados, então se sua aplicação não for além desses recursos, você terá que avaliar outros tópicos antes de se decidir.
Porém há alguns pontos negativos, não é possível acessar a lista de contatos diretamente, por exemplo. Outro caso é se sua aplicação tem que consumir algum arquivo que está no dispositivo ou cartão de memória do usuário, a caixa de diálogo que abre agrupa todos os arquivos (leia-se somente imagens, áudios e vídeos) em um menu accordion com uma usabilidade péssima.

 

Multiplataforma

Um ponto bem interessante da proposta da Adobe é que projetos AIR Mobile podem rodar tanto no Android como no IOS, e em BlackBerrys (não é “Berries” porque é nome próprio ok?!), abrindo ainda mais o campo de desenvolvimento. Então, seu projeto que antes era feito em Actionscript já poderia roda em Android, mas agora roda também no IOS e nos BlackBerrys!
Infelizmente ainda não há o mesmo nível de integração do AIR Mobile para Android como no IOS ou BlackBerry, mas elas são tão específicas que ainda assim vale muito a pena você analisar o que seu app vai usar antes de optar por aplicações nativas.
Por outro lado, projetos Java para Android teoricamente não rodam em outras plataformas. Então caso seu projeto tenha que rodar na web e nos smartphones e tablets da vida, você terá que criar um projeto para cada plataforma que deseje suportar.

 

IDEs de Desenvolvimento

Na minha opnião, e já lí que é a mesma de muitos outros, nada melhor que fazer escultura de gelo no Alaska. Desta forma, procuro sempre criar meus projetos nas IDEs oficiais pois quase sempre você terá o melhor suporte na hora de escrever seus códigos.
Quando falamos de Flex muitos já irão lembrar no Flex Builder, o antigo nome da IDE desenvolvida pela Adobe, agora chama de Flash Builder que está em sua versão 4.5. Se trata de um plugin para o Eclipse, que na minha opnião é de longe a melhor no mercado.
Tem um excelente suporte à todos os tipos de projetos (ActionScript puro, Flash, Flex, AIR e Mobile), os facilitadores na hora da codificação é a melhor parte. Há atalhos para criar métodos, listeners, interfaces, etc…
E em uma comparação direta temos o ADT, um plugin para Eclipse feito pela própria Google para o desenvolvimento de aplicações Android em Java. Para não ser muito redundante, o ADT recebe os mesmos elogíos do Flash Builder, total integração com os projetos, emula o Android para testes sem o dispositivo (o emulador vem junto com o SDK na verdade), além do LogCat que mostra todos os outputs de seu dispositivo conectado via USB, por exemplo.
Ambos suportam teste diretos nos aparelhos, então se você conectar seu dispositivo na porta USB e ativar o modo debugging poderá testar suas aplicações diretamente no smartphone! A diferença fica no uso comercial, o Eclipse é grátis assim como o ADT, mas o Flash Builder é grátis apenas por 30 dias. E isso pode ser um ponto importante na hora de desenvolver seu app.

 

Linguagem e Sintaxe

Para quem nunca viu ActionScript ou Java, pode até pular esse tópico pois as duas linguagens são muito parecidas e não irá fazer muita diferença se for começar do zero, inclusive por ambas serem orientadas à objeto. E mesmo se já viu alguma, esse assunto é muito subjetivo, por esse motivo só irei mostrar como são os projetos nos dois casos.
Para fazer apps em AIR Mobile existem 2 maneiras, usando o framework Flex Mobile ou criando tudo do zero usando ActionScript diretamente. Usando a IDE da Adobe é muito fácil criar ambos os tipos, os projetos “Hello World!” podem ser executados logo após a criação. Um projeto Flex Mobile por exemplo usa primariamente componentes MXML, um que manterá toda a aplicação e outro que será a primeira tela (chamada de view). Por exemplo, uma view:

ProjetoFlexMobileHomeView.mxml

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
   3:         xmlns:s="library://ns.adobe.com/flex/spark"
   4:         title="HomeView">
   5:     <fx:Declarations>
   6:         <!-- Place non-visual elements (e.g., services, value objects) here -->
   7:     </fx:Declarations>
   8:     <s:Label text="Hello World!" />
   9: </s:View>

Trata-se basicamente de um XML usando namespaces, então se o desenvolvedor já trabalhou com XMLs não terá muitos problemas com a linguagem. No caso do projeto Actionscript Mobile, a classe principal do projeto fica assim:


ProjetoActionscriptMobile.as



   1: package
   2: {
   3:     import flash.display.Sprite;
   4:     import flash.display.StageAlign;
   5:     import flash.display.StageScaleMode;
   6:     
   7:     public class ProjetoActionscriptMobile extends Sprite
   8:     {
   9:         public function ProjetoActionscriptMobile()
  10:         {
  11:             super();
  12:             
  13:             // support autoOrients
  14:             stage.align = StageAlign.TOP_LEFT;
  15:             stage.scaleMode = StageScaleMode.NO_SCALE;
  16:             
  17:             trace('Hello World!');
  18:         }
  19:     }
  20: }

Neste momento, quem é desenvolvedor Java e nunca tinha visto Actionscript deve ter ficado espantado com a semelhança. E de fato é, conforme você for se familiarizando irá perceber que o Actionscript tem uma sintaxe muito comum.
Esses dois tipos de projetos, geram no final o mesmo arquivo que qualquer outro app para Android, o .APK. Desta forma, se seu usuário não souber que foi feito via Actionscript ou Flex, ele nunca saberá se é uma aplicação nativa ou AIR Mobile.
Em relação à aplicações nativas em Java não muda muito, você também pode criar aplicações usando somente Java ou usar um XML para marcar os componentes visuais, assim como o MXML faz no AIR Mobile. Então quando criamos um projeto Android pelo ADT, a IDE gera para nós uma classe Java chamada de Activity que é a mesma idéia da view no AIR Mobile, e um arquivo XML que organizará o os componentes visuais.


ProjetoAndroidActivity.java



   1: package net.idemax.projetoandroid;
   2:  
   3: import android.app.Activity;
   4: import android.os.Bundle;
   5:  
   6: public class ProjetoAndroidActivity extends Activity {
   7:     /** Called when the activity is first created. */
   8:     @Override
   9:     public void onCreate(Bundle savedInstanceState) {
  10:         super.onCreate(savedInstanceState);
  11:         setContentView(R.layout.main);
  12:     }
  13: }

main.xml



   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:orientation="vertical"
   4:     android:layout_width="fill_parent"
   5:     android:layout_height="fill_parent"
   6:     >
   7: <TextView  
   8:     android:layout_width="fill_parent" 
   9:     android:layout_height="wrap_content" 
  10:     android:text="@string/hello"
  11:     />
  12: </LinearLayout>

Não é obrigatório criar o arquivo XML para cada Activity. Assim como no AIR Mobile, você pode criar projetos inteiramente Java no ADT. Nos dois casos, Java e Flex têm arquivos de configuração chamados Mainfest onde, entre outras coisas, você habilita até onde sua aplicação pode ir no dispositivo e o que pode ou não acessar, como internet, GPS, dados externos, etc…


 


Concluindo


Há mais dois pontos interessantes à falar sobre as plataformas: curva de aprendizagem e desempenho da aplicação. Mesmo eu tendo fortes opniões formadas sobre isso, acho muito relativo, no caso da curva de aprendizagem tem gente que gosta de comprar um livro e outros gostam de fazer cursos, eu gosto de ler vários tutoriais na internet pois são vários pontos de vista sobre um mesmo problema.
Em relação ao desempenho, também acho relativo pois um App que usa 3D, irá rodar muito bem em dispositivos com bom hardware independente da plataforma que foram criados.
A minha dica é analisar com calma seu projeto, ver a proposta da sua app e para qual público ela será mais direcionada. Se ainda não conhece Actionscript e Java, está ai uma oportunidade de conhecer duas novas maneiras de desenvolver apps para seu smartphone e focar naquela que você mais gostou.
Se já conhece uma delas, também é uma oportunidade de ampliar seus horizontes e ter um outro ponto de vista de como apps são desenvolvidas.


Até a próxima…


PS.: Obrigado Diego do Mestre Android pela oportunidade, e grande abraço a comunidade Android brasileira. Post no blog Mestre Android.