Evènements

DevFest 2012 : Le développement Android

Publié le : Auteur: Vincent PIARD Laisser un commentaire
evenement

Suite au DevFest 2012 qui a eu lieu en novembre dernier à Nantes, voici un petit retour sur la track Android. Nous allons d’abord aborder les bases de la programmation pour Android avant de faire un zoom sur la librairie Robospice.

Les bases du développement Android

Android comme toute nouvelle technologie a besoin d’un écosystème propice afin de grandir et de devenir plus robuste. Le succès d’un langage ou d’une technologie dépend souvent plus de la qualité de cet écosystème qui gravite autour que de la technologie en elle-même. Par écosystème, nous entendons tout ce qui permet la production de code facilité au sein de la plateforme Android. Cela peut aller de l’IDE à la documentation du Framework. De nombreux langages n’ont jamais rencontré le succès espéré, par exemple par la faute d’un IDE adapté et fiable. Du côté Android, celui-ci se base en priorité sur l’IDE Eclipse donc pas de souci là-dessus. L’objectif pour un nouveau développeur Android est de pouvoir produire une application robuste, rapide et qui respecte les normes des standards. Pour cela, le développeur devra donc s’aider de librairie afin de soulager son volume de code à produire.

Cela permet aussi d’intégrer à moindre coût les standards sans autre effort particulier que de se conforter aux spécifications d’implémentation de la librairie. Cerise sur le gâteau, beaucoup de librairies Android sont souvent open-source ce qui assure une certaine fiabilité du code ou du moins une certaine transparence. L’autre intérêt pour le développeur est de ne pas réinventer la roue pour la 1000ème fois.

Un atout dans à l’usage des librairies dans le monde Android est la possibilité de s’affranchir de l’utilisation de certains patterns qui peuvent parfois se révéler très complexes à utiliser, comme le pattern Rest (Robospice en allège entre autre la syntaxe).

Il y a trois manières d’utiliser une librairie au sein d’un projet Android :

  • Inclusion d’un jar dans notre application
  • Un projet Android au sein du même workspace inclus dans notre application
  • Accès à un intent

Prenons trente secondes pour parler du dernier point à ceux qui ne sont pas familier du monde Android. Un intent représente une intention, c’est bête à dire mais c’est ainsi. Le développeur peut indiquer à l’application son intention de téléphoner à travers l’appui d’un bouton. L’application indique alors son intention de téléphoner à travers le code suivant :

Uri callUri = Uri.parse("tel:0605040302");
returnIt = new Intent(Intent.ACTION_CALL, callUri);

L’application ne sait pas comment utiliser la capacité téléphone du mobile, c’est l’OS qui prend en charge cette partie et transforme l’intention en réalité. Donc de ce point de vue l’OS (grâce aux intent) se comporte donc comme une librairie pour l’application.

Après tout n’est pas rose dans l’utilisation des librairies, car contrairement au monde Java par exemple, il persiste de nombreux inconvénients :

  • Gestion des versions complexe
  • Gestion des conflits
  • Agrégation parfois compliquée
  • Poids de l’application pouvant grimper

Sur ce dernier point il ne faut pas oublier que l’utilisateur final devra vraisemblablement télécharger votre application depuis le Google Play avec son forfait Data. Il est donc déconseillé d’avoir une application pesant trop lourd (même si on peut la télécharger en wifi, les applications mobiles doivent être par nature légère).

Donc les librairies ne sont pas forcément une panacée, mais constituent quand même une solution à prendre en compte.

Sélection de librairies gratuites et open-source :

ActionBarSherlock

ActionBarSherlock a pour vocation de faciliter l’usage du pattern ActionBar introduit par Google en 2010, à travers l’utilisation d’une unique API que l’on soit sous mobile ou sous tablette. Cette libraire est en passe de devenir un incontournable des développements Android. Le github d’ActionBarSherlock.

ACRA

ACRA est une bibliothèque permettant à une application Android de remonter automatiquement un rapport d’erreur à une forme GoogleDoc en cas de crash de l’application. Il permet alors aux développeurs de comprendre les bugs résidant dans leur application. Cette librairie très légère (environ 4ko) est indispensable à tout développement Android. Elle vous fera gagner des heures de débogage.

Android Annotations

Android Annotations est une librairie Open Source qui permet d’accélérer le développement d’Android. Il s’occupe de gérer la plomberie et vous n’avez qu’à vous concentrer sur ce qui est vraiment important. En simplifiant votre code, il facilite sa maintenance. Cette librairie très puissante permet certains raccourcis de coding très agréable.Par exemple pour récupérer un EditText, le développeur doit procéder ainsi :

EditText search;
@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   search = (EditText) findViewById(R.id.search);

Avec AndroidAnnotations, le code devient :

@ViewById
EditText search;

Aussi simple que cela : l’application comprend que search désigne un EditText présent sur la View à travers l’id search. Nous vous encourageons à utiliser cette librairie qui permet de s’affranchir de la lourdeur de certains aspects du coding Android.

RoboGuice

