I. Introduction▲
Les APK Android peuvent prendre en charge sept types d'architectures différentes selon la présence de fichiers .so (bibliothèques natives) dans les dossiers lib/<ABI> de l'APK. Là où <ABI> correspond aux architectures supportées, c'est, sous Android : armeabi, armeabi-v7a, x86, mips, arm64-v8a, mips64, x86_64.
Toutes les architectures sont automatiquement supportées dans le cas où il n'y a pas de fichiers .so dans un APK, mais ce n'est pas le cas avec les projets Visual Studio* 2015. Les APK des projets d'applications Android* de Visual Studio* 2015 génèrent des APK spécifiques aux CPU, qu'il s'agisse de projets C# (Xamarin) ou Visual C++.
C'est une bonne pratique que de prendre en charge toutes les architectures sur lesquelles Android* peut tourner, à partir d'un seul APK. Si cela rend l'APK trop lourd ou s'il n'est tout simplement pas possible de le faire avec une chaîne de compilation spécifique, il est aussi possible pour une application d'avoir plusieurs APK disponibles sur le Play* Store, chacun ciblant une architecture différente.
Vous devez suivre une simple règle pour empaqueter et distribuer proprement plusieurs APK : les codes de version doivent être différents, et de préférence ordonnés de cette façon :
x86_64 versionCode > arm64-v8a > mips64 > x86 > mips > armeabi-v7a > armeabi.
La raison de cette règle est que le Play Store distribuera toujours l'APK qui a le plus haut code de version, parmi ceux qui sont compatibles avec l'appareil client. Les appareils x86(_64) peuvent également faire tourner des APK pour ARM, donc les codes de version les plus élevés doivent être attribués aux APK pour x86_84 et x86 afin que les bons APK soient distribués aux appareils qui peuvent le mieux les faire tourner.
II. Pour les projets Visual C# (Xamarin)▲
En mode debug, les fichiers .so pour toutes les architectures sont intégrés par défaut. Cela peut vous donner l'impression que tout va bien lorsque vous développez, mais en réalité, en mode release, seules les bibliothèques armeabi sont intégrées par défaut.
Pour changer cela, ouvrez les propriétés de votre application, et dans le menu « Android Options », dans « Advanced », cochez toutes les architectures que vous voulez prendre en charge :
Lorsque vous faites tourner une version release, la sortie sera un APK qui contient les bibliothèques pour toutes les architectures sélectionnées :
Si vous voulez réduire la taille de cet APK, vous pouvez forcer le compilateur à générer une APK par architecture (les codes de version seront correctement gérés par défaut) :
Pour voir comment télécharger ces APK multiples dans une application unique sur le Play Store, vous devrez suivre les étapes décrites à la fin de cet article.
III. Pour les projets Visual C++ ▲
Les projets Visual C++ sont activés par défaut pour deux cibles : ARM (armeabi-v7a) et x86.
Cependant, compiler pour x86 ou ARM génère une APK contenant uniquement des fichiers .so pour x86 ou ARM. C'est possible, mais ces APK ont exactement le même code de version, celui saisi dans AndroidManifest.xml. Cela signifie qu'ils ne peuvent pas tous deux être téléchargés vers le Play Store pour la même application.
Vous pouvez résoudre cela en forçant Visual Studio 2015 à générer les APK pour ARM et pour x86 avec des codes de version différents en ajoutant une règle ant spéciale.
Créez un fichier nommé « custom_rules.xml » avec ce contenu :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<project
name
=
"custom_rules"
>
<available
file
=
"libs/x86"
property
=
"x86Dir.exists"
/>
<available
file
=
"libs/armeabi-v7a"
property
=
"armDir.exists"
/>
<target
name
=
"-pre-build-x86"
if
=
"x86Dir.exists"
unless
=
"armDir.exists"
>
<echo>
prefixing version code with 5 (for x86 ABI).</echo>
<replaceregexp
file
=
"AndroidManifest.xml"
match
=
"android:versionCode.*([0-9]+).*"
replace
=
'android:versionCode="5\1"'
/>
</target>
<target
name
=
"-pre-build-arm"
if
=
"armDir.exists"
unless
=
"x86Dir.exists"
>
<echo>
prefixing version code with 3 (for armeabi-v7a ABI).</echo>
<replaceregexp
file
=
"AndroidManifest.xml"
match
=
"android:versionCode.*([0-9]+).*"
replace
=
'android:versionCode="3\1"'
/>
</target>
<target
name
=
"-pre-build"
depends
=
"-pre-build-x86,-pre-build-arm"
/>
</project>
Et placez-le avec le fichier « build.xml », à la racine du projet à empaqueter :
Une fois cela fait, les codes de version auront le préfixe 5 pour les APK pour x86 et un 3 pour les APK pour ARM. De cette façon, les APK générées peuvent être téléchargées directement vers le Play Store, tel que décrit dans la prochaine section.
III-A. Publier des APK multiples sur le Play Store▲
Allez sur la page d'ajout d'application et cliquez sur « Passer en mode avancé » le cas échéant.
Ensuite, importez vos APK avec différents supports ABI et codes de version. Ils doivent apparaître comme sur l'écran de gestion des applications, avec un résumé de leurs différences et codes de version :
Si quelque chose d'anormal apparaît, vous pouvez utiliser aapt dans les outils de compilation Android pour vérifier quels sont les versionCode et native-code pris en charge par un APK :
>C:\Android\sdk\build-tools\23.0.0-preview\aapt.exe dump badging App1.apk
package: name='com.xhallade.test versionCode='81' versionName='1.0' platformBuildVersionName='5.1.1-1819727'
…
native-code: 'x86_64'
>
Si vous voulez faire la même chose directement depuis un appareil Android et vérifier quels fichiers .so sont installés en même temps, vous pouvez utiliser Native Libs Monitor.
IV. Références▲
En savoir plus sur le support par Google Play du filtrage par architectecture CPU pour plusieurs APK.
Télécharger Native Libs Monitor sur Google Play.
Retrouvez toutes les ressources et outils Intel pour les développeurs Android sur la Zone des Développeurs Intel Android.
Le forum Intel Android pourra également vous aider dans vos questions.