Nos réflexions et analyses
Par jhowlett468 - 13 février 2015

Le saviez-vous ? Vulgarisation : Qu'est-ce qu'un APK ?

Image

Bonjour !!

Un APK est en quelque sorte l'exécutable d'une application.

C'est une sorte d'archive contenant tous les fichiers nécessaires à son exécution ( fichiers de config au format xml, icônes au format png, fichiers permettant la traduction en langage "machine"... ). De part leur format ouvert, ces fichiers sont aisément manipulables - quoique la donne semble être en train de changer, cf ce post de @kris92fr :

kris92fr a écrit:notamment les nouveaux formats d'image qui sont difficilement décompressable PKM en remplacement des .9.png et dans les roms Samsung le format QMG est apparu ( format qui était utilisé pour les BootAnim et qui ne peut pas être décompilé )


L'APK peut être converti en langage utilisable par le processeur soit à la demande ( machine virtuelle Dalvik jusqu'à KitKat ), soit à l'installation ( machine virtuelle ART depuis certaines ROM KitKat ou en standard depuis Lollipop ).

Après ce bref résumé qui n'a fait que survoler le paysage, rentrons donc dans le vif du sujet.

APK-lifetime.png


Infographie à laquelle je me référerai tout au long du topic décrivant la vie d'un APK de son téléchargement à son exécution, en passant par son installation.

Quand on télécharge une app sur Google Play, on en télécharge l'APK, pour faire court et simple en introduction. Qu'est-ce donc ?

Extrait de la page Wikipedia correspondante :

Wikipedia a écrit:Un fichier Android Package (ou APK) est un format de fichiers pour Android. Un APK (ex., "nomfich.apk") est une collection de fichiers ("package") compressée pour le système d'exploitation Android. L'ensemble constitue un « paquet ».


/!\ /!\ /!\ Le but de ce topic n'est pas de faire un tour complet des notions abordées ( bien au-dessus de mes modestes compétences ) mais juste de faire comprendre des processus qui semblent quasi-mystiques pour certains utilisateurs, fûssent-ils aguerris, comme moi ( la rédaction de cet article m'a permis d'apprendre des trucs et... d'en revoir que j'avais oublié ).

L'idée de cette article m'est venue suite à un constat assez... Bizarre : quand on explore les partitions système et data de nos précieux, on s'aperçoit que les fichiers APK se trouvent dedans.

data_app.png


Screenshot du dossier /data/app de mon S5

On pourrait donc penser que ces fameux APK sont l'équivalent des fichiers .exe sous Windows : des installeurs de programmes ou dans le cas présent, des fichiers exécutables installés via un installeur autre. Cependant quand on télécharge un APK en-dehors de Google play ( ce n'est pas forcément illégal hein ), on télécharge donc le fichier, qui semble donc être une sorte de fichier .exe se suffisant à lui-même... Hors, ce fameux fichier, s'il n'y en a pas d'autre équivalent déjà présent ( si l'APK est déjà présent on peut souvent faire un copier-coller pour écraser le pré-existant ), devra être installé. Donc ce fameux fichier exécutable permettant d'exécuter une app semble aussi en être l'installeur. Etrange non ? Qui de l'oeuf ou de la poule ? lol

Ce topic a 2 buts :
  • comprendre de quoi est fait un APK et comment il s'installe sur nos précieux ainsi que comment le modifier
  • comprendre comment il s'exécute une fois installé ( d'autant que l'arrivée d'ART, appelé à remplacer Dalvik, va changer des choses )


