Artigo da WebMobile 13 - Antenna, um ANT para dispositivos móveis
Nesse artigo faremos uma análise do antenna, iniciando por algumas de suas características gerais e ao final do artigo apresentando algumas funcionalidades um pouco mais avançadas.
Antenna, um ANT para dispositivos móveis
Jorge Fernando Luiz Fernandes
Vamos imaginar a seguinte situação, você acorda e logo vem a cabeça as suas tarefas do dia: arrumar a cama, preparar o café da manhã, lavar o carro, dar banho no cachorro, entre outras que nos tomam parte do nosso precioso tempo. Ao finalizarmos esse pensamento, incondicionalmente vem à cabeça a possibilidade de nos livrarmos de tais tarefas para então ocuparmos nosso tempo em atividades mais interessantes, como ler um bom livro, ir ao cinema, conversar com amigos, jogar Ragnarok entre outras coisas que sejam mais interessantes. Quanto a tal problemática tenho duas notícias, uma boa e outra não tanto.
A não tão boa é que eu desconheço um robô, pelo menos por enquanto, que seja vendido e que execute tais tarefas domésticas para qualquer um de nós, e a boa é que já existe, pelo menos para o universo de desenvolvimento (agora também no caso dos dispositivos móveis) um framework que pode trabalhar automatizando tarefas necessárias ao processo de desenvolvimento, mas que por serem 'braçais' acabam tomando um tempo que reflete de forma negativa na questão da produtividade. Estou falando do antenna, um framework similar ao ANT que serve para o desenvolvimento de sistemas para dispositivos móveis.
É muito comum, pelo menos quando trabalhamos em aplicações JEE, a utilização de framework para automatização do processo de desenvolvimento, buscando evitar que o programador faça manualmente diversas tarefas que não tenham absolutamente nada a ver com lógica de negócio do sistema em questão, mas que são fundamentais durante a codificação.
Em JEE, os dois principais frameworks utilizados para a automação de tarefas são o ANT e o MAVEN. A partir do momento em que fazermos uso deles não precisamos nos preocupar com a geração de arquivos .jar, .war, .ear e podemos ainda automatizar a fase de testes. Esse tempo ganho pode ser aplicado de forma mais útil ao sistema, sendo revertido, por exemplo, para a sua lógica de negócio.
Ao trabalharmos em dispositivos de pequeno porte, também acabamos tendo em nossas mãos uma série de pequenas tarefas necessárias ao processo de desenvolvimento, são elas a compilação, o empacotamento e a obfuscação da aplicação entre outras.
Da mesma forma como dispomos de mecanismos que automatizam o nosso trabalho na plataforma JEE, também dispomos de um framework que trata dessa questão, é o antenna, que não tem apenas o nome, mas também o manuseio muito parecido com o famoso ANT.
O antenna é um projeto que está hospedado no sourceforge e pode ser encontrado no endereço http://sourceforge.net/project/showfiles.php?group_id=67420. Neste repositório, encontramos o arquivo .jar e o código fonte do antenna no pacote antenna-bin-0.9.14. Ainda dentro deste pacote existe uma pasta chamada sample, onde estão vários exemplos de utilização do antenna que com certeza são bastante úteis para todos aqueles que desejem fazer uso dele.
Eu também recomendo uma visita à página do projeto, localizada no endereço http://antenna.sourceforge.net/, que conta com uma apresentação das capacidades dessa ferramenta.
Podemos proceder de diferentes formas para executar a instalação do antenna, vou agora enumerar algumas delas, três para ser mais exato.
A primeira delas é adicionar o antenna, no classpath.
A segunda é fazer a inclusão do .jar dentro da pasta lib do ANT, localizada em sua máquina.
Procedi de uma forma um pouco diferente na minha instalação. Como estou fazendo uso do eclipse, optei pelo seguinte procedimento, criei no meu diretório C: uma pasta chamada ANT, dentro dela outra chamada lib. A esta pasta lib adicionei as libs que estão dentro da pasta org.apache.ant_1.6.5\lib que fica localizada na pasta plug-ins do eclipse, e junto a elas coloquei o arquivo .jar do antenna. Terminado isso iniciei a configuração dentro do meu projeto no eclipse.
Antes de tudo vamos esclarecer algo, da mesma forma como procedemos no ANT, com o antenna também criamos um arquivo XML chamado build.xml, o qual é adicionado à raiz da pasta do projeto. É no build.xml que está determinado o procedimento que o antenna deverá executar em nossa aplicação.
Continuando, ao adicionar em meu projeto o arquivo build.xml, dou um clique nele com o botão direito do mouse, escolho Run as e posteriormente a opção Ant Build..., como podemos ver na Figura 1.
Os três pontos atrás do nome já nos dão a entender que esta opção faz algo que vai além de simplesmente executar o build.xml, na verdade ela permite fazer a configuração informando como o eclipse deve atuar em tal tarefa.
Figura 1. Iniciando a configuração do antenna no eclipse.
Ao fazer isso o eclipse nos mostra uma janela de configurações. Nessa janela fiz a opção pela aba Classpath, e lá cliquei no botão Ant Home..., como podemos ver na Figura 2. Na aba Classpath podemos adicionar um novo caminho para que o eclipse possa encontrar as libs do ANT, no meu caso apontei para C:\ANT, onde além das bibliotecas do ANT utilizadas pelo eclipse, está também o .jar do antenna.
Figura 2. Configurando o Ant Home.
Pronto! Agora poderemos executar a nossa aplicação de forma simples, apenas executando o buid.xml da mesma forma como seria feita com qualquer aplicação Web ou Desktop que faça uso das funcionalidades do ANT.
Para executar um arquivo build.xml no eclipse podemos proceder de três formas, a primeira é dando um clique com o botão direito no arquivo build.xml e escolhendo a opção Ant Build. Atenção, não devemos confundir essa opção com Ant Build..., comentada anteriormente e que usamos para fazer a configuração. Outra forma é através do atalho alt+shift+x+q e por fim através de um clique no botão que pode ser visto na Figura 3.
Figura 3. Executando o arquivo build.xml.
Como já disse, o antenna é um framework utilizado para fazer automação de tarefas baseado no famoso ANT. Ele dispõe de um conjunto de tarefas que podemos fazer uso através de suas tags. Estas tarefas podem, por exemplo, nos auxiliar no processo de compilação, empacotamento, pré-verificação e obfuscação do código da aplicação, os quais tomariam tempo extra do processo de desenvolvimento e, além disso, acabariam por torná-lo chato, já que não deixam de ser tarefas repetitivas.
Não bastassem essas funcionalidades, o antenna ainda torna possível o manuseio dos arquivos descritores (.JAD), e a conversão de arquivos .jar para arquivos .PRC, que são utilizados para rodar aplicativos JME em implementações PalmOS da SUN e da IBM.
As tarefas fornecidas pelo antenna através de suas tags, muitas vezes acabam fazendo uso de funcionalidades providas pelo Wireless Toolkit da SUN, sendo assim é realmente necessário tê-lo instalado ao se fazer uso do antenna.
Iniciaremos este artigo vendo algumas características gerais do antenna, e até o seu final abordaremos algumas funcionalidades um pouco mais avançadas
Comecemos então a tratar do antenna por suas funcionalidades mais básicas para que possamos fazer um bom alicerce para uma grande construção.
Antes de tudo precisamos definir o que são tasks. Tasks são as tarefas executadas pelo antenna ou pelo ant que diminuem o nosso trabalho. Um exemplo de task que podemos dar, com base no funcionamento do ant, é a task <copy>, que pode ser usada para copiar um arquivo. Agora veremos tasks específicas do antenna e outras pertencentes ao ant, que são necessárias ao nosso trabalho.
A primeira task que iremos tratar é a wtkjad. É através dela, que podemos manipular o arquivo descritor, .JAD. Nela é possível incluir o nome do arquivo .JAD, através do parâmetro jadfile, o nome do arquivo .JAR através do parâmetro jarfile, o vendedor, a versão, através dos parâmetros vendor e version, respectivamente entre outras coisas.
No interior desta task pode ser colocado um elemento chamado midlet, que é utilizado para incluir as midlets que compõem a Midlet-suite. Ao elemento midlet são informados o nome da midlet ao parâmetro name e ao parâmetro class devemos passar o nome canônico da classe. Para entendermos o que é um nome canônico vamos ao seguinte exemplo, uma classe chamada Artigo que esteja no pacote revista terá o seguinte nome canônico, revista.Artigo.
Outra importante task é a wtkbuild, ela é responsável por fazer a compilação das classes e conseqüentemente iniciar o processo de empacotamento desta. Para ela são informados o diretório de origem, através do parâmetro srcdir, o local de destino dos arquivos .class através do parâmetro destdir, opcionalmente é possível colocar o parâmetro preverify, que recebe os valores true ou false, o valor default dessa parâmetro é o false.
Outra task muito importante é a wtkpackage. Essa é responsável por fazer a geração do arquivo .jar referente à aplicação. Entre os seus parâmetros podemos citar jarfile onde é passado o nome do arquivo jar que deverá ser criado e também jadfile que recebe o nome do arquivo descritor da aplicação. Como opcionais podemos citar os parâmetros preverify e obfuscate, responsáveis por informar se deve ser feita ou não a pré-verificação bem como a obfuscação do código compilado da aplicação. Estes parâmetros recebem como valor true ou false, e quando não explicitamente declarados eles assumem o valor default false. Adiante comentaremos o que são preverify e obfuscate com mais profundidade.
Por fim abordaremos mais uma task, a wtkrun. Ela, como já está explicito no nome, é responsável por rodar a aplicação. Esta task faz isso utilizando um dos simuladores disponibilizados pelo Wireless Toolkit. Seus parâmetros principais são jadfile, onde informamos o nome do arquivo descritor e device onde informamos a qual simulador será submetida à aplicação.
Acima foram vistas as tasks mais importantes para obtermos uma compreensão geral das funcionalidades básicas do antenna. Entretanto, isso ainda não é tudo, é de vital importância observarmos outras tasks e estruturas, provenientes do ANT, e que são necessárias para o correto funcionamento do build.xml, por exemplo quando fazemos menção aos arquivos de propriedades do antenna, situação que veremos adiante.
Comecemos a falar sobre os componentes do ANT necessários ao trabalho do antenna por meio da estrutura básica do arquivo build.xml. Tal estrutura é chamada de project. Nela são definidos o nome do projeto e o target default. Mais adiante trataremos do que venha a ser um target, por enquanto vamos tratar de algumas outras tasks e estruturas imprescindíveis para o trabalho com antenna.
O ANT possui uma task chamada property. A sua finalidade é definir parâmetros que serão utilizados para executar tarefas inerentes ao projeto com o objetivo de, em muitas situações, evitarmos ficar reescrevendo mapeamentos. Um uso que damos a esta task no antenna é o de apontarmos para determinado recurso necessário ao processo de automação de tarefas, como a localização do Wireless Toolkit.
No antenna, temos que definir um parâmetro chamado wtk.home, que deve apontar para o endereço onde está localizado o Wireless Toolkit. Como já foi dito anteriormente, o antenna, em muitas de suas funcionalidades, faz uso dos recursos providos pelo Wireless Toolkit.
Para fazermos uso das funcionalidades específicas do antenna, fazemos chamada a uma task denominada taskdef. Para pedirmos as funcionalidades do antenna, podemos atuar de duas formas. Uma passando para o parâmetro resource desta task o nome do arquivo "antenna.properties" e a outra, bem mais trabalhosa diga-se de passagem, chamando cada uma das tasks que nos interessa através do seu nome e do nome completo de sua classe através dos parâmetros name e class respectivamente. Em se tratando do nosso caso particular, precisaríamos das seguintes linhas se fossemos optar pela segunda opção (Listagem 1), ao invés de apenas uma como se verá a frente.
name="wtkjad" classname="de.pleumann.antenna.WtkJad"/>
name="wtkbuild" classname="de.pleumann.antenna.WtkBuild"/>
name="wtkpackage"classname="de.pleumann.antenna.WtkPackage"/>
name="wtkrun" classname="de.pleumann.antenna.WtkRun"/>
Listagem 1. Adição de parâmetros do antenna no build.xml.
Por fim, vamos a uma última definição importante, a de target. Antes de tudo, vale ressaltar que targets são estruturas existentes no ANT, portanto originais dele, então a explicação dada aqui cabe tanto ao ANT quanto ao antenna. Todos os arquivos build.xml devem ter pelo menos um target, que será a target default, mencionada na estrutura project vista anteriormente. Os targets são também uma forma de organizarmos a seqüência de tarefas disposta no build.xml, ajudando a tornar esse documento mais legível. A target é um conjunto de tarefas que queremos que seja executado.
Vamos imaginar o seguinte para entender como os targets podem deixar um arquivo build.xml mais legível. Consideremos uma tarefa corriqueira, mas que possa ser dividida em pequenas sub-tarefas, como ouvir um cd. De um modo geral, primeiramente devemos ligar o aparelho de som, verificar se o cd que desejamos ouvir já está na bandeja do aparelho de som, caso não esteja, devemos pegar o cd desejado, abrir a bandeja, retirar o outro que esteja ocupando o lugar, colocar o cd desejado, fechar a bandeja e por fim apertar o botão para iniciar (play).