RoboGuice prend en charge sur le modèle de Google Juice de l’injection au sein de votre application Android. Elle permet aussi des raccourcis de coding à la manière d’AndroidAnnotation.

GreenDroid

GreenDroid est une libraire graphique française (par Cyril Mottier). Ses objectifs sont multiples : cohérence entre les applications, rapidité d’exécution, utilisation de concepts avancés, facilité d’utilisation, etc. C’est encore un travail en cours, mais elle dispose déjà de fonctionnalités intéressantes comme les listes basées sur les items, la création de listes avancées par XML, etc. Le blog de Cyril Mottier.

RestProvider

RestProvider est une librairie pour effectuer des requêtes HTTP. Gère les formats JSON et XML pour les réponses.

Zoom sur une librairie Android : Robospice

Une application Android est souvent une coquille vide au sens métier du terme. En effet, tout le code métier est généralement déporté sur un serveur et l’application récupère les données à travers un appel REST. La règle d’or en ergonomie mobile est de ne jamais bloquer l’interface graphique, donc en terme de programmation de faire uniquement des appels asynchrones. Certaines librairies ont aidé le développeur en permettant par exemple de transformer les résultats des requêtes en simple POJO beaucoup plus facilement manipulable par le développeur. Mais concernant l’écriture à proprement parler des requêtes asynchrones, il n’existe pas de solution simple et robuste.

Robospice est née de ce manque ainsi que des problèmes liés aux appels asynchrones que nous allons détailler en dessous. Robospice est une librairie issue du travail de R&D de la société Octo et notamment de Stéphane Nicolas.

Le pattern préconisé par Google pour réaliser un appel asynchrone est d’utiliser une classe AsyncTasks. Mais ce pattern comporte de grave lacune. En effet, imaginez que vous avez une activité qui demande à une Async Tasks de faire un appel asynchrone. Une fois les résultats reçus l’Async Tasks les transmet à l’activité. Maintenant dans l’OS d’Android si vous effectuez une rotation de votre mobile par exemple de 45°, le système va détruire l’activité en cours (de format vertical) pour en recréer une nouvelle, mais de format horizontal cette fois. Et là, problème, car si cette destruction a lieu pendant un appel asynchrone, le retour ne pourra se faire vers l’activité détruite. Nous nous retrouvons donc avec une instance d’Async Tasks isolée de l’activité ce qui provoque à terme une fuite mémoire au sein de l’application. Tout ceci, et la suite logique, peut être résumé à travers les schémas suivant :

Robospice1 Robospice2 Robospice3

Suite à ceci, Google a mis en place un autre pattern : les Loaders. Ces loaders sont capables de détecter l’arrêt de l’activité et de stopper la requête en cours. Ce qui fait qu’il n’y a plus de souci de fuite mémoire. Mais ces Loaders ont été désignés pour des appels courts, notamment liés à la base de données, mais absolument pas pour récupérer par exemple un ensemble d’image sur un serveur distant.

La librairie Robospice apporte une solution plus pratique à cette problématique. La requête s’effectue au sein d’un service Android ce qui permet de s’affranchir de toutes ces contraintes. Il n’y a donc plus de fuite mémoire et le développeur peut effectuer de longue requête. De plus, Robospice gère un cache interne afin de ne pas refaire deux requêtes identiques inutilement.

Une application de démonstration qui regroupe ce qui a été expliqué plus haut existe sur Google Play.

Robospice présente plein d’atouts pour gérer toutes les problématiques liées aux appels asynchrones. Les services métier étant systématiquement déportés, en entreprise, sur des serveurs distants, ce type de librairie ne peut qu’être un atout dans vos développements. Elle est utilisable naturellement avec Maven.

Le cas de Robospice est assez symptomatique de l’écosystème Android. En effet, cette librairie a été en partie développée pour combler une lacune du SDK Android. De l’aveu même des développeurs de cette librairie, ils ne savent pas si Google travaille en ce moment sur une solution alternative aux Async Tasks ou aux Loader. Et comme Google est assez cachottier avec les prochaines évolutions de son framework, il n’est pas possible aujourd’hui de dire si l’usage de Robospice est à court ou long terme. Mais ceci est aussi inhérent au secteur ultra concurrentiel du mobile qui est un secteur qui bouge très vite et qui est en perpétuelle mutation.

Ce qui nous amène en conclusion à nous interroger sur la dualité concernant l’usage des librairies entre leurs puissances d’action et leur pérennité. En effet, de nouvelles librairies apparaissent tous les jours (dont de nombreuses françaises, les développeurs français étant très actif sur le marché) et de nombreuses aussi disparaissent faute de maintien ou victime de l’évolution du SDK Android. Un dernier conseil pour bien choisir vos librairies, penser à regarder la cadence des mises à jour ainsi que la documentation disponible (voir même d’un forum). Ces petits plus peuvent vous sauver la vie.

Merci beaucoup à l’équipe de Robospice pour l’utilisation de leurs schémas.

N’hésitez à regarder la présentation de la librairie Robospice par Stéphane Nicolas, très instructif…