Pages

dimanche 28 octobre 2012

Dalvik la VM Android

Aujourd’hui je vais vous conter l’histoire de Dalvik

Dalvik est un petit village au nord de l’Islande, plus connu pour son port de pêche, mais depuis 2008 ce nom a pris une autre tournure. Dan Bornstein et son équipe chez Google l’ont choisi pour désigner la machine virtuelle utilisée sur tous les devices Android pour exécuter les applications. Dalvik n’est pas une version de JVM mais plutôt une alternative.

Les programmes s’exécutant sur Android sont pour la majorité écrits en langage Java à partir d’un SDK différent de celui proposé par Sun/Oracle. On pourrait se demander pourquoi Java SE ou Java ME (Java Micro Edition) n’ont pas été utilisé. Je vais essayer d’y répondre en plusieurs points


Version optimisée de la VM 

Dalvik est une machine virtuelle pouvant être exécutée sur un device ayant peu de CPU et de RAM. L’empreinte sur le système de cette VM est faible pour préserver au maximum la batterie.

Chaque application s’exécute dans son propre processus avec sa propre instance de Dalvik. Cette VM a donc été écrite pour pouvoir gérer ceci de la meilleure manière possible. Dalvik n’exécute pas de fichiers .class mais des fichiers .dex (Dalvik Executables) qui sont moins lourds en mémoire. Par exemple les chaines de caractères ou les constantes qui sont dupliquées dans les différents fichiers .class,  ne sont définies qu’une seule fois dans les fichiers .dex. Un outil appelé dx est utilisé pour convertir les .class Java en .dex

Les fichiers .dex peuvent être modifiés lors de l’installation de l’application afin d’optimiser son comportement sur le device.

La machine virtuelle Dalvik repose sur le noyau Linux pour les fonctionnalités de base comme la gestion des threads ou la gestion de la mémoire.

A l'inverse des machines virtuelles Java (JVM) qui sont des machines basées sur la pile, la VM Dalvik est basée sur les registres. Je ne vais pas faire un cours sur la compilation (voir ici pour en avoir un) mais je vais prendre tout de même un exemple simple pour montrer la différence. 

Prenons l’expression A = B + C. Cette expression est trop compliquée pour être exécutée tel quel par le processeur et elle doit être décomposée en expression plus simple.

Une machine à pile dispose comme son nom l'indique d’une pile dans laquelle nous allons placer nos valeurs. Les opérations binaires opèrent sur les deux valeurs au sommet de la pile et les opérations unaires sur la valeur au sommet de la pile

Notre expression sera interprétée de cette manière
  • PUSH B      place la valeur B au sommet de la pile 
  • PUSH A     place la valeur A au sommet de la pile 
  • ADD          remplace la valeur au sommet par leur somme 
  • POP C       enlève la valeur au sommet de la pile et la met dans C 
Regardons maintenant l’interprétation de la même expression sur une machine à registres qui possèdent un ensemble de registres que nous désignerons ici par R1, R2…. Ici n’importe quel registre peut intervenir dans une opération. Notre expression sera traduite de cette manière
  • MOVE B,R1      place la valeur B dans R1 
  • MOVE A,R2     place la valeur A dans R2 
  • ADD R1,R2      ajoute R1 et R2 dans R2 
  • MOVE R2,X    déplace le résultat dans X 
Une machine à registres est plus compliquée à mettre en oeuvre mais elle utilise beaucoup moins d’instructions qu’une machine à pile. Même si les études divergent sur les performances de telle ou telle implémentation on peut tout de suite voir l’intérêt de moins solliciter les ressources machines sur un device utilisant une source d’énergie limitée (sur le sujet vous pouvez lire aussi cet article)

Version allégée 

Dalvik ne propose qu’un sous ensemble des packages Java. Swing et AWT, les librairies graphiques du JDK par exemple, n’ont pas été reprises. Seules les plus usitées sont utilisées. D’autres ont été incluses
  • Junit pour les tests 
  • Commons Httpclient pour appeler des url distantes 
  • Json 
  • Des classes android pour accéder à la base de données SQLite, pour utiliser les fonctionnalités du device (GPS, appel telephonique, SMS, photo….), pour afficher des écrans…. 
  • … 
La liste des packages est consultable sur http://developer.android.com/reference/packages.html

Tout comme pour un développement Java classique il bien évidemment possible d’ajouter des librairies externes à vos projets.

Un problème de licence

Le sujet des licences est un sujet épineux en ce moment dans le secteur de la mobilité. Il existe une multitude d’articles sur le net qui parfois divergent sur le sujet. Oracle est une entreprise commerciale absente aujourd'hui de l’industrie mobile. Souhaitant bénéficier de la manne financière liée à Android, ils ont intenté un procès à Google concernant Dalvik et la violation de plusieurs brevets.

Pour parler de ce problème de licence, je me suis donc réorienté vers le blog de James Gosling (le créateur de Java pour ceux qui ne le connaîtraient pas) http://nighthacks.com/roller/jag/, où j’ai pu trouver plusieurs articles intéressants.

Par exemple il rappelle le concept de la liberté « freedom for one could restrict the freedom of another ». La préoccupation des développeurs Sun à l’époque était d’offrir la liberté à tous les développeurs de logiciel de n’écrire leur application qu’une fois pour qu’elle puisse fonctionner sur n’importe quel système d’exploitation et n’importe quelle machine.

Sun a essayé de mettre en place des brevets pour faire respecter l’interopérabilité entre les applications et le système. Tout le monde a la possibilité d’utiliser librement Java à condition de respecter les spécifications. C’est un des points de blocage qu’il y a eu à l’époque avec Google quand ces derniers sont venus présentés à Sun leurs projets sur la mobilité. En effet Google voulait construire une plateforme libre de droits pour les constructeurs de mobile. Comme je l’ai dit un peu plus haut dans cet article, le code compilé pour Dalvik peut être modifié à l’installation si le fabricant du téléphone le souhaite.

La fragmentation est importante entre les mobiles Android (différence de puissance, de taille d’écran, de résolutions…) pour qu'il y ait lieu de restreindre encore la liberté des développeurs. Ecrire une application sous Android sur un grand nombre de devices nécessite beaucoup de travail de développement et de tests par rapport par exemple à un développement sous Ios.

Pour le moment les fabricants n’usent pas trop de cette possibilité ce qui ne gène pas trop le développement, mais ceci est une faille dans le système.

Avec du recul on peut dire que Sun a peut être fait une erreur stratégique à l’époque en ne pliant pas aux exigences de Google mais ils ont le mérite de ne pas avoir trahis leurs convictions. Pour Google, la mise en place de Dalvik leur a permis de construire une plateforme de développement sans les contraintes juridiques et financières liées à Java ME.

Merci à Anne Laure Rigaudon pour sa relecture

Aucun commentaire:

Enregistrer un commentaire

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.