Documente Academic
Documente Profesional
Documente Cultură
RECIFE
2010
NELSON GLAUBER DE VASCONCELOS LEAL
RECIFE
2010
ii
C.E.S.A.R – CENTRO DE ESTUDOS E SISTEMAS AVANÇADOS
DO RECIFE
Data de aprovação:
_____ / _____ / 2010.
Banca examinadora:
_________________________________
Prof. Dr. Silvio Romero Lemos Meira
CESAR.EDU
_________________________________
Prof. Dr. Carlos André Guimarães Ferraz
U.F.P.E.
_________________________________
Prof. M.Sc. Felipe Santana F. Soares
CESAR.EDU
_________________________________
Prof. M.Sc. Luis Eugênio F. Tenório
CESAR.EDU
iii
Dedicatória
Palavras-chave
With the iPhone launch, the market has undergone a revolution once the
iPhone had resources that had not been developed by their competitors so far.
Furthermore, the model of distributing applications to users through a virtual store,
attracted developers, who could profit from their software and making them available
so that users could purchase them through the phone itself.
Having in mind this success, competitors sought alternatives to suit the new
scenario of the smartphone market. OHA (Open Handset Alliance), a consortium
formed by Google, along with other big names in the technology market, decided to
enter the dispute and created the Android platform. An open platform, with a
distribution model similar to the iPhone applications and can be used freely by any
manufacturer.
Nowadays, these two platforms are attracting more users and developers,
however they are completely different, therefore, create applications that have
versions for both platforms requires writing the same software twice. Thus, this work
presents the iOS2Droid, a tool that performs the conversion of the source code for
iPhone applications for Android, to minimize the coding effort in conversion projects
of applications that should be available for both platforms.
Key-words
1 INTRODUÇÃO ............................................................................................. 1
1.1 VISÃO GERAL ............................................................................................. 1
1.2 MOTIVAÇÃO ................................................................................................ 2
1.2.1 Motivação de Mercado ................................................................................. 2
1.2.2 Motivação Técnica ....................................................................................... 6
1.3 PROBLEMA ................................................................................................. 7
1.3.1 Objetivo geral ............................................................................................... 8
1.3.2 Objetivos específicos ................................................................................... 8
1.4 JUSTIFICATIVA ........................................................................................... 9
1.5 CONTRIBUIÇÕES ....................................................................................... 9
1.6 ESTRUTURA DA DISSERTAÇÃO ............................................................... 9
REFERÊNCIAS ......................................................................................................... 61
Lista de ilustrações
Sigla Significado
1 INTRODUÇÃO
Este capítulo apresenta uma visão geral sobre este trabalho, descrevendo as
motivações, o problema a ser analisado e os objetivos a serem alcançados. Em
seguida, será apresentada a justificativa e a relevância desta pesquisa, bem como
as contribuições esperadas. Por fim, será detalhado como estão organizados os
próximos capítulos desta dissertação.
1.2 MOTIVAÇÃO
De acordo com Lechetta (2009, p. 19), “estudos mostram que hoje em dia
mais de 3 bilhões de pessoas possuem um aparelho celular”, e segundo Carton e
Crumrine (2010) esse número tende a crescer. Isso representa um número
considerável de usuários, viabilizando grandes oportunidades de negócios em vários
segmentos.
3
A Figura 2 ilustra que nos seis primeiros meses de 2010, mais da metade dos
smartphones vendidos nos Estados Unidos, eram Android ou iPhone (The Nielsen
Company, 2010b). Isso reforça a importância que ambas as plataformas têm no
mercado de telefones móveis, demonstrando também o crescimento da plataforma
do Google no último ano, enquanto que os seus concorrentes perdem espaço.
4
Uma vez que código fonte e arquivos de UI estão convertidos, estes estarão
utilizando frameworks não existentes em Android. A ferramenta proposta
disponibilizará esses frameworks através de uma biblioteca escrita em Java de modo
a compatibilizar a aplicação convertida.
1.3 PROBLEMA
Os frameworks utilizados nos aplicativos iPhone são diferentes dos que são
utilizados em aplicações Android;
1.4 JUSTIFICATIVA
Este trabalho justifica-se por sua relevância do ponto de vista prático, tendo o
intuito de automatizar o processo de conversão de aplicações móveis em
plataformas distintas. A ferramenta proposta age como um facilitador em um trabalho
que comumente demanda bastante esforço (BARROS, 2007) e visa minimizar a
quantidade de erros decorrentes de falhas na execução dos projetos de conversão
(SAMPAIO et al. 2004).
1.5 CONTRIBUIÇÕES
2.2.1 Arquitetura
2.2.2 Ferramentas
Antes de incluir sua aplicação na loja, ele deverá registrar-se e pagar por uma
licença. Feito isso, ele deve obter um certificado digital para assinar a aplicação,
para enfim submetê-la. O Ciclo de desenvolvimento de um aplicativo iPhone é
ilustrado pela Figura 7.
1
http://www.apple.com/iphone/apps-for-iphone/
16
2.3.1 Arquitetura
2.3.2 Ferramentas
2.4.1 XMLVM
Em trabalho realizado por Puder (2005), foi criada uma ferramenta chamada
XMLVM que converte bytecodes gerados pelo compilador Java ou códigos
intermediários (CIL) da tecnologia .net da Microsoft em um documento XML. A partir
desse documento é possível fazer a tradução para vários formatos, entre eles o
21
2.4.3 PhoneGap
O PhoneGap é uma ferramenta de código aberto, que age como uma ponte
entre aplicações web e dispositivos móveis. O desenvolvedor utiliza HTML, CSS e
JavaScript para criar as aplicações, e a partir desse código ele pode ter acesso a
recursos do aparelho como câmera, acelerômetro e localização (STARK, 2010). Isso
é feito através das APIs e de um projeto modelo disponibilizado pela ferramenta.
2.4.6 Comparativo
2.5 CONCLUSÕES
Lançada em 1996 pela Sun, “Java é uma plataforma inteira, com uma enorme
biblioteca, com um monte de código reutilizável, e um ambiente de execução que
provê serviços como segurança, portabilidade entre sistemas operacionais, e coleta
de lixo automática” (HORSTMANN e CORNELL, 2008, p.2). A plataforma Android,
além da linguagem, utiliza a biblioteca padrão e conceitos da máquina virtual da
tecnologia Java.
// Em Objective-C
// Pessoa.h
#import <Foundation/Foundation.h>
@end
// Pessoa.m
#import "Pessoa.h"
@implementation Pessoa
@synthesize nome;
27
@end
// Em Java
// Pessoa.Java
public class Pessoa extends NSObject {
private NSString nome;
// Em Objective-C
Carro *carro = [[Carro alloc] init];
[carro release];
// Em Java
Carro carro = new Carro().init();
carro.release();
28
3.1.4 Propriedades
- (id) nome {
return nome;
}
- (void) setNome: (id) aNome {
if (aNome != nome) {
[aNome retain];
[nome release];
nome = aNome;
29
}
}
// Carro.h
#import <Foundation/Foundation.h>
@end
// Carro.m
#import "Carro.h"
@implementation Carro
@end
// Em Objective-C
carro.ano = 2010;
// Em Java
carro.setAno(2010);
Dessa forma, o iOS2Droid teve que tratar essa diferença chamando métodos
get e set quando propriedades forem utilizadas. Porém, isso gerou efeitos colaterais
que também tiveram de ser tratados. Um exemplo foi o pré-incremento e pós-
incremento de propriedades.
// Em Objective-C
int x = ++carro.ano;
// Em Java
int x = carro.setAno(carro.getAno()+1);
// Em Objective-C
int x = carro.ano++;
// Em Java
int x = posinc(carro.setAno(carro.getAno()+1));
// Em Objective-C
NSString *nome = @”Nelson”;
NSInteger idade = 26;
BOOL casado = YES;
CGFloat altura = 1.75;
// Em Java
NSString nome = str(“Nelson”);
int idade = 26;
boolean casado = true;
float altura = 1.75;
// Em Java
void sayHelloAndLastName(NSString name, NSString lastName) {
}
possível observar que logo após o parâmetro name existe o termo andLastName.
Essas palavras que ficam entre os parâmetros fazem parte da assinatura do método
e servem para facilitar o entendimento ao se chamar o método.
// Em Objective-C
[meuObj sayHello:@”Nelson” andLastName:@”Glauber”];
// Em Java
meuObj.sayHelloAndLastName(“Nelson”, “Glauber”);
// Em Objective-C
#define kShowSegmentIndex 0
#define PI 3.14
// Em Java
public static final int kShowSegmentIndex = 0;
public static final double PI = 3.14;
Internamente, cada classe filha de UIView contém uma inner class que herda
de android.view.View e que realmente implementa o comportamento do
componente. São elas também que são referenciadas no arquivo de definição de UI
que é convertido a partir do NIB da aplicação iPhone. O mapeamento das classes do
UIKit com as respectivas inner classes são apresentadas nas Tabela 1.
34
Componente
Componente iOS Modificação do iOS2Droid
Android
// Em Objective-C
// Tela1ViewController.h
#import <UIKit/UIKit.h>
- (IBAction) buttonPressed;
@end
// Tela1ViewController.m
#import "Tela1ViewController.h"
@implementation Tela1ViewController
- (IBAction) buttonPressed {
statusText.text = editNome.text;
}
- (void)dealloc {
[statusText release];
[editNome release];
[super dealloc];
}
@end
IBOutlet antes do nome da classe. Os métodos por sua vez, para serem
identificados pelo Interface Builder têm que ter IBAction como tipo de retorno.
//Em Java
public class Tela1ViewController extends UIViewController {
public Cap03_ButtonFunViewController() {
Context _ctx = MainActivity.getContext();
LayoutInflater inflater = (LayoutInflater) _ctx.
getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
android.view.View _view = inflater.inflate(
R.layout.cap03_buttonfunviewcontroller, null);
this.setView(new UIView((UIView.View)
_view.findViewById(R.id.view)));
outlet4689.getView().setOnClickListener(
new android.view.View.OnClickListener() {
public void onClick(android.view.View v) {
buttonPressed(outlet4689);
}
});
Observe que nesse diretório existe um pacote Java criado pelo tradutor, mesmo
quando este conceito não existe no Objective-C. Esse nome de pacote identificará
unicamente a aplicação dentro do dispositivo, e por exigência do Android, deve ter
no mínimo dois identificadores (por exemplo, ngvl.android). Adicionalmente, as
classes da biblioteca do iOS2Droid também encontram-se nesse diretório.
A pasta gen contém arquivos Java que são gerados pelo plugin do Android. O
mais importante deles é o arquivo R.java. Ele é atualizado automaticamente pelo
plugin do Android cada vez que algum recurso é adicionado, removido ou atualizado
dentro do projeto. Para facilitar o acesso aos recursos pelos demais arquivos do
projeto é feito um mapeamento desses recursos em constantes do tipo inteiro que
estão em classes internas à classe R. Ao abrir o arquivo R.java é possível observar
dentro da classe R, a classe interna drawable, que tem uma constante chamada
icon. Essa constante foi definida ao criar o projeto. Nesse momento, o plugin
adicionou um ícone padrão para aplicação dentro do diretório res/drawable chamado
icon.png. Desta forma, para referenciar essa imagem em outras classes da
aplicação deve-se utilizar a constante R.drawable.icon.
goto apesar de ser uma palavra reservada da linguagem, não pode ser
utilizada;
signed e unsigned não são suportados uma vez que os tipos primitivos de
Java são sinalizados, ou seja, aceitam números negativos e positivos.
// Em Objective-C
NSMutableArray * listaObjC = [[NSMutableArray alloc] init];
// Em Java
// (Instrução 1)
Carro c1 = listaJava1.get(0);
// (Instrução 2)
Carro c2 = (Carro)listaJava1.get(0)
// (Instrução 3)
Carro c3 = listaJava2.get(0)
// Em Objective-C
// (Instrução 4)
Carro * carro = [listaObjC objectAtIndex: 0];
47
// Em Java
Carro carro = listaObjC.objectAtIndex(0);
3.6 CONCLUSÕES
4 VALIDAÇÃO DA FERRAMENTA
outlet9573.getView().setOnClickListener(
new android.view.View.OnClickListener() {
public void onClick(android.view.View v) {
buttonPressed(outlet9573);
}
});
NSFrame android:layout_x
android:layout_y
android:layout_width
android:layout_height
52
IBUIFont android:textSize
IBUIImage android:src
IBUIText android:text
IBUINormalTitle
IBUITitle
IBUIValue android:progress
IBUIMaxValue android:max
IBUIOn android:checked
IBSegmentTitles Segments
IBUITextAlignment android:gravity
IBUIAutocapitalizationType android:inputType
IBUIKeyboardType
IBUIReturnKeyType android:imeOptions
IBUIBackgroundColor android:background
IBUIPlaceholder android:hint
IBUINormalTitleColor android:textColor
IBUITextColor
IBUIHighlightedTitleColor android:textColorHighlight
IBUITag android:tag
outlet5032.getView().setOnSeekBarChangeListener(
new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(
SeekBar seekBar, int progress, boolean fromUser) {
sliderChanged(outlet5032);
}
numberField.getView().setOnEditorActionListener(
new android.widget.TextView.OnEditorActionListener() {
public boolean onEditorAction(
TextView v, int actionId, KeyEvent event) {
textFieldDoneEditing(numberField);
return false;
}
});
54
<bytes key="NSRGB">
MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA
</bytes>
...
<string type="base64-UTF8" key="IBUIText">
TsO6bWVybzo
</string>
this.view.getView().setOnTouchListener(
new View.OnTouchListener() {
56
UIEvent event =
UIEvent.createTouchEvent( touches);
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
touchesBegan(touches, event);
return true;
case MotionEvent.ACTION_MOVE:
touchesMoved(touches, event);
return true;
case MotionEvent.ACTION_UP:
touchesEnded(touches, event);
return true;
case MotionEvent.ACTION_CANCEL:
touchesCancelled(touches, event);
return true;
}
return false;
}
});
viewDidLoad();
}
4.5 CONCLUSÕES
5 CONSIDERAÇÕES FINAIS
// Em Objective-C
int maze[9];
// Em Java
int[] maze = new int[9];
O iPhone conta apenas com um botão físico que serve para sair da
aplicação. Dessa forma todo o fluxo de navegação de telas deve ser
implementado pelo desenvolvedor. Os dispositivos Android por sua vez,
contam com uma tecla física para voltar de uma tela para a anterior. Eles
também contam com outra tecla que permite voltar diretamente para a tela
principal do aparelho. Atualmente, a tecla de voltar não está realizando o
comportamento de voltar para a tela anterior, ao invés disso, ela fecha a
aplicação convertida independente da tela que estiver sendo exibida;
REFERÊNCIAS
ARIMA, Katia, Smartphone para todos: Do iPhone ao Xing Ling vendido na esquina,
os smartphones entram para escalação oficial de cada vez mais brasileiros. Info
Exame 293ª edição, jul. 2010, p.23-28.
CARTON, Paul. CRUMRINE, Jean. New survey shows Android OS roiling the smart
phone market. jan. 2010. Disponível em:
<http://www.changewaveresearch.com/articles/2010/01/smart_phone_20100104.htm
l>. Acessado em: 26 jan. 2010.
GARDNER, David. Cresce demanda por aplicativos móveis. set. 2010. Disponível
em: <http://www.itweb.com.br/noticias/index.asp?cod=71665>. Acessado em: 10 set.
2010.
JAMES, Chris. Where to Play the Mobile Game: A Closer Look at the Leading
Platforms. Casual Connect, Summer 2010, p.42-44.
MCLAUGHLIN, Brett D.; POLLICE Gary; WEST, David. Head First Object-Oriented
Analysis & Design. O‟Reilly, 2007.
PILONE, Dan; PILONE, Tracey. Head First iPhone Development. O‟Reilly, 2009.
TYNAN, Dan. The 50 Greatest Gadgets of the Past 50 Years. dez. 2005. Disponível
em: <http://www.pcworld.com/article/123950-
6/the_50_greatest_gadgets_of_the_past_50_years.html>. Acesso em: 26 jan. 2010.
65
The Nielsen Company. Android Soars, but iPhone Still Most Desired as Smartphones
Grab 25% of U.S. Mobile Market. Ago. 2010. Disponível em:
<http://blog.nielsen.com/nielsenwire/online_mobile/android-soars-but-iphone-still-
most-desired-as-smartphones-grab-25-of-u-s-mobile-market/> Acesso em: 01 set.
2010.
The Nielsen Company. Android Most Popular Operating System in U.S. Among
Recent Smartphone Buyers. Out. 2010. Disponível em:
<http://blog.nielsen.com/nielsenwire/online_mobile/android-most-popular-operating-
system-in-u-s-among-recent-smartphone-buyers/>
SIERRA, Kathy; BATES, Bert. Sun Certified Programmer for Java 6: Study Guide.
McGraw-Hill, 2008.
STARK, Jonathan. Building Android Apps with HTML, CSS, and JavaScript.
Sebastopol, CA: O‟Reilly, 2010.