développement avec java micro edition
Post on 28-Nov-2014
1.340 Views
Preview:
DESCRIPTION
TRANSCRIPT
Développement avecJava Micro Edition
Toulouse JUG, 12 mai 2009
Sylvain Wallezsylvain@bluxte.net
Sylvain Wallez
p CTO de GoojetDécouvrir et partager le web mobile
→ http://goojet.com/
p Anciennement architecte de Joost,cofondateur et CTO d'Anyware Technologies
p Expert open source et technologies web,Membre de la Fondation Apache
p Blog, Twitter, Facebook, LinkedIn, etc
→ http://bluxte.net/
Agenda
p Panorama du monde mobilep Parts de marchép Typologie des téléphones
p JavaMEp Aperçu des APIsp Processus de développementp Problèmes du "vrai" monde
p Conclusion
Panorama : parts de marché
p En unités vendues (millions)
Nokia ≈ 40% du marché
Marque Q4 2008 Q3 2008 Q4 07 Evolution
Nokia 113.1 117.8 133.5 -15%
Samsung 52.8 51.8 46.3 +14%
LG 25.7 23.0 23.7 +8
SonyEricsson 24.2 25.7 30.8 -21
Motorola 19.0 25.4 40.9 -54
BlackBerry 6.7
Apple 4.4
Source : Reuters
Panorama : tailles d'écran
Résolution : de 38k à 380k pixels
176 x 220 240 x 320(QVGA)
320 x 480(HVGA)
480 x 640(VGA)
480 x800(WVGA)
Panorama : modes d'interaction
Touches (ou pas) et joystick
D-Pad ou joystick,deux touches "soft menu",boutons "home" et "back"
Trackball cliquable,un bouton "menu",un bouton "back"
Ecran tactile,soft keyboard,bouton "home"
Ecran tactile avec styletsoft keyboard, D-Pad.
Trackball cliquable,un bouton "menu",un bouton "back"
Panorama : systèmes d'exploitation
p Symbian
p Smartphones Nokia, SonyEricsson, Samsung
p "Series 40"
p Nokiap Windows mobile
p HTC, smartphones Samsung & Motorola
p RIMp BlackBerry
p iPhone OS
p iPhone, iPodp Android
p HTCp A venir : Samsung,
SonyEricsson, Motorolap Systèmes "inconnus"
p Samsung, LG, Motorola, Alcatel, etc.
JavaME - Introduction
p JavaME = Java pour les petits appareilsp Téléphones mobilesp Matériel embarquésp Décodeurs, Passerelles résidentielles
p JavaME est modulairep Configuration (puissance du terminal)p Profil (type de terminal)p APIs optionnelles (carnet d'adresse, localisation, 3D, etc.)
JavaME - Introduction
p Architecture : la "stack" JavaME
JavaME - Introduction
p Sur les téléphonesp CLDC : connected limited device configuration
p Classes de base, connectivité réseau
p MIDP : Mobile Information Device Profilep API graphique de base : formulaires et canvas
p Specs minimales :p 128 ko de RAM, écran 96x54 noir et blanc
JavaME - Introduction
p Les APIs optionnellesp Trop spécifiques pour être comprises dans une
configuration ou un profil
p Exemples :p Carnet d'adresses – PDA API (JSR 75)p Envoi et réception de SMS – WMA API (JSR 120)p Photo et video – MMA API (JSR 135)p Mobile 3D graphics – M3G (JSR 184)p Geo-localisation – JSR 179
Applet, Servlet... MIDlet !
p MIDletp La classe "main" d'une application MIDPp Dérive de javax.microedition.midlet.MIDlet
→ Cycle de vie défini par des méthodes abstraites
Aperçu de MIDP
p Interface graphique : deux API
p API de haut niveaup Form, TextField, DateField, Choice...p Fonctionne partout, mais graphiquement très limité
p API de bas niveaup Canvas : une surface pour dessinerp Gestion manuelle des événements clavierp Dépend du téléphone (taille d'écran, couleurs,
transparence, etc.)
Aperçu de MIDP
p API graphique de haut niveaup La Form est un conteneurp On y ajoute des "Item"
public class MyForm extends Form { private TextField name; private TextField password; public MyForm(String title) { super(title); name = new TextField("Name:", "", 20, TextField.ANY); password = new TextField("Password:", "", 20, TextField.PASSWORD); append(name); append(password); }}
public class MyForm extends Form { private TextField name; private TextField password; public MyForm(String title) { super(title); name = new TextField("Name:", "", 20, TextField.ANY); password = new TextField("Password:", "", 20, TextField.PASSWORD); append(name); append(password); }}
Aperçu de MIDP
p API graphique de bas niveaup Ligne, rectangle, arc de cerclep Texte : 2 polices, 3 taillesp Et c'est tout !
class MyCanvas extends Canvas {
public MyCanvas() { super.setFullScreenMode(true); } public void paint(Graphics g) { g.setColor(255, 0, 0); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0, 0, 0); g.drawString("Hello There", getWidth() / 2, 0, Graphics.TOP | Graphics.HCENTER); }}
class MyCanvas extends Canvas {
public MyCanvas() { super.setFullScreenMode(true); } public void paint(Graphics g) { g.setColor(255, 0, 0); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0, 0, 0); g.drawString("Hello There", getWidth() / 2, 0, Graphics.TOP | Graphics.HCENTER); }}
Aperçu de MIDP
p API graphique pour les jeuxp Layers et tiles : dessin et animation du décorp Sprite : multiples objets, détection de collision
Sprite
Sprite
TiledLayer
Aperçu de MIDP
p Librairies graphiques tiercesp Compensent la pauvreté des
APIs de base
p Offre open source assez réduitep LWUIT (GPL + classpath exception)
→https://lwuit.dev.java.net/
p J2MEPolish (GPL/commercial)
→http://j2mepolish.org/
p Kuix (GPL/commercial)
→http://kalmeo.org/
Fichiers source
Processus de développement
MyMidlet.java MyMidlet.jadimage.png
javac
preverify
MyMidlet.class MyMidlet.jar
MyMidlet.class
②
①
MyMidlet.jar
jar
obfuscator
p Deux fichiers : jad (descripteur) et jar
Processus de développement
p Prévérificationp Une JVM vérifie toujours les classes à éxécuter
p Nécessite plusieurs passes et 100 à 150 ko de RAM
p On ajoute dans le .class le résultat des premières passesp Nécessite une passe et 10 ko de RAM
p Obfuscateurp Compactage des symbolesp Suppression des éléments inutiles
→ En général, réduction de plus de 50% !
Processus de développement
p Outillagep Sun Wireless Toolkit (WTK)
p Emulateur avec toutes les APIs optionnelles
p EclipseMEp Editeur syntaxique pour le .jad, précompilateur
p MicroEmulatorp Emulateur léger, fonctionne en Applet
p Antennap Tâches Ant
p Proguardp "The" obfuscator
Problématiquesdu "vrai" monde
La fragmentation
p Fragmentation = différences entre téléphonesp Taille d'écran, de police de caractèresp Saisie au clavier, écran tactilep APIs optionnelles non indispensablesp Bugs des téléphones...
p Différentes techniques :p Versions spécifiques de l'applicationp Configuration dynamique à l'exécution
La fragmentation
p Versions spécifiquesp Branches séparées → maintenance complexe et coûteusep Solution : preprocessing à la C
→ Plusieurs versions à partir d'un même source
public void callURL(String url) throws Exception {
//#if blackberry if (url.startsWith("http")) { Browser.getDefaultSession().displayPage(url); } else if (url.startsWith("tel:")) { String msisdn = url.substring( "tel:".length() ); PhoneArguments call = new PhoneArguments(PhoneArguments.ARG_CALL, msisdn); Invoke.invokeApplication(Invoke.APP_TYPE_PHONE, call); } else { throw new ConnectionNotFoundException(); } //#else if (platformRequest(url)) {
GoojetBrowser.INSTANCE.destroyApp(true);}
//#endif}
public void callURL(String url) throws Exception {
//#if blackberry if (url.startsWith("http")) { Browser.getDefaultSession().displayPage(url); } else if (url.startsWith("tel:")) { String msisdn = url.substring( "tel:".length() ); PhoneArguments call = new PhoneArguments(PhoneArguments.ARG_CALL, msisdn); Invoke.invokeApplication(Invoke.APP_TYPE_PHONE, call); } else { throw new ConnectionNotFoundException(); } //#else if (platformRequest(url)) {
GoojetBrowser.INSTANCE.destroyApp(true);}
//#endif}
La fragmentation
p Provisioning platformp Fournir la bonne version à chaque mobilep Identification du modèle par le User-Agent
p WURFL : wireless universal resource filep Effort communautaire des développeurs sur mobile
→ http://wurfl.sourceforge.net/p 10000 modèles, 500 caractéristiques
La fragmentation
p Configuration dynamiquep Choix d'une classe selon les propriétés systèmes ou
l'existence de classes d'une API
p Avantage : limite le nombre de versionsp Inconvénient : embarque du code inutilisé
try { Class.forName("javax.wireless.messaging.MessageConnection"); browser.messaging = (Messaging)Class.forName("com.goojet.WMAMessaging").newInstance();} catch(Throwable e) { browser.messaging = new HttpMessaging(); System.out.println("No WMA");}
try { Class.forName("javax.wireless.messaging.MessageConnection"); browser.messaging = (Messaging)Class.forName("com.goojet.WMAMessaging").newInstance();} catch(Throwable e) { browser.messaging = new HttpMessaging(); System.out.println("No WMA");}
Optimisation
p Trois axes d'optimisationp Taille de l'application
p Réduire le temps de téléchargementp Limiter l'occupation sur le téléphone
p Performancep Petit processeur, JVM limitée
p Mémoirep Peu de mémoire, garbage collector lent et bloquant
Test, test, test !
Test, test, test !
Plus de 1000 téléphones chez pacamobilecenter.com
Conclusion
Conclusion
p Mobile : un domaine complexep Beaucoup de modèles aux capacités très variables
p Etat actuelp JavaME : vieillissant, mais encore là pour plusieurs années
p Problèmes de fragmentation
p iPhone et Android : plateformes émergentesp Fragmentation "ultime" : aucune compatibilité entre systèmes
Conclusion
p Quand faire un développement JavaME ?p Quand ça doit fonctionner partoutp Quand c'est une application "riche"
p Autre solution : l'application webp Généralisation de l'accès 3Gp Mais énorme fragmentation des browsersp Pas d'accès aux ressources natives (photos, address book)
Questions ?
Réponses !
top related