APK - hackathonBnF/FichesFormat GitHub Wiki

Android Package (APK) Statut

Description

Le format APK est un format conteneur permettant d'embarquer dans un fichier unique, fondé sur ZIP, les ressources nécessaires à l'installation d'une application sur un système Android. Il s'agit d'un format de diffusion à un utilisateur final, contrairement à sa variante APK universel et au format lié Android App Bundle.

Le format APK est maintenu par l'Android Open Source Project, mais l'influence sur ce format de Google via sa plateforme de distribution Google Play est de fait prépondérante. Il ne semble pas y avoir de brevets portant sur les composantes du format.

Du fait de sa structure standardisée, de son adoption très large, d'une documentation satisfaisante et de l'utilisation majoritaire de formats ouverts, ce format semble acceptable à la BnF dans une perspective de préservation à long terme. La Bibliothèque du Congrès le considère comme un de ses formats préférés pour les logiciels.

Sociabilité

Le format APK est géré par le système d'exploitation Android, lui-même utilisé par la quasi-totalité des smartphones actuels, mis à part les iPhones. Ces applications sont largement diffusées par le magasin d'applications Google Play, mais également par d'autres dépôts, légaux (F-Droid, par exemple) ou non.

En juin 2021, Microsoft a annoncé que Windows 11 disposerait de Windows Subsystem for Android (WSA), permettant de faire fonctionner des applications Android disponibles sur l'Amazon Appstore sur un ordinateur de bureau équipé de Windows. Néanmoins, Microsoft a par la suite annoncé que cette solution serait abandonnée dès 2025 pour des raisons de rentabilité.

Relations à d’autres formats

Les fichiers APK sont une restriction du format conteneur Java Archive (JAR), lui-même une restriction du format conteneur ZIP.

Les plateformes de distribution limitant souvent la taille des applications à télécharger à quelques centaines de mégaoctets, on trouve des fichiers APK distribués avec des données supplémentaires dépendantes portant l'extension .obb. Il s'agit en réalité de fichiers de format arbitraire, considéré comme tel par Google, d'où le nom « OBB » signifiant Opaque Binary Blob. L'ensemble est parfois diffusé par des plateformes tierces sous forme de paquet XAPK (Extended APK) (CPO-AUT). Les fichiers XAPK sont des fichiers conteneurs ZIP embarquant un fichier APK et ses données OBB liées.

Les APK sont des modules d'application, mais il est également possible de créer des modules de bibliothèque distribués avec une extension .aar (pour Android Archive). Ces fichiers AAR peuvent être déclarés comme dépendances d'applications. Ils ont une structure très similaire aux fichiers APK mais peuvent être identifiés par le fait que leur fichier AndroidManifest.xml est un fichier textuel et non binaire selon le formalisme Android binary XML, et que leurs classes Java ne sont pas compilées en Dalvik Executable (on note donc à la racine la présence d'un fichier classes.jar et non classes.dex).

Depuis 2021, les applications Android ne sont plus versées au magasin d'applications Google Play Store sous forme de fichiers APK mais sous forme de fichiers Android App Bundle (extension .aab). Ces paquets comprennent plusieurs APK adaptés chacun à un type d'appareil Android. Le format AAB est un format de projet finalisé, comportant toutes les ressources nécessaires à la distribution d'APK signés à l'utilisateur final sur une plateforme telle que Google Play, mais ne peut être installé sur un système Android.

Selon le site FileInfo, le site APK Mirror, qui distribuait également les applications APK, ne pouvant pas faire de même avec les fichiers AAB, a créé son propre format de paquet d'application, chiffré, utilisable seulement avec son installeur. Ces paquets « Android App Bundle Mirror » portent l'extension .apkm.

Versions

Les applications sont [ont été ?] livrées aux plateformes de distribution sous forme d'APK dits « universels » : ces derniers embarquent dans le même conteneur des contenus adaptés à toutes les tailles d'écran. Ils ont de ce fait un poids conséquent. Les plateformes de distribution se chargent ensuite de délivrer à l'utilisateur final un APK spécifiquement adapté à son équipement.

Le format n'a pas de version à proprement parler ; il est cependant dépendant des évolutions du système d'exploitation Android qui a connu de très nombreuses versions majeures depuis son introduction en 2008. Il s'agit donc d'un format en évolution rapide (CPO-STA). Des problèmes de rétrocompatibilité sont donc à anticiper.

On trouve des fichiers APK avec une extension .apks ; il s'agit d'un APK fractionné (« split ») adapté à un type d'équipement spécifique.

Contenu

Les fichiers APK contiennent notamment les fichiers suivants :

  • META-INF/MANIFEST.MF : liste des fichiers contenus dans le paquet et empreinte numérique ;
  • AndroidManifest.xml : métadonnées du paquet dans un format XML binaire ;
  • classes.dex : classes Java compilées ;
  • resources.arsc : ressources compilées.

En outre, ils comportent les répertoires suivants :

  • META-INF : outre le manifeste, le répertoire contient la signature du paquet ;
  • lib : répertoire contenant du code compilé spécifique à certaines plateformes ;
  • res : répertoire contenant des ressources non compilées (des images, par exemple) ;
  • asset : répertoire contenant les assets de l'application.

Organisme de maintenance et documentation de référence

Le format APK est maintenu par l'Android Open Source Project, mais l'influence de son utilisateur principal, Google, est prépondérante. De fait, les spécifications complètes du format ne sont pas publiées. Néanmoins, le site officiel d'Android, dans ses Guides du développeur, fournit des informations conséquentes sur la structure du format :

Identifiants

Extensions : apk, apks.

Type(s) MIME non officiel : application/vnd.android.package-archive.

Registre Identifiant
Wikidata Q596391
Bibliothèque du Congrès fdd000592
Just Solve the File Format Problem APK

Caractéristiques techniques

Un APK versé dans un magasin d'applications (en particulier Google Store) doit être signé par le/la développeur·se (CPO-PRO). Cette protection contre la falsification peut empêcher l'installation d'applications qui ne seraient pas distribuées via le magasin d'applications officiel.

Du fait de sa nature de conteneur fondé sur ZIP et de formats ouverts tels qu'XML, le format APK est relativement transparent (CPO-TRA) : tous les outils manipulant le format ZIP ou le format JAR sont utilisables.

L'indépendance / autonomie (CPO-AUT) du format est également satisfaisante : l'ensemble des ressources nécessaires à l'installation et au fonctionnement de l'application est empaqueté dans un unique fichier conteneur. On notera à ce sujet les points suivants :

  • Les bibliothèques logicielles nécessaires au fonctionnement de l'application (mentionnées dans le manifeste dans l'élément //uses-library/@android:name), qui peuvent soit être empaquetées dans le fichier APK ou, à défaut, chargées depuis le système d'exploitation ;
  • Les dépendances envers des composants matériels sont déclarées dans le manifeste ;
  • Une attention cependant doit être apportée aux fichiers OBB associés (appelés expansion files) qui sont nécessaires à l'utilisation de l'application. Ces fichiers sont téléchargés automatiquement à l'installation de l'application et stockés séparément dans l'équipement.

Métadonnées internes

Des métadonnées internes sont portées par le fichier AndroidManifest.xml situé à la racine du conteneur. Il s'agit notamment de :

  • //uses-sdk/@android:targetSdkVersion : version cible d'Android pour l'application ;
  • //uses-sdk/@android:minSdkVersion : version minimale d'Android pour l'application ;
  • Attributs de l'élément //supports-screens (@anyDensity, @smallScreens, @normalScreens, @largeScreens, @xlargeScreens) : taille(s) d'écran pour laquelle (lesquelles) l'application est prévue (cet élément figure dans les APK universels mais non dans les APK délivrés à l'utilisateur final) ;
  • //uses-feature/@android:name : autres dépendances matérielles ou logicielles.

Lorsqu'il s'agit d'un APK dit « universel » (voir la section Relations à d'autres formats plus haut), les attributs de l'élément supports-screens cités plus haut ont pour valeur True (toutes les tailles d'écran sont donc supportées). Cette situation n'est néanmoins pas systématique car certaines applications sont conçues pour fonctionner sur une taille d'écran précise.

Les deux derniers éléments portent un attribut android:required valant True ou False, permettant ainsi d'identifier si le composant est optionnel ou obligatoire.

Pour plus d'informations sur les informations figurant dans le manifeste, on se reportera à la présentation du manifeste de l'application dans le guide du développeur.

On notera que le fichier AndroidManifest.xml est au format AXML (Android XML), une variante d'XML sous forme binaire ; pour extraire le fichier et le décoder, il est possible d'utiliser l'outil Androguard avec la ligne de commande suivante :

androguard axml monFichier.apk -o manifesteDecode.xml

Outils connus par la BnF

La production d'un fichier APK repose sur la compilation par les outils Android SDK du code (généralement en Kotlin ou en C++) et des ressources additionnelles de l'application. Une liste d'outils en ligne de commande embarqués dans Android SDK est disponible dans le guide du développeur.

Plusieurs outils sont disponibles pour manipuler les fichiers APK ; on citera parmi d'autres le logiciel Androguard.

Concernant la récupération, on notera que des plateformes tierces et des sites miroirs peuvent diffuser des copies de fichiers APK, mais que leur authenticité et leur sécurité ne sont pas garanties. La récupération des applications par les institutions de conservation par ce biais est donc déconseillée.

L'outil bundletool permet de produire des fichiers APK soit spécifiques à un type d'équipement, soit « universels », à partir d'un fichier AAB.

Usage ou présence dans les collections de la BnF

La BnF a déjà collecté un certain nombre d'applications au format APK et envisage le dépôt légal des applications pour mobile préférentiellement sous la variante du format nommée plus haut « APK universel ».