I / Genèse d'un APK, installation, structure de celui-ci et survol sur les possibilités de modification

  • Genèse d'un APK

    Cf l'infographie ci-dessus, les APK téléchargés sur Google Play ( ainsi que ceux récupérés par d'autres sources ) n'existe pas "nativement" sous leur forme d'APK : il existe sous la forme d'un code-source converti en fichier dex. Ce fichier dex est ensuite, via les ressources et le code natif ( sur l'appareil cible ? ), converti en fichier apk grâce à un processus de "zippage" ( le terme zippage est ici assez important, j'y reviendrai plus loin ).
  • Installation d'un APK

    2 APK sont impliqués dans le processus d'intallation des autres [APKs] : Android PackageManager et PackageInstaller ( revoir aussi l'infographie en haut de topic ). Je reprendrai les explications de ce tuto, pour des raisons de clarté :
    Renaud Mathieu a écrit:
    • Qui sont PackageManager et PackageInstaller dans Android ?
      PackageInstaller est l’application par défaut dans Android pour installer un package de manière interactive. Une simple activité dans PackageInstaller va demander au service PackageManager d’installer via installd le package.
    • PackageManager est une API qui gère l’installation, la désinstallation et la mise à jour d’application dans le système Android. Lorsqu’on installe un APK, le PackageManager va parcourir l’APK et afficher des messages de confirmation d’installation. Le service tourne dans le processus system_service et est démarré au boot.
      Où sont stockés les APK dans un système Android ?
    • Les applications pré-installées se trouvent dans /system/app. Les applications provenant d’une installation par l’utilisateur sont stockées dans /data/app. Le PackageManager crée un répertoire de données dans /data/data/<nom_du_package> pour stocker les bases de données, les SharedPreferences, les libraries natives et les données de cache.
    • Quel est le processus d’installation d’APK dans Android ?
      • Ajouter un package dans la file du process d’installation
      • Déterminer le chemin d’installation de l’application
      • Vérifier s’il s’agit d’une installation ou d’une mise à jour
      • Copier l’application dans le répertoire
      • Récupérer l’UID de l’application
      • Envoyer une requête d’installation au démon installd
      • Créer le répertoire de l’application et donner les permissions adéquates
      • Extraire le code dex et le placer dans le répertoire du cache
      • Mettre à jour package.list et package.xml
      • Envoyer un broadcast de notifications
    • Comment le PackageManager sauvegarde ses données ?
      Le PackageManager stocke les informations des applications dans 3 fichiers situées dans /data/system :
      • packages.xml contient la liste des packages et des permissions
      • packages.list version simplifiée du fichier packages.xml contenant le nom du package, l’user id, les flags et le chemin vers le répertoire de données des packages
      • packages-stopped.xml contient la liste des packages dans l’état stoppedd. Les applications dans cet état ne peux pas recevoir de broacast
  • Structure d'un APK - modifications possibles

    J'ai dit plus haut que le terme de "zippage" lors de la "fabrication" de l'APK était important. Pourquoi ? Et bien un APK peut être ouvert et exploré aussi facilement qu'un fichier zip avec des logiciels PC comme 7zip, Winzip ou Winrar. En ouvrant un APK ( j'ai travaillé sur SecMMS_Blue.apk, l'APK "Messages" de la ROM NJ1 SFR de mon S5 ), on obtient en premier lieu ça :

    Image

    On retrouve donc le fameux dex ainsi qu'un fichier resources.arsc, pouvant être modifié ( jamais bien compris comment le bidouiller ). Les 2 fichiers "manifest"... J'ignore à quoi ils servent. Le dossier META-INF contient des fichiers système permettant entre autre la traduction langage de programmation -> langage "machine" ( comme dans un zip flashable ) : il ne faut pas y toucher !! Ce qui m'intéresse le plus dans ce screenshot, c'est le dossier res, qui contient tous les png gérant la partie graphique de l'app ainsi que de nombreux fichiers xml de config. En ouvrant le dossier res, on obtient ça :

    Image

    Certains dossiers contiennent des png, d'autres des xml et enfin certains, les deux.

    Image

    Image

    Attention cependant, les bidouilleurs comme moi savent que l'exploration d'un APK via un logiciel de compression est imparfaite : en effet une bonne partie des fichiers est cachée à l'utilisateur lambda. Pour avoir accès à TOUS les fichiers stockés, il faut passer par la case "décompilation" qui consiste à extraire tous les fichiers ( cachés ou non ) de l'APK. Tutos sur la décompilation des APK : ICI, ICI ou ICI.

    Image

    Dossier res avant décompilation

    Image

    Dossier res après décompilation

    De plus, même quand ils sont visibles, les fichiers xml ne sont pas "lisibles" :

    Image

    Fichier xml avant décompilation

    Image

    Fichier xml après décompilation

    Après décompilation même si le contenu peut sembler obscur, on peut facilement modifier des paramètres de l'app, pour peu qu'on sache quelle ligne modifier et avec quelle valeur ( texte ou numérique suivant le cas ). L'édition de ces fameux fichiers xml se fait avec Notepad++ sous Windows ( le bloc-notes ou d'autres logiciels de traitement de texte ne conviennent pas ).
    Exemple :

    Code: Select All Code
    <int name="maxMessageSize">307200</int>


    Correspond à la taille max d'un MMS en octets ( ce qui fait 256 ko ) : l'app est celle d'une ROM opérateur donc normalement correctement paramétrée mais sur une ROM étrangère ou custom, il faut parfois bidouiller certains xml pour avoir ce que l'on veut. Après modification et enregistrement, on peut récupérer l'APK en recompilant les fichiers préalablement décompilés ( avec ceux modifiés ) via le logiciel ayant permis la décompilation.

    Concernant la manipulation de png ( pour modifier l'icône de l'app [ les dossiers "mipmap" contiennent les icônes de l'app à tel ou tel endroit : drawer, apps récentes, autre app... ] ou telle ou telle icône dans celle-ci [ attention à bien respecter les noms pré-existants dans l'app ainsi que les dimensions !! ] ) : tous les dossiers contenant les png semblent accessibles sans décompilation et leur modification ne nécessite aucune recompilation post-traitement.

