Qu'est-ce qu'un APK ?

Des articles de fond, des réflexions, pour aller plus loin et pour réagir
#1

Qu'est-ce qu'un APK ?

Messagepar jhowlett468 » 13 Fév 2015, 17:11

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 : Tout sélectionner
    <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
Image
Image
|| Galaxy S5 SM-G900FImage|| Gear Fit ( SM-R350 )
ROM xXx No Limits 6.1 base CQAVImageROM BOA2
Modem CQAW / CSC XEFImage
Kernel stock / recovery TWRP 3.0.2.2
Knox 0x1, garantie finie
Charte du forum
Liens importantsNouveau ?Drivers Samsung 1.5.51 -> Install
Vérifiez votre modèleEn ULTIME recours ? ---> ICI
Rédac' chef du Blog
Téléphone qui bootloope ?
Image
Avatar de l’utilisateur
jhowlett468
Modérateur
Modérateur
 
Message(s) : 9259
Inscription : 16 Août 2011, 20:28
Localisation : Xavier's Intitute for Gifted Youngers, 1407 Graymalkin Lane, Westchester County, NY /// La DZ

#2

Qu'est-ce qu'un APK ?

Messagepar jhowlett468 » 13 Fév 2015, 17:12

Réservé
Image
Image
|| Galaxy S5 SM-G900FImage|| Gear Fit ( SM-R350 )
ROM xXx No Limits 6.1 base CQAVImageROM BOA2
Modem CQAW / CSC XEFImage
Kernel stock / recovery TWRP 3.0.2.2
Knox 0x1, garantie finie
Charte du forum
Liens importantsNouveau ?Drivers Samsung 1.5.51 -> Install
Vérifiez votre modèleEn ULTIME recours ? ---> ICI
Rédac' chef du Blog
Téléphone qui bootloope ?
Image
Avatar de l’utilisateur
jhowlett468
Modérateur
Modérateur
 
Message(s) : 9259
Inscription : 16 Août 2011, 20:28
Localisation : Xavier's Intitute for Gifted Youngers, 1407 Graymalkin Lane, Westchester County, NY /// La DZ

#3

Re: Qu'est-ce qu'un APK ?

Messagepar DuD » 13 Fév 2015, 17:16

Bonjour, quel bon article, merci pour cet éclairage ;)
Galaxy Note EDGE ;-)
SM-N915FY
ANDROID 5.1.1 LOLLIPOP
N915FXXU1COI1
Version Kernel 3.10.40-5674927
KNOX : 0X0
-------------------------
-------------------------
-------------------------
Avatar de l’utilisateur
DuD
Ancien du Staff
Ancien du Staff
 
Message(s) : 1647
Inscription : 04 Oct 2013, 11:40

#4

Re: Qu'est-ce qu'un APK ?

Messagepar jhowlett468 » 13 Fév 2015, 17:22

Bonjour ;)

De rien et merci à toi... Pourtant, j'ai pas encore allumé la lumière :mrgreen:
Image
Image
|| Galaxy S5 SM-G900FImage|| Gear Fit ( SM-R350 )
ROM xXx No Limits 6.1 base CQAVImageROM BOA2
Modem CQAW / CSC XEFImage
Kernel stock / recovery TWRP 3.0.2.2
Knox 0x1, garantie finie
Charte du forum
Liens importantsNouveau ?Drivers Samsung 1.5.51 -> Install
Vérifiez votre modèleEn ULTIME recours ? ---> ICI
Rédac' chef du Blog
Téléphone qui bootloope ?
Image
Avatar de l’utilisateur
jhowlett468
Modérateur
Modérateur
 
Message(s) : 9259
Inscription : 16 Août 2011, 20:28
Localisation : Xavier's Intitute for Gifted Youngers, 1407 Graymalkin Lane, Westchester County, NY /// La DZ

#5

Re: Qu'est-ce qu'un APK ?

Messagepar edem84 » 13 Fév 2015, 18:13

Salam
punaise, je vais me coucher moins c... ce soir :)
Merci 8-)
Galaxy Note 4 - SM-N910C : MM 6.0.1 N910CXXU2DPI7 / Root : CF-Autoroot
Opérateur : Maroc Telecom
Avatar de l’utilisateur
edem84
Ancien du Staff
Ancien du Staff
 
