SlideShare une entreprise Scribd logo

Développement avec Java Micro Edition

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  sur  32
Télécharger pour lire hors ligne
Développement avec
   Java Micro Edition

Toulouse JUG, 12 mai 2009

        Sylvain Wallez
      sylvain@bluxte.net
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/
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
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   320 x 480    480 x 640    480 x800
             (QVGA)      (HVGA)        (VGA)       (WVGA)
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"

Recommandé

Syntaxe concrète des DSL en IDM [avec Xtext]
Syntaxe concrète des DSL en IDM [avec Xtext]Syntaxe concrète des DSL en IDM [avec Xtext]
Syntaxe concrète des DSL en IDM [avec Xtext]Olivier Le Goaër
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieLoic Yon
 
Java ME - 01 - Overview
Java ME - 01 - OverviewJava ME - 01 - Overview
Java ME - 01 - OverviewAndreas Jakl
 

Contenu connexe

En vedette

En vedette (6)

J2 me 1
J2 me 1J2 me 1
J2 me 1
 
.NET DotNet CF - 1
.NET DotNet CF - 1.NET DotNet CF - 1
.NET DotNet CF - 1
 
Cours J2ME
Cours J2MECours J2ME
Cours J2ME
 
Teledetection Sig
Teledetection SigTeledetection Sig
Teledetection Sig
 
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
 
J2 me
J2 meJ2 me
J2 me
 

Similaire à Développement avec Java Micro Edition

L'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsL'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsThomas Bassetto
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewOSInet
 
Hacking your Home @bdx.io
Hacking your Home @bdx.ioHacking your Home @bdx.io
Hacking your Home @bdx.iolaurenthuet
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06Frédéric Harper
 
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascriptcodedarmor
 
Introduction à Android - Mars 2012
Introduction à Android - Mars 2012Introduction à Android - Mars 2012
Introduction à Android - Mars 2012Aurélien Guillard
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
TypeScript for dummies
TypeScript for dummiesTypeScript for dummies
TypeScript for dummiesMicrosoft
 
Mise en bouche a html5
Mise en bouche a html5Mise en bouche a html5
Mise en bouche a html5laurentt
 
Mise en bouche a html5
Mise en bouche a html5Mise en bouche a html5
Mise en bouche a html5laurentt
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBruno Bonnin
 

Similaire à Développement avec Java Micro Edition (20)

L'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsL'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objets
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TView
 
Hacking your Home @bdx.io
Hacking your Home @bdx.ioHacking your Home @bdx.io
Hacking your Home @bdx.io
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
JavaSwing.pdf
JavaSwing.pdfJavaSwing.pdf
JavaSwing.pdf
 
Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06
 
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
 
Introduction à Android - Mars 2012
Introduction à Android - Mars 2012Introduction à Android - Mars 2012
Introduction à Android - Mars 2012
 
Cross platform
Cross platformCross platform
Cross platform
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
TypeScript for dummies
TypeScript for dummiesTypeScript for dummies
TypeScript for dummies
 
Mise en bouche a html5
Mise en bouche a html5Mise en bouche a html5
Mise en bouche a html5
 
Mise en bouche a html5
Mise en bouche a html5Mise en bouche a html5
Mise en bouche a html5
 
Programmation sous Android
Programmation sous AndroidProgrammation sous Android
Programmation sous Android
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
 
Ogre 3D : une introduction
Ogre 3D : une introductionOgre 3D : une introduction
Ogre 3D : une introduction
 
Android introvf
Android introvfAndroid introvf
Android introvf
 

Plus de Sylvain Wallez

Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVMSylvain Wallez
 
Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGSylvain Wallez
 
Developing web applications in Rust
Developing web applications in RustDeveloping web applications in Rust
Developing web applications in RustSylvain Wallez
 
Black friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchBlack friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchSylvain Wallez
 
Elastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamElastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamSylvain Wallez
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Sylvain Wallez
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
Kibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackKibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackSylvain Wallez
 
2016 05 iot - apero web
2016 05 iot - apero web2016 05 iot - apero web
2016 05 iot - apero webSylvain Wallez
 
Brown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastBrown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastSylvain Wallez
 
Lucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiquesLucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiquesSylvain Wallez
 
2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open HardwareSylvain Wallez
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Sylvain Wallez
 

Plus de Sylvain Wallez (13)

Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVM
 
Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUG
 
Developing web applications in Rust
Developing web applications in RustDeveloping web applications in Rust
Developing web applications in Rust
 
Black friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchBlack friday logs - Scaling Elasticsearch
Black friday logs - Scaling Elasticsearch
 
Elastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamElastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering team
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Kibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackKibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stack
 
2016 05 iot - apero web
2016 05 iot - apero web2016 05 iot - apero web
2016 05 iot - apero web
 
Brown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastBrown Bag Lunch sur Hazelcast
Brown Bag Lunch sur Hazelcast
 
Lucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiquesLucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiques
 
2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
 

Développement avec Java Micro Edition

  • 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.)
  • 9. JavaME - Introduction p Architecture : la "stack" JavaME
  • 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
  • 28. Test, test, test ! Plus de 1000 téléphones chez pacamobilecenter.com
  • 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)