II / Exécution de l'APK après installation

Une fois installé, il peut y avoir 2 cas de figure suivant que la machine virtuelle de l'appareil est Dalvik ou ART ( Android RunTime ). La machine virtuelle permet à une app de s'exécuter sur n'importe quel matériel ( explication récupérée ICI ) :

arnaud - frandroid a écrit:Pour rappel, les applications Android fonctionnent grâce des machines virtuelles nommées Dalvik. Une machine virtuelle est une sorte d’espace dans lequel l’application va pouvoir trouver tout ce dont elle a besoin pour s’exécuter.

Considérez qu’une machine virtuelle est un logiciel émulant un processeur utilisé par les applications Android. Nous n’avons pas tous le même matériel, mais nous avons tous ce même processeur virtuel.


La différence entre Dalvik et ART ? Dalvik transcrit l'APK en langage utilisable par le système à la demande alors qu'ART le fait une bonne fois, à l'install ( petite perte de temps lors de celle-ci mais gros gain en temps, fluidité et batterie à chaque exécution ). Extrait de l'article Nextimpact qui m'a permis de faire ce topic sur El Pollo :

Nextimpact a écrit:Le plus gros changement introduit par ART est la compilation dite AOT, pour « Ahead-Of-time » (là encore, comme Microsoft procèdera bientôt avec .NET). Si la compilation JIT s’occupe de transcrire à la volée, AOT s’en occupe « avant ». Plus précisément, le code intermédiaire va être compilé dès sa récupération depuis Google Play pour réellement « installer » l’application, qui sera enregistrée telle quelle dans le téléphone, en code natif. Son lancement sera donc beaucoup plus rapide car le code ne sera pas recompilé à chaque exécution. Du moins en théorie.


@franck_29 explique bien ce qu'est une app ( ça n'est pas qu'un APK hein ;) ) sur ce topic :

franck_29 a écrit:Pour commencer, une application c'est quoi

Sur Android une application se constitue de 4 composants, 4 familles de composants en fait :
  • des activités (les actions "métiers" que doit faire l'application, par exemple lire une musique, ou afficher la liste des musiques disponibles etc...)
  • des services (des tâches de fond qui ne requièrent pas d'interaction avec l'utilisateur)
  • des fournisseurs de contenus (évoqués plus bas, content provider en anglais)
  • des capacités d'écoute (broadcast reveiver en anglais, la traduction est de moi, donc pas complète)


Se reporter aussi à l'infographie qui résume bien les choses.

Alors... Qu'est-ce qu'un APK ? ;) ;) ;)


Crédits images : en.wikipedia.org, http://linuxfr.org et moi-même pour les screenshots téléphone et PC
8 réponse(s) -
Site standard | Site mobile
POUR ALLER PLUS LOIN