Message(s) : 4211
Inscription : 08 Sep 2010, 00:47
Localisation : Maroc

#6

Re: Qu'est-ce qu'un APK ?

Messagepar jhowlett468 » 13 Fév 2015, 18:31

Saloute !!
T'es loin de l'être pourtant @edem ;)

Tapatalked by my S5
Image
Image
|| Galaxy S5 SM-G900FImage|| Gear Fit ( SM-R350 )
ROM xXx No Limits 6.1 base CQAVImageROM BOA2
Modem CQAW / CSC XEFImage
Kernel stock / recovery TWRP 3.0.2.2
Knox 0x1, garantie finie
Charte du forum
Liens importantsNouveau ?Drivers Samsung 1.5.51 -> Install
Vérifiez votre modèleEn ULTIME recours ? ---> ICI
Rédac' chef du Blog
Téléphone qui bootloope ?
Image
Avatar de l’utilisateur
jhowlett468
Modérateur
Modérateur
 
Message(s) : 9259
Inscription : 16 Août 2011, 20:28
Localisation : Xavier's Intitute for Gifted Youngers, 1407 Graymalkin Lane, Westchester County, NY /// La DZ

#7

Re: Qu'est-ce qu'un APK ?

Messagepar Buick59 » 18 Fév 2015, 01:59

Salut!

Ca sent bon le travail tout cela! Je vais le suivre avec intérêt ce topic! :D

Bon courage pour le reste Alex ;)
Galaxy Note IV Black 16Go - Full stock - Nova Prime - KLWP
Galaxy S5 SM-G900F Blanc - Lollipoped by ALEXNDR Dev Base [POF9] - Root - KLWP
Galaxy S6 Edge - SM-G925F (de Madame) - Full Stock

Xtra:Linux: Ubuntu 15.04 LTS, interface Unity
Avatar de l’utilisateur
Buick59
Andro-bavard
 
Message(s) : 732
Inscription : 16 Déc 2012, 19:45
Localisation : Nord, Lille

#8

Re: Qu'est-ce qu'un APK ?

Messagepar orleavin » 18 Fév 2015, 08:32

Bonjour,
tes modestes compétences, dis-tu ? Bel article de fond. Bravo.
Galaxy S6 SM-G920F
Version Androïd 5.1.1
G920FXXU3CO19
Réseau Bouygues
Avatar de l’utilisateur
orleavin
Andro-bavard
 
Message(s) : 213
Inscription : 30 Déc 2013, 18:07

#9

Re: Qu'est-ce qu'un APK ?

Messagepar jhowlett468 » 18 Fév 2015, 21:16

Buick59 a écrit:Ca sent bon le travail tout cela! Je vais le suivre avec intérêt ce topic! :D

Bon courage pour le reste Alex ;)


orleavin a écrit:tes modestes compétences, dis-tu ? Bel article de fond. Bravo.


Merci les gars ;)

"Modestes" connaissances car beaucoup plus limitées que certains membres ;)

Edit : modification du post 1 avec citation d'un topic de @franck_29 ;)
Image
Image
|| Galaxy S5 SM-G900FImage|| Gear Fit ( SM-R350 )
ROM xXx No Limits 6.1 base CQAVImageROM BOA2
Modem CQAW / CSC XEFImage
Kernel stock / recovery TWRP 3.0.2.2
Knox 0x1, garantie finie
Charte du forum
Liens importantsNouveau ?Drivers Samsung 1.5.51 -> Install
Vérifiez votre modèleEn ULTIME recours ? ---> ICI
Rédac' chef du Blog
Téléphone qui bootloope ?
Image
Avatar de l’utilisateur
jhowlett468
Modérateur
Modérateur
 
Message(s) : 9259
Inscription : 16 Août 2011, 20:28
Localisation : Xavier's Intitute for Gifted Youngers, 1407 Graymalkin Lane, Westchester County, NY /// La DZ


Retour vers Articles de fond (analyses, réflexions, réactions)

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)