Desenvolvimento para dispositivos
móveis
JavaME
Marcio Seiji Oyamada
Aula 1
UNIOESTE – Universidade Estadual do Oeste do Paraná
Curso de Informática
Cascavel - Brasil
IWS'2009 - Buenos AiresPage � 2
Introdução
� Ementa– Conceituação de mobilidade e tipos de dispositivos
móveis. Tecnologias e ferramentas para desenvolvimento de aplicações móveis, CLDC e CDC. Persistência e Comunicação de Dados.
� Objetivos– Capacitar o aluno a desenvolver aplicações em
dispositivos móveis utilizando a plataforma Java.
� Carga horária:– 24 horas
IWS'2009 - Buenos AiresPage � 3
Conteúdo programático
I – Mobilidade
II - Plataforma J2ME – CLDC, CDC, MIDP
III – Persistência
IV – Comunicação de Dados
IWS'2009 - Buenos AiresPage � 4
Introdução
�Plataformas Java
– J2ME (Java ME): versão Java para dispositivos móveis
• Poucos recursos
IWS'2009 - Buenos AiresPage � 6
Configurações- CDC
�Define a capacidade da JVM e as API que fazem parte do núcleo destas
�CDC (Connected Device Configuration)– 512 kilobytes (mínimo) de memória para execução Java
– 256 kilobytes (mínimo) para alocação em tempo de execução
– Conectividade, possivelmente persistente e em banda larga
– Ex: set-top box, sistema de navegação automotiva
IWS'2009 - Buenos AiresPage � 7
Configurações - CLDC
�CLDC – Connected limited device configuration
– 128 kilobytes memória para executar o Java
– 32 kilobytes memória para execução e alocação em tempo de execução
– Interface com usuário restrita
– Low power, normalmente usando bateria
– Conectividade, normalmente sem fio, com acesso de baixa velocidade e intermitente
– Ex: telefones, pagers
IWS'2009 - Buenos AiresPage � 8
Configurações CLDC (2)
�KVM– Implementação de referência para o CLDC
– Restrições
• Nenhum método nativo pode ser adicionado em tempo de execução. Métodos nativos são definidos em tempo de projeto na KVM
• O verificador de bytecode não implementa todas as funcionalidades (afeta a segurança)
– CLDC 1.0
– CLDC 1.1: suporte ponto flutuante
IWS'2009 - Buenos AiresPage � 9
Profiles
�É uma “extensão” de uma configuração
�Define um conjunto de APIs e bibliotecas para o desenvolvimento de aplicações em uma família de dispositivos
�MIDP: mobile information device profile– Componentes de interface com o usuário
– Entrada e manipulação de eventos
– Armazenamento persistente
– Rede e timers
IWS'2009 - Buenos AiresPage � 10
MIDP
�MIDP 2.0 (JSR118)
– Mínimo de 256 KB de ROM para o MIDP(adicionalmente ao requerido pelo CLDC)
– Mínimo de 128KB de RAM para a execução da máquina virtual
– Mínimo de 8KB de memória não volátil (dados persistentes)
– Tela de no mínimo 96×54 pixels
– Alguma capacidade para entrada de dados
– Conexão de rede, possivelmente intermitente
IWS'2009 - Buenos AiresPage � 11
Camadas Java ME
Sistema Operacional
JVM
Aplicação
Sistema Operacional
Máquina virtual – KVM
Configuração - CLDC
Profile - MIDP
Aplicação
IWS'2009 - Buenos AiresPage � 13
JTWI
�Profusão de configurações, profiles e API opcionais
�Qual é a configuração básica de um dispositivo móvel?
�JTWI- Java Technology for Wireless Industry
– CLDC 1.0
– MIDP 2.0
– WMA: Wireless message API JSR 120
– Mobile Media API (se tiver som e video)
IWS'2009 - Buenos AiresPage � 15
MIDlet
�Aplicações MIDP são chamadas de MIDlet
�Em ultima análise: é Java!!
�Ciclo de vida de um MIDlet
– startApp()
– pauseApp()
– destroyApp()
IWS'2009 - Buenos AiresPage � 17
Exemplo de MIDlet
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class AlertExample extends MIDlet {
public void startApp() {
Displayable d = new TextBox("TextBox", "Commander", 20, TextField.EMAILADDR);
Command c = new Command("Exit", Command.EXIT, 1);
d.addCommand(c);
d.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable s) {
System.out.println(c.getLabel());
notifyDestroyed();
}
} );
Display.getDisplay(this).setCurrent(d);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
IWS'2009 - Buenos AiresPage � 18
Exemplo de MIDLET (1)
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class AlertExample extends MIDlet {
public void startApp() {
Displayable d = new TextBox("TextBox", "Commander", 20, TextField.EMAILADDR);
Command c = new Command("Exit", Command.EXIT, 1);
d.addCommand(c);
d.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable s) {
System.out.println(c.getLabel());
notifyDestroyed();
}
} );
Display.getDisplay(this).setCurrent(d);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Imports das APIs Midlet
IWS'2009 - Buenos AiresPage � 19
Exemplo de MIDlet(2)
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class AlertExample extends MIDlet {
public void startApp() {
Displayable d = new TextBox("TextBox", "Commander", 20, TextField.EMAILADDR);
Command c = new Command("Exit", Command.EXIT, 1);
d.addCommand(c);
d.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable s) {
System.out.println(c.getLabel());
notifyDestroyed();
}
} );
Display.getDisplay(this).setCurrent(d);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
A classe deve herdar da classe MIDlet
IWS'2009 - Buenos AiresPage � 20
Exemplo de MIDlet(3)
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class AlertExample extends MIDlet {
public void startApp() {
Displayable d = new TextBox("TextBox", "Commander", 20, TextField.EMAILADDR);
Command c = new Command("Exit", Command.EXIT, 1);
d.addCommand(c);
d.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable s) {
System.out.println(c.getLabel());
notifyDestroyed();
}
} );
Display.getDisplay(this).setCurrent(d);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Métodos padrão para iniciar, pausar e finalizar a
MIDlet
IWS'2009 - Buenos AiresPage � 21
Compilando um MIDlet
�Cross-compiler: compilação em uma arquitetura e execução em outra
�No caso do JAVA: devido a portabilidade, o processo é muito semelhante a compilação de uma aplicação local
�Porém, um MIDlet utiliza classes específicas JavaME, que são diferentes das classes JavaSE
�javac –bootclasspath /midp/classes AlertExample.java
IWS'2009 - Buenos AiresPage � 22
Pré-verificação do código
�Na JVM toda classe Java é pré-verificada antes de ser carregada, para evitar ataques a máquina virtual
�A pré-verificação é complexa, e inviável de ser realizada online em dispositivos móveis
�Desta forma, os MIDlet devem ser pré-verificados em 2 passos:– Passo offline (desktop): um pré-verificador é utilizado, e adiciona
alguns dados na classe para informar a KVM que o mesmo foi pré-verificado
– Passo online (dispositivo): durante a carga da aplicação no dispositivo móvel um verificador de menor complexidade é utilizado, baseando-se nos dados gerados previamente durante a pré-verificação
• Se uma aplicação não foi pré-verificada, a execução é rejeitada
IWS'2009 - Buenos AiresPage � 23
Preverifier
�Preverifier –classpath /midp/classes;. . AlertExample
�O pré-verificador utiliza como entrada um arquivo class e gera um outro arquivo class, com o código pré-verificado
IWS'2009 - Buenos AiresPage � 24
Empacotando um MIDlet
�Um MIDlet deve ser empacotado em um arquivo JAR (Java Archive)
– Ex: jar cvmf extra.mf Test.jar Test.class
�Manifesto: arquivo contendo informações sobre o pacote
– MIDlet-1: Test, , Test
– MIDlet-Name: Test
– MIDlet-Vendor: Joao
– MIDlet-Version: 1.0
– MicroEdition-Configuration: CLDC-1.0
– MicroEdition-Profile: MIDP-2.0
IWS'2009 - Buenos AiresPage � 25
Empacotando um MIDlet(2)
�Descritor do MIDlet: arquivo do .jad– Contém informações sobre o MIDlet, porém em um arquivo separado
– Basicamente as mesmas informações sobre o MIDlet
• MIDlet-1: Test, , Test
• MIDlet-Jar-Size: 2347
• MIDlet-Jar-URL: Test.jar
• MIDlet-Name: Test
• MIDlet-Vendor: Joao
• MIDlet-Version: 1.0
• MicroEdition-Configuration: CLDC-1.0
• MicroEdition-Profile: MIDP-2.0
IWS'2009 - Buenos AiresPage � 26
Ofuscador de código
� Utilizado originalmente para complicar a tarefa de disassembler
1) Renomeação de classes, atributos e métodos para nomes mais compactos
2) Remove classes não utilizadas, métodos e atributos
3) Insere dados ilegais ou questionáveis para confundir o disassembler
� Auxilia na construção de código compacto (devido a 1 e 2)
� Utilizar somente na versão de distribuição. Durante o desenvolvimento dificultará o debug
IWS'2009 - Buenos AiresPage � 27
Instalando aplicativos
�Cabo (serial/usb)
�Infravermelho/Bluetooth
�OTA: Over-the-air
– Armazenar o midlet no servidor Web: arquivos Jar e Jad
– Configurar no servidor os tipos Jar e Jad• JAR: application/java-archive• JAD: text/vnd.sun.j2me.app-descriptor
– Acessar a página através do browser do dispositivo
IWS'2009 - Buenos AiresPage � 28
Desenvolvimento em JavaME
�Código compacto: – simplicidade
– utilizar somente as classes necessárias
�Minimizar o uso da memória– Utilizar tipos escalares
– Auxiliar o garbage collector (aponte objetos para null, quando não mais necessário)
– Instancie objetos somente quando necessário
– Libere recursos rapidamente