Créer plusieurs fichiers APK pour différentes tailles d'écran

Si vous publiez votre application sur Google Play, vous devez compiler et importer un Android App Bundle (AAB). Dans ce cas, Google Play génère et diffuse automatiquement des APK optimisés pour chaque configuration d'appareil, afin que l'utilisateur télécharge uniquement le code et les ressources nécessaires pour exécuter votre application. La publication de plusieurs fichiers APK est utile si vous ne publiez pas sur Google Play, mais que vous devez créer, signer et gérer chaque APK vous-même.

Lorsque vous développez votre application Android pour profiter de plusieurs APK sur Google Play, il est important d'adopter dès le départ de bonnes pratiques et d'éviter les problèmes inutiles plus tard dans le processus de développement. Cette leçon vous explique comment créer plusieurs APK de votre application, chacun couvrant une classe de taille d'écran différente. Vous obtiendrez également des outils nécessaires pour faciliter la maintenance d'un codebase multi-APK.

Vérifier que vous avez besoin de plusieurs APK

Lorsque vous essayez de créer une application compatible avec plusieurs tailles d'appareils Android, vous souhaitez naturellement qu'elle exploite tout l'espace disponible sur les appareils plus grands, sans sacrifier la compatibilité ni l'usabilité sur les écrans plus petits. Au premier abord, il peut sembler que la prise en charge de plusieurs APK est la meilleure solution, mais ce n'est souvent pas le cas. La section Utiliser un seul APK à la place du guide du développeur pour plusieurs APK inclut des informations utiles pour y parvenir avec un seul APK, y compris l'utilisation de notre bibliothèque d'assistance. Vous devez également lire le guide sur la compatibilité avec plusieurs écrans. Il existe même une bibliothèque d'assistance que vous pouvez télécharger à l'aide du SDK Android. Elle vous permet d'utiliser des fragments sur les appareils antérieurs à Honeycomb (ce qui facilite grandement la compatibilité avec plusieurs écrans dans un seul APK).

Si vous le pouvez, limiter votre application à un seul APK présente plusieurs avantages, dont les suivants:

  • La publication et les tests sont plus faciles
  • Il n'y a qu'une seule base de code à gérer
  • Votre application peut s'adapter aux modifications de la configuration de l'appareil
  • La restauration des applications sur plusieurs appareils fonctionne simplement
  • Vous n'avez pas à vous soucier des préférences du marché, du comportement des "mises à niveau" d'un APK à un autre, ni de l'APK associé à une classe d'appareils.

Le reste de cette leçon suppose que vous avez effectué des recherches sur le sujet, que vous avez attentivement absorbé le contenu des ressources associées et que vous avez déterminé que plusieurs APK sont le bon choix pour votre application.

Représenter vos exigences

Commencez par créer un graphique simple pour déterminer rapidement le nombre d'APK dont vous avez besoin et la ou les tailles d'écran qu'ils couvrent. Heureusement, il est facile de dresser vos exigences rapidement et facilement, et de les avoir à disposition pour plus tard. Commencez par une ligne de cellules représentant les différentes tailles d'écran disponibles sur la plate-forme Android.

petit normal grand xlarge

Il vous suffit maintenant de colorier le graphique de sorte que chaque couleur représente un APK. Voici un exemple de façon dont vous pouvez appliquer chaque APK à une certaine plage de tailles d'écran.

petit normal grand xlarge

Selon vos besoins, vous pouvez également avoir deux APK, "small and everything else" (petit et tout le reste) ou "xlarge and everything else" (très grand et tout le reste). La coloration du graphique facilite également la communication au sein de l'équipe. Vous pouvez désormais simplement désigner chaque APK par "bleu", "vert" ou "rouge", quel que soit le nombre de types d'écrans qu'il couvre.

Placer tout le code et toutes les ressources communs dans un projet de bibliothèque

Que vous modifiiez une application Android existante ou que vous en créiez une à partir de zéro, c'est la première chose que vous devez faire avec le codebase, et de loin la plus importante. Tout ce qui est inclus dans le projet de bibliothèque ne doit être mis à jour qu'une seule fois (pensez aux chaînes localisées en fonction de la langue, aux thèmes de couleurs et aux bugs corrigés dans le code partagé), ce qui améliore le temps de développement et réduit le risque d'erreurs qui auraient pu être facilement évitées.

Remarque:Bien que les détails de l'implémentation de la création et de l'inclusion de projets de bibliothèque ne relèvent pas du champ d'application de ce cours, vous pouvez vous familiariser avec le sujet en lisant Créer une bibliothèque Android.

Si vous convertissez une application existante pour qu'elle prenne en charge plusieurs APK, recherchez dans votre codebase tous les fichiers de chaînes localisées, les listes de valeurs, les couleurs de thème, les icônes de menu et la mise en page qui ne changeront pas entre les APK, puis placez-les tous dans le projet de bibliothèque. Le code qui ne changera pas beaucoup doit également être placé dans le projet de bibliothèque. Vous devrez probablement étendre ces classes pour ajouter une ou deux méthodes d'un APK à un autre.

Si, en revanche, vous créez l'application à partir de zéro, essayez autant que possible d'écrire du code dans le projet de bibliothèque d'abord, puis de ne le déplacer vers un APK individuel que si nécessaire. Cela est beaucoup plus facile à gérer à long terme que d'ajouter ce blob à un, puis à un autre, puis à un autre, puis des mois plus tard, d'essayer de déterminer si ce blob peut être déplacé vers la section de la bibliothèque sans tout gâcher.

Créer des projets APK

Un projet Android distinct doit être créé pour chaque APK que vous allez publier. Pour faciliter l'organisation, placez le projet de bibliothèque et tous les projets APK associés dans le même dossier parent. N'oubliez pas non plus que chaque APK doit avoir le même nom de package, bien qu'il ne soit pas nécessaire de le partager avec la bibliothèque. Si vous aviez trois APK suivant le schéma décrit précédemment, votre répertoire racine pourrait se présenter comme suit:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Une fois les projets créés, ajoutez le projet de bibliothèque en tant que référence à chaque projet d'APK. Si possible, définissez votre activité de démarrage dans le projet de bibliothèque et étendez-la dans votre projet APK. La définition d'une activité de démarrage dans le projet de bibliothèque vous permet de regrouper toute l'initialisation de votre application au même endroit, de sorte que chaque APK individuel n'ait pas à réimplémenter des tâches "universelles" telles que l'initialisation d'Analytics, l'exécution de vérifications de licence et toute autre procédure d'initialisation qui ne change pas beaucoup d'APK à l'autre.

Ajuster les fichiers manifestes

Lorsqu'un utilisateur télécharge une application qui utilise plusieurs APK via Google Play, l'APK approprié est sélectionné à l'aide de deux règles simples:

  • Le fichier manifeste doit indiquer qu'un APK particulier est éligible.
  • Parmi les APK éligibles, celui dont le numéro de version est le plus élevé remporte l'enchère.

À titre d'exemple, prenons l'ensemble de plusieurs APK décrit précédemment et supposons que chaque APK a été défini pour prendre en charge toutes les tailles d'écran supérieures à sa taille d'écran "cible". Pris individuellement, la plage possible de chaque APK se présente comme suit:

petit normal grand xlarge
petit normal grand xlarge
petit normal grand xlarge

Toutefois, en appliquant la règle "le numéro de version le plus élevé l'emporte", si nous définissons l'attribut versionCode dans chaque APK de sorte que le rouge ≥ le vert ≥ le bleu, le graphique se réduit à ceci:

petit normal grand xlarge

Supposons maintenant que l'APK rouge comporte une exigence que les deux autres n'ont pas. La page Filtres sur Google Play du guide du développeur Android contient une liste complète des causes possibles. Par exemple, supposons que le rouge nécessite une caméra avant. En fait, l'objectif de l'APK rouge est d'utiliser l'espace d'écran supplémentaire disponible pour effectuer des actions amusantes avec la caméra avant. Mais il s'avère que tous les appareils de grande taille n'ont pas de caméra avant. Quelle horreur !

Heureusement, si un utilisateur parcourt Google Play à partir d'un tel appareil, Google Play examine le fichier manifeste, voit que Red indique que la caméra avant est obligatoire et l'ignore discrètement, ayant déterminé que Red et cet appareil ne sont pas faits pour s'entendre. Il verra alors que la couleur verte n'est pas seulement compatible avec les appareils de grande taille, mais qu'elle ne dépend pas de la présence ou non d'une caméra avant. L'utilisateur peut toujours télécharger l'application depuis Google Play, car malgré le problème de caméra avant, il existe toujours un APK compatible avec cette taille d'écran particulière.

Pour que tous vos APK soient sur des "canaux" distincts, il est important de disposer d'un bon schéma de code de version. Vous trouverez la valeur recommandée dans la section Codes de version de notre guide du développeur. Étant donné que l'exemple d'ensemble d'APK ne concerne qu'une seule des trois dimensions possibles, il suffit de séparer chaque APK par 1 000 et d'augmenter à partir de là. Cela peut se présenter comme suit:

Bleu: 1001, 1002, 1003, 1004…
Vert: 2001, 2002, 2003, 2004...
Rouge:3001, 3002, 3003, 3004...

En regroupant tout, vos fichiers manifestes Android devraient se présenter comme suit:

Bleu :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Vert :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Rouge :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Notez que, techniquement, plusieurs APK fonctionneront avec la balise "supports-screens" ou la balise "compatible-screens". Supports-screens est généralement privilégié, et il est généralement très déconseillé d'utiliser les deux balises dans le même fichier manifeste. Cela rend les choses inutilement compliquées et augmente le risque d'erreurs. Notez également qu'au lieu de tirer parti des valeurs par défaut (les valeurs "small" et "normal" sont toujours définies sur "true" par défaut), les fichiers manifestes définissent explicitement la valeur pour chaque taille d'écran. Vous éviterez ainsi bien des problèmes par la suite. Par exemple, la valeur xlarge est automatiquement définie sur "false" pour un fichier manifeste dont le SDK cible est inférieur à 9, car cette taille n'existait pas encore. Soyez donc explicite !

Vérifier votre checklist de pré-lancement

Avant d'importer votre application sur Google Play, vérifiez les points suivants. N'oubliez pas que ces points sont spécifiquement pertinents pour plusieurs APK et ne représentent en aucun cas une checklist complète pour toutes les applications mises en ligne sur Google Play.

  • Tous les APK doivent avoir le même nom de package
  • Tous les APK doivent être signés avec le même certificat
  • Chaque taille d'écran que vous souhaitez que votre APK prenne en charge, définie sur "true" dans le fichier manifeste. Chaque taille d'écran que vous souhaitez éviter, définie sur "false"
  • Vérifiez que vos filtres de fichier manifeste ne contiennent pas d'informations contradictoires (un APK qui n'est compatible qu'avec Cupcake sur les écrans XLARGE ne sera vu par personne).
  • Le fichier manifeste de chaque APK doit être unique pour au moins un des écrans, textures OpenGL ou versions de plate-forme compatibles.
  • Essayez de tester chaque APK sur au moins un appareil. À part cela, vous disposez de l'un des émulateurs d'appareils les plus personnalisables du secteur sur votre ordinateur de développement. Allez-y !

Il est également utile d'inspecter l'APK compilé avant de le mettre sur le marché, afin de s'assurer qu'il n'y a pas de surprises qui pourraient masquer votre application sur Google Play. C'est en fait très simple à l'aide de l'outil "aapt". Aapt (Android Asset Packaging Tool) fait partie du processus de compilation pour créer et empaqueter vos applications Android. Il est également un outil très pratique pour les inspecter.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Lorsque vous examinez la sortie aapt, assurez-vous qu'il n'y a pas de valeurs contradictoires pour "supports-screens" et "compatible-screens", et qu'il n'y a pas de valeurs "uses-feature" non intentionnelles ajoutées en raison des autorisations que vous avez définies dans le fichier manifeste. Dans l'exemple ci-dessus, l'APK sera invisible pour la plupart des appareils, voire pour tous.

Pourquoi ? En ajoutant l'autorisation requise SEND_SMS, l'exigence de fonctionnalité d'android.hardware.telephony a été ajoutée implicitement. Étant donné que la plupart (sinon tous) des appareils très grands sont des tablettes sans matériel de téléphonie, Google Play filtre cet APK dans ce cas, jusqu'à ce que de futurs appareils soient suffisamment grands pour être signalés comme ayant une taille d'écran très grande et disposent d'un matériel de téléphonie.

Heureusement, ce problème est facile à résoudre en ajoutant ce qui suit à votre fichier manifeste:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

L'exigence android.hardware.touchscreen est également ajoutée implicitement. Si vous souhaitez que votre APK soit visible sur les téléviseurs qui ne sont pas des appareils à écran tactile, vous devez ajouter ce qui suit à votre fichier manifeste:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Une fois que vous avez terminé la checklist prélancement, importez vos APK sur Google Play. Il peut s'écouler un certain temps avant que l'application ne s'affiche lorsque vous parcourez Google Play. Une fois qu'elle apparaît, effectuez une dernière vérification. Téléchargez l'application sur tous les appareils de test dont vous disposez pour vous assurer que les APK ciblent les appareils prévus.

Pour en savoir plus sur la publication de plusieurs APK sur Google Play, consultez la page Compatibilité avec plusieurs fichiers APK.