Envie de faire un peu de développement Android?
Un ami me demande
J’ai subitement envie de me remettre un peu à faire du dev. Je commencerais bien par un application Android qui se connecte à un service REST. Tu me conseilles quoi?
Gestion de source
Avant de démarrer le projet, ce n’est pas parce que tu fais un truc dans ton coin, qu’il ne faut pas gérer sérieusement les sources. Je te recommande bitbucket, qui offre un dépôt git (à la mode) ou Mercurial (que je trouvais meilleur) avec intégration sur le bug tracker. L’hébergement peut être privé, même dans l’offre gratuite.
Client-Serveur
Encapsulation, …; ou pas
Pour les échanges de données entre le client mobile et le serveur, REST me semble une évidence.
Il n’y a pas de support SOAP dans Android, si tu veux absolument en faire tu es bon pour du out.print(“
Et SOAP n’est plus pérenne, de toute façon…;
Format d’échange
Ensuite, tu peux faire du XML ou du Json. Les 2 fonctionnent bien.
- Le JSon est sans aucun doute moins verbeux. Il est peut-être un chouia plus simple à produire côté serveur (par exemple en python). Sur Android, la bibliotthèque Json rend sa consommation très simple.
- Le XML est verbeux, ce qui n’est pas un atout lors d’une connexion GPS/3G. Il favorise le typage des éléments, ce qui est un atout pour communiquer avec des services tiers. Pour les échanges plus volumineux, l’implémentation SAX d’un ContentHandler est sans doute la façon la moins consommatrice en termes de mémoire pour traiter le flux de données.
Serveur
Soit tu utiliser un service tiers existant, soit tu développes le tien.
Un service existant
Dans ce cas, rien à développer, évidemment 🙂 L’avantage, est que tu te concentres sur ton client, avec des web-services qui fonctionnent déjà, et qui répondent à un certain besoin.
Mon expérience est qu’en étant pas maître du service, tu peux être confronté à des limitations fonctionnelles.
- Par exemple, incidents-transports.com n’indique pas le type d’une ligne (est-ce un métro, un tramway, un RER?)
- par exemple, Google+ ne permet pas de poster
- De plus, les grosses API (Facebook, Google) demandent de plus en plus de s’authentifier, ce qui oblige à implémenter OAuth, et c’est loin d’être trivial
Ton propre service
Tu as le choix de la technologie, évidemment…;
- Avec un budget nul, tu peux partir sur du PHP, parce que les hébergements gratuits ou économiques sont légion
- Si tu n’a pas trop de sous mais du temps, tu peux faire du Google App Engine (GAE), en python ou en Java. Le code n’est plus portable, puisqu’il utilise le modèle MapReduce de la plateforme. Cependant, cela reste un bon choix pour héberger un service REST de type CRUD.
- Si tu as des sous, tu pars évidemment sur un environnement hébergé de ton choix.
Mon expérience récente, c’est que Python est un super langage côté serveur: Concis, efficace, simple.
Pour GAE, il faut bien comprendre que le DataStore n’est pas une base de données relationnelle, avec toutes les conséquences que cela entraîne1. De plus, les restrictions et limitations imposées par Google font que la plupart des frameworks ne marchent pas ou marchent mal, ce qui se traduit souvent par une belle perte de temps — ça va mieux depuis que certains frameworks sont forkés pour GAE.
Client Android
Environnement de développement
Pour Android, dans tous les cas, il faut le DSK SDK.
Concernant l’environnement de développement, le choix est assez restreint, et la seule plateforme outillée est Eclipse + Google ADT (Android development tools) que l’on trouve sur le « plugin site » https://dl-ssl.google.com/android/eclipse/
Tu peux jouer l’aventurier fortuné, et tenter IntelliJ for Android
Sur Netbeans, il n’y a pas d’outil de conception d’interface graphique. Donc, à moins de ne pas supporter les autres IDE, je ne vois pas d’intérêt à Netbeans.
Si tu penses toujours que Maven ne fait pas perdre de temps, il y a un plugin. Mais je ne te recommande pas cette option — on n’est pas sensé avoir 36 dépendances non plus dans une appli mobile.
Viser l’API Level 7
Tu sais que les systèmes Android sont fragmentés, et je conseille de te prendre minVersion=7. Sur la javadoc d’Android, il est possible de masquer les éléments qui ne fonctionnent que sur des niveaux plus élevés.
La complexité du développement Android
Côté Android, le framework s’est complexifié à chaque version (API Level 15 pour l’état de l’art), mais les composants de bases n’ont pas changé: et tu commenceras par les fondamentaux: l’Activity, qui correspond à un écran et l’Intent qui permet de démarrer un autre composant.
Dans ton exemple, pour synchroniser des données serveurs, tu vas devoir faire une connexion réseau longue:
- impossible à faire dans l’activité courante, car cela bloquerait le processus courant, et donc figerait l’application au point d’entraîner une erreur de type « Application Non Responsive » (pour éviter cette erreur de programmation, cela génère carrément une exception à partir de l’API 10)
- Tu peux créer un processus comme au bon vieux temps, mais le Thread est un peu pénible à gérer.
- Plus simplement, la documentation t’encourage à utiliser une AsyncTask, ce qui te permet de livrer un logiciel fonctionnel rapidement. Mais à terme, cette AsyncTask est une erreur, car elle est trop liée à l’activité qui l’a créée
- Pour faire proprement les choses, tu peux alors te pencher sur l’IntentService qui est un service fonctionnant dans un thread distinct et avec lequel on communique via Intent. C’est à mon avis la solution la plus élégante pour bien faire les choses.
- Si tu veux fournir la solution la plus robuste, y compris dans les scénarios déconnectés, tu vas créer un ContentProvider qui stocke les données localement à l’aide d’une base SQLite, un SyncAdapter qui effectue la connexion réseau et met à jour le ContentProvider en conséquence, et un Account parce que le framework l’exige pour afficher l’ensemble dans « Comptes et synchronisation ».
Je ne t’ai mis que quelques pointeurs, mais tu constates déjà qu’il y a un certain nombre de choses à ingurgiter…;
Gloablement
Tout ceci n’est pas fait pour te décourager, mais tout ça n’a rien de simple, surtout si tu veux faire les choses correctement.
Les commentaires sont bienvenus!
- Je viens de découvrir l’existence d’un Google Cloud SQL [↩]