Photo par Isis França

Générer un Android App Bundle avec Xamarin et Azure DevOps

Migrer d'apk vers Android App Bundle

Posted by Damien Aicheh on February 03, 2020 · 8 mins

Xamarin a introduit la prise en charge des Android App Bundle il y a quelques semaines, il est maintenant temps d’en profiter!

Pourquoi utiliser les Android App Bundle ?

L’Android App Bundle est un package qui permet à l’utilisateur de télécharger uniquement ce dont votre application a besoin pour s’exécuter sur ses appareils. Par exemple, si votre écran a une grande résolution, l’application utilisera probablement les ressources du dossier mipmap-xxxhdpi, alors quel est le but de télécharger d’autres dossiers de résolutions ? Aucun, c’est inutile.

En obtenant uniquement ce dont vous avez besoin pour votre application, cela permettra:

  • Un téléchargement plus rapide
  • Une réduction de la taille de votre application sur l’appareil
  • D’économiser le forfait internet mobile de vos utilisateurs

Avec cela en tête, commençons!

Configurez votre pipeline

Passons à Azure DevOps et créons un nouveau pipeline.

Dans l’onglet Pipelines, créez un New pipeline et suivez les 4 étapes pour obtenir le code source à partir du repository approprié. Azure DevOps créera automatiquement un nouveau fichier azure-pipelines.yml à la racine du dossier de votre projet. C’est à cet endroit que la définition du job sera définie et ensuite interprétée par Azure DevOps.

Nous devrons signer notre application Android avec un keystore. Créez-le et uploadez-le dans l’onglet Pipelines > Library > Secure files, afin qu’il soit accessible par l’agent de génération. Dans ce tutoriel, le keystore sera nommé production.jks.

Pour des raisons de sécurité, nous devrons créer un groupe de variables pour stocker l’alias et les mots de passe associés à ce keystore. Si vous n’êtes pas familier avec cela, vous pouvez consulter mon précédent tutoriel à ce sujet.

Pour ce tutoriel, le groupe de variables sera appelé xamarin-android-aab. Vous n’aurez que 3 variables dedans:

Variable groups

Restaurer les Nugets

Nous devons restaurer les packages Nuget de notre projet et charger notre groupe de variables:

trigger:
- master

pool:
  vmImage: 'macos-latest'

variables:
  - group: xamarin-android-aab

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'

Selectionner le SDK Xamarin

Pour pouvoir créer un Android App Bundle, nous devons utiliser la dernière version du SDK Xamarin disponible maintenant. Pour le spécifier, nous devons sélectionner la bonne version mono sur notre agent. Pour plus de détails sur le choix de votre version mono, veuillez consulter la documentation Microsoft complète. Actuellement, la dernière version est 6.6.0.

Précisons-le donc dans notre azure-pipelines.yml:

- script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 6_6_0
  displayName: "Select the Xamarin SDK version"
  enabled: true

Compilons notre projet

Cela fait, nous pouvons maintenant commencer à compiler notre projet. Traditionellement, lorsque vous souhaitez générer un apk pour votre application Xamarin.Android, vous utilisez la task XamarinAndroid@1 et la task AndroidSigning@3 pour compiler et signer votre package. Pour le moment, ces deux tasks combinées ne vous permettent pas de générer un Android App Bundle. Par conséquent, les équipes Microsoft ont fourni une solution: les lignes de commande!

Pour obtenir ce que nous voulons, nous ajouterons deux tasks:

  • Une pour télécharger le keystore que vous utilisez pour signer votre application
  • Une pour compiler et signer l’Android App Bundle

Revenons à notre fichier de configuration yaml:

- task: DownloadSecureFile@1
  name: keyStore
  displayName: "Download keystore from secure files"
  inputs:
    secureFile: production.jks

- task: Bash@3
  displayName: "Download keystore from secure files"
  inputs:
    targetType: "inline"
    script: |
      msbuild -restore $(Build.SourcesDirectory)/XamarinAndroidAab/*.csproj -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:Configuration=$(buildConfiguration) -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(keyStore.secureFilePath) -p:AndroidSigningStorePass=$(keystore.password) -p:AndroidSigningKeyAlias=$(key.alias) -p:AndroidSigningKeyPass=$(key.password)

N’oubliez pas de définir la variable buildConfiguration à Release comme ci-dessous.

variables:
  - group: xamarin-android-aab
  - name: buildConfiguration
    value: 'Release'

La task DownloadSecureFile@1 nous permet d’obtenir le keystore de nos fichiers sécurisés. Avec la task Bash@3 nous pouvons compiler notre projet en utilisant la ligne de commande msbuild. Cela signera également notre application, rien de plus à faire! Notez que le paramètre AndroidPackageFormat définit le format du package dont nous avons besoin (Android App Bundle), avec cette valeur définie, vous n’avez pas besoin de configurer votre csproj Xamarin.Android avec plus d’options.

Maintenant, si vous exécutez votre job pour la première fois, vous obtiendrez un message d’avertissement vous demandant de donner accès à vos fichiers sécurisés pour le keystore:

Keystore warning

Autorisez-le en cliquant sur Permit, et votre build reprendra.

Publiez vos artefacts

La dernière étape consiste à générer et publier le fichier .aab afin que vous puissiez ensuite l’upload dans le store de votre choix.

- task: CopyFiles@2
  displayName: 'Copy deliverables'
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)/XamarinAndroidAab/bin/$(buildConfiguration)'
    Contents: '*.aab'
    TargetFolder: 'drop'

- task: PublishBuildArtifacts@1
  displayName: 'Publish release'
  inputs:
    pathToPublish: 'drop'
    artifactName: 'release'

Si tout est fait correctement, vous pourrez télécharger votre fichier aab depuis Azure DevOps:

Artifacts

Touche finale

Si vous souhaitez générer un apk pour vérifier quel type de configurations de périphérique votre application prend en charge à partir de votre Android App Bundle, vous pouvez utiliser le bundletool avec la commande suivante:

bundletool build-apks --bundle=/path_to/my_app.aab --output=/path_to/my_app.apks

Plus de détails sur le bundletool sont disponibles sur la documentation Android.

J’ai créé quelques extensions pour vous aider à utiliser bundletool directement dans vos pipelines, jetez un œil à mon tutoriel à ce sujet.

Sources:

Vous trouverez un exemple de code sur ce répertoire Github.

Happy codding !

Vous avez aimé ce tutoriel ? Laissez une étoile sur le répertoire Github associé !

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !