32
Développement avec Java Micro Edition Toulouse JUG, 12 mai 2009 Sylvain Wallez [email protected]

Développement avec Java Micro Edition

Embed Size (px)

DESCRIPTION

La toute première présentation du Toulouse-JUG le 13 mai 2009 ! Le développement sur mobile en J2ME : contraintes, techniques, difficultés, outils et... une pléthore de téléphones pour les tests !

Citation preview

Page 1: Développement avec Java Micro Edition

Développement avecJava Micro Edition

Toulouse JUG, 12 mai 2009

Sylvain [email protected]

Page 2: Développement avec Java Micro Edition

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/

Page 3: Développement avec Java Micro Edition

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

Page 4: Développement avec Java Micro Edition

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

Page 5: Développement avec Java Micro Edition

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)

Page 6: Développement avec Java Micro Edition

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"

Page 7: Développement avec Java Micro Edition

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.

Page 8: Développement avec Java Micro Edition

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.)

Page 9: Développement avec Java Micro Edition

JavaME - Introduction

p Architecture : la "stack" JavaME

Page 10: Développement avec Java Micro Edition

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

Page 11: Développement avec Java Micro Edition

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

Page 12: Développement avec Java Micro Edition

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

Page 13: Développement avec Java Micro Edition

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.)

Page 14: Développement avec Java Micro Edition

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); }}

Page 15: Développement avec Java Micro Edition

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); }}

Page 16: Développement avec Java Micro Edition

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

Page 17: Développement avec Java Micro Edition

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/

Page 18: Développement avec Java Micro Edition

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

Page 19: Développement avec Java Micro Edition

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% !

Page 20: Développement avec Java Micro Edition

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

Page 21: Développement avec Java Micro Edition

Problématiquesdu "vrai" monde

Page 22: Développement avec Java Micro Edition

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

Page 23: Développement avec Java Micro Edition

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}

Page 24: Développement avec Java Micro Edition

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

Page 25: Développement avec Java Micro Edition

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");}

Page 26: Développement avec Java Micro Edition

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

Page 27: Développement avec Java Micro Edition

Test, test, test !

Page 28: Développement avec Java Micro Edition

Test, test, test !

Plus de 1000 téléphones chez pacamobilecenter.com

Page 29: Développement avec Java Micro Edition

Conclusion

Page 30: Développement avec Java Micro Edition

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

Page 31: Développement avec Java Micro Edition

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)

Page 32: Développement avec Java Micro Edition

Questions ?

Réponses !