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 !
1. Développement avec
Java Micro Edition
Toulouse JUG, 12 mai 2009
Sylvain Wallez
sylvain@bluxte.net
2. Sylvain Wallez
p CTO de Goojet
Dé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/
3. Agenda
p Panorama du monde mobile
p Parts de marché
p Typologie des téléphones
p JavaME
p Aperçu des APIs
p Processus de développement
p Problèmes du "vrai" monde
p Conclusion
4. 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
5. Panorama : tailles d'écran
Résolution : de 38k à 380k pixels
176 x 220 240 x 320 320 x 480 480 x 640 480 x800
(QVGA) (HVGA) (VGA) (WVGA)
6. Panorama : modes d'interaction
Touches (ou pas) et joystick
D-Pad ou joystick, Ecran tactile avec stylet
deux touches "soft menu", soft keyboard, D-Pad.
boutons "home" et "back"
Trackball cliquable,
Trackball cliquable, Ecran tactile,
un bouton "menu",
un bouton "menu", soft keyboard,
un bouton "back"
un bouton "back" bouton "home"
7. Panorama : systèmes d'exploitation
p Symbian p iPhone OS
p Smartphones Nokia, p iPhone, iPod
SonyEricsson, Samsung p Android
p "Series 40" p HTC
pNokia p A venir : Samsung,
p Windows mobile SonyEricsson, Motorola
p HTC, smartphones p Systèmes "inconnus"
Samsung & Motorola p Samsung, LG, Motorola,
p RIM Alcatel, etc.
p BlackBerry
8. JavaME - Introduction
p JavaME = Java pour les petits appareils
p Téléphones mobiles
p Matériel embarqués
p Décodeurs, Passerelles résidentielles
p JavaME est modulaire
p Configuration (puissance du terminal)
p Profil (type de terminal)
p APIs optionnelles (carnet d'adresse, localisation, 3D, etc.)
10. JavaME - Introduction
p Sur les téléphones
p CLDC : connected limited device configuration
p Classes de base, connectivité réseau
p MIDP : Mobile Information Device Profile
p API graphique de base : formulaires et canvas
p Specs minimales :
p 128 ko de RAM, écran 96x54 noir et blanc
11. JavaME - Introduction
p Les APIs optionnelles
p 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
12. Applet, Servlet... MIDlet !
p MIDlet
p La classe "main" d'une application MIDP
p Dérive de javax.microedition.midlet.MIDlet
→ Cycle de vie défini par des méthodes abstraites
13. Aperçu de MIDP
p Interface graphique : deux API
p API de haut niveau
p Form, TextField, DateField, Choice...
p Fonctionne partout, mais graphiquement très limité
p API de bas niveau
p Canvas : une surface pour dessiner
p Gestion manuelle des événements clavier
p Dépend du téléphone (taille d'écran, couleurs,
transparence, etc.)
14. Aperçu de MIDP
p API graphique de haut niveau
p La Form est un conteneur
p On y ajoute des "Item"
public class MyForm extends Form {
public class MyForm extends Form {
private TextField name;
private TextField name;
private TextField password;
private TextField password;
public MyForm(String title) {
public MyForm(String title) {
super(title);
super(title);
name = new TextField("Name:", "", 20, TextField.ANY);
name = new TextField("Name:", "", 20, TextField.ANY);
password = new TextField("Password:", "", 20, TextField.PASSWORD);
password = new TextField("Password:", "", 20, TextField.PASSWORD);
append(name);
append(name);
append(password);
append(password);
}
}
}
}
15. Aperçu de MIDP
p API graphique de bas niveau
p Ligne, rectangle, arc de cercle
p Texte : 2 polices, 3 tailles
p Et c'est tout !
class MyCanvas extends Canvas {
class MyCanvas extends Canvas {
public MyCanvas() {
public MyCanvas() {
super.setFullScreenMode(true);
super.setFullScreenMode(true);
}
}
public void paint(Graphics g) {
public void paint(Graphics g) {
g.setColor(255, 0, 0);
g.setColor(255, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0, 0, 0);
g.setColor(0, 0, 0);
g.drawString("Hello There", getWidth() / 2, 0, Graphics.TOP | Graphics.HCENTER);
g.drawString("Hello There", getWidth() / 2, 0, Graphics.TOP | Graphics.HCENTER);
}
}
}
}
16. Aperçu de MIDP
p API graphique pour les jeux
p Layers et tiles : dessin et animation du décor
p Sprite : multiples objets, détection de collision
Sprite
TiledLayer
Sprite
17. Aperçu de MIDP
p Librairies graphiques tierces
p Compensent la pauvreté des
APIs de base
p Offre open source assez réduite
p LWUIT (GPL + classpath exception)
→https://lwuit.dev.java.net/
p J2MEPolish (GPL/commercial)
→http://j2mepolish.org/
p Kuix (GPL/commercial)
→http://kalmeo.org/
18. Processus de développement
p Deux fichiers : jad (descripteur) et jar
Fichiers source
MyMidlet.java image.png MyMidlet.jad
①
javac MyMidlet.jar
②
MyMidlet.class jar
obfuscator
preverify
MyMidlet.class MyMidlet.jar
19. Processus de développement
p Prévérification
p 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 passes
p Nécessite une passe et 10 ko de RAM
p Obfuscateur
p Compactage des symboles
p Suppression des éléments inutiles
→ En général, réduction de plus de 50% !
20. Processus de développement
p Outillage
p Sun Wireless Toolkit (WTK)
p Emulateur avec toutes les APIs optionnelles
p EclipseME
p Editeur syntaxique pour le .jad, précompilateur
p MicroEmulator
p Emulateur léger, fonctionne en Applet
p Antenna
p Tâches Ant
p Proguard
p "The" obfuscator
22. La fragmentation
p Fragmentation = différences entre téléphones
p Taille d'écran, de police de caractères
p Saisie au clavier, écran tactile
p APIs optionnelles non indispensables
p Bugs des téléphones...
p Différentes techniques :
p Versions spécifiques de l'application
p Configuration dynamique à l'exécution
23. La fragmentation
p Versions spécifiques
p Branches séparées → maintenance complexe et coûteuse
p Solution : preprocessing à la C
→ Plusieurs versions à partir d'un même source
public void callURL(String url) throws Exception {
public void callURL(String url) throws Exception {
//#if blackberry
//#if blackberry
if (url.startsWith("http")) {
if (url.startsWith("http")) {
Browser.getDefaultSession().displayPage(url);
Browser.getDefaultSession().displayPage(url);
} else if (url.startsWith("tel:")) {
} else if (url.startsWith("tel:")) {
String msisdn = url.substring( "tel:".length() );
String msisdn = url.substring( "tel:".length() );
PhoneArguments call = new PhoneArguments(PhoneArguments.ARG_CALL, msisdn);
PhoneArguments call = new PhoneArguments(PhoneArguments.ARG_CALL, msisdn);
Invoke.invokeApplication(Invoke.APP_TYPE_PHONE, call);
Invoke.invokeApplication(Invoke.APP_TYPE_PHONE, call);
} else {
} else {
throw new ConnectionNotFoundException();
throw new ConnectionNotFoundException();
}
}
//#else
//#else
if (platformRequest(url)) {
if (platformRequest(url)) {
GoojetBrowser.INSTANCE.destroyApp(true);
GoojetBrowser.INSTANCE.destroyApp(true);
}
}
//#endif
//#endif
}
}
24. La fragmentation
p Provisioning platform
p Fournir la bonne version à chaque mobile
p Identification du modèle par le User-Agent
p WURFL : wireless universal resource file
p Effort communautaire des développeurs sur mobile
→ http://wurfl.sourceforge.net/
p 10000 modèles, 500 caractéristiques
25. La fragmentation
p Configuration dynamique
p Choix d'une classe selon les propriétés systèmes ou
l'existence de classes d'une API
try {
try {
Class.forName("javax.wireless.messaging.MessageConnection");
Class.forName("javax.wireless.messaging.MessageConnection");
browser.messaging = (Messaging)Class.forName("com.goojet.WMAMessaging").newInstance();
browser.messaging = (Messaging)Class.forName("com.goojet.WMAMessaging").newInstance();
} catch(Throwable e) {
} catch(Throwable e) {
browser.messaging = new HttpMessaging();
browser.messaging = new HttpMessaging();
System.out.println("No WMA");
System.out.println("No WMA");
}
}
p Avantage : limite le nombre de versions
p Inconvénient : embarque du code inutilisé
26. Optimisation
p Trois axes d'optimisation
p Taille de l'application
p Réduire le temps de téléchargement
p Limiter l'occupation sur le téléphone
p Performance
p Petit processeur, JVM limitée
p Mémoire
p Peu de mémoire, garbage collector lent et bloquant
30. Conclusion
p Mobile : un domaine complexe
p Beaucoup de modèles aux capacités très variables
p Etat actuel
p JavaME : vieillissant, mais encore là pour plusieurs années
p Problèmes de fragmentation
p iPhone et Android : plateformes émergentes
p Fragmentation "ultime" : aucune compatibilité entre systèmes
31. Conclusion
p Quand faire un développement JavaME ?
p Quand ça doit fonctionner partout
p Quand c'est une application "riche"
p Autre solution : l'application web
p Généralisation de l'accès 3G
p Mais énorme fragmentation des browsers
p Pas d'accès aux ressources natives (photos, address book)