Dex Format vs Java bytecode

Le monde Android




Informations générales

Nous savons ce dont nécessite un programme Java pour être exécuté (si ce n'est pas le cas, jetez un oeil à cette page).

Android ne déroge pas à la règle surtout que toutes les applications disponibles sur ce smartphone sont développées en Java (ou du moins sont du bytecode Java puisqu'il est possible d'obtenir du bytecode en partant de la compilation d'un langage de script grâce aux APIs telle que Jython, JRuby, etc.)

Cependant, les besoins du système d'exploitation Android différent des besoins des plateformes que l'on dit classique par abus de langage. En effet, les ordinateurs on une capacité énergétique qui n'est pas comparable à celle des appareils mobiles.

C'est l'une des raisons principales qui ont conduit la VM d'Android à exécuter son propre format d'exécution pour le code Java (voir le format Dex).

Je vais donc vous présenter l'outil dx, qui permet d'obtenir les fichiers d'exécution Java dans le format compris par Android.




L'outil dx

Le
format Dex est le format d'exécution Java reconnue par la machine virtuelle Dalvik (machine virtuelle de la plateforme Android). Ce format d'exécution spécifique est obtenue en transformant les fichiers compiler Java (donc contenant du bytecode standard). Cette transformation est obtenue grâce au programme dx.
Cette transformation ne s'effectue pas directement à partir des fichiers de code Java mais à partir fichiers compiler (fichier .class ) qui contiennent du bytecode Java et qui vont être transforme en bytecode dit Dalvik.

Les fichiers résultants de cette transformation peuvent être de plusieurs type :

Ce programme propose plusieurs fonctionnalités afin d'aider à la conversion du bytecode Java vers le bytecode dit Dalvik dont voici les principales : Se programme s'utilise de la manière la plus simple comme suit :

./dx --dex --output={chemin_et_nom_du_fichier_voulu}[.dex|.jar|.apk|.zip] {chemin_vers_les_sources}



La machine virtuelle Dalvik

Dalvik est le nom donné à la machine virtuelle permettant d'exécuter du code Java sur Android. Néanmoins, Dalvik n'est pas une machine virtuelle Java. Pour prendre ce qualificatif, il faut respecter la spécification Java, ce qui n'est pas le pour Dalvik.

Comme nous le savons, un appareil mobile dispose de moins de ressources que les ordinateurs dit "classique". Ces différences se ressentent notamment sur le plan énergique mais aussi sur le plan matériel. De ce fait, la machine virtuelle Dalvik fut conçu afin de garder des performances acceptable en terme rapidité d'exécution et en terme de performance matérielles. En effet, Dalvik est élaborer de manière à permettre l'exécution de plusieurs instance de ses instances sans grandement impacté les performances du reste de l'appareil.

La plus grande différence entre Dalvik et les machines virtuelle Java, se situe au niveau de leurs architectures interne.
En effet, à l'opposé des machines virtuelle Java de base qui ont des architecture basées sur des piles, Dalvik à une architecture basée sur des registres.

Les architectures à pile organise la mémoire disponible pour la considérer comme une ou plusieurs pile. Elles ont pour avantage de n'avoir qu'à empiler et dépiler les suites d'instruction à exécuter. Malgré le fait que les opérations à zéro opérande soit efficace en terme de rapidité, ce type d'architecture nécessite plus instruction que les autres types d'architecture pour l'exécution d'un code de même facture.

Les architectures basée sur des registres, qu'en a elles, possède un nombre très limité d'instruction pour exécuter un code. Ce procédé est moins rapide en terme d'exécution mais gagné en efficacité en terme de gestion de mémoire.

De plus, Dalvik ne reconnait pas le bytecode Java standard, il exécute ces propres instructions que l'on nommera Dalvik bytecode et dont vous pourrez avoir de détails sur la page du format Dex.




La mécanique d'exécution d'Android

Voici un schéma récapitulatif de la mécanique d'exécution d'Android :
java World schéma