- Azure DevOps
Xamarin introduced Android App Bundle support a few weeks ago, it’s now time to take benefit of it!
The Android App Bundle is a package that allows the user to download only what your application needs to run on their devices. For instance, if you have a big resolution for your screen device the application will probably use the resources from the
mipmap-xxxhdpi folder so what is the purpose of downloading other resolutions folders? Nothing,it’s useless.
By getting only what you need for your application it will:
With that in mind, let’s get started!
Let’s go to Azure DevOps and create a new pipeline.
Inside the Pipelines tab create a New pipeline and follow the 4 steps to get the source code from the correct repository. Azure DevOps will automatically create a new
azure-pipelines.yml at the root of your project folder. This is where the job definition will be set and then interpreted by Azure DevOps.
We will need to sign our Android application with a keystore. Create and upload it to the Pipelines > Library > Secure files tab, so it will be accessible by the build agent. In this tutorial the keystore will be named production.jks.
For security reasons we will need to create variables group to store alias and passwords associated to this keystore. If you are not familiar with this you can look at my previous tutorial about it.
For this tutorial, the variable group will be called
xamarin-android-aab. You will have only 3 variables inside:
We need to restore the Nuget packages of our project and load our variable group:
trigger: - master pool: vmImage: 'macos-latest' variables: - group: xamarin-android-aab steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '**/*.sln'
To be able to build an Android App Bundle we need to use the latest version of Xamarin SDK available now. To specify it we need to select the correct mono version on our agent. For more detail about choosing your mono version please visit the full Microsoft documentation. Currently the latest version is
So let’s specify it in our
- script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 6_6_0 displayName: "Select the Xamarin SDK version" enabled: true
With that done, we can now begin building our project. Conventially, when you want to generate an
apk for your Xamarin.Android application you use the
XamarinAndroid@1 task and the
AndroidSigning@3 task to build and sign your package. At the moment, these two tasks combined does not allow you to generate an Android App Bundle. Therefore, Microsoft teams provided a solution: command lines!
To get what we want we will add two tasks:
Go back to your
yaml configuration file:
- 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)
Don’t forget to set the
buildConfiguration variable to
Release like bellow.
variables: - group: xamarin-android-aab - name: buildConfiguration value: 'Release'
DownloadSecureFile@1 task allows us to get the keystore from our secure files. With the
Bash@3 task we can build our project using
msbuild command line. This will sign our application as well, nothing to do more!
Notice that the
AndroidPackageFormat parameter set the format of the package we need (Android App Bundle), with this value set you don’t need to setup your Xamarin.Android
csproj with more options.
Now if you run your job for the first time you will get a warning message asks you to give access to your secure files for the keystore:
Authorize it by clicking on
Permit, and your build will continue to run.
Final step is to get the
.aab file generated and published so you can then upload it to the store of your choice.
- 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'
If everything is done correctly you will be able to download your
aab file from Azure DevOps:
If you want to generate an
apk to check what kind of device configurations your app supports from your app bundle, you can use the
bundletool with the following command:
bundletool build-apks --bundle=/path_to/my_app.aab --output=/path_to/my_app.apks
More details about the
bundletool are available on the Android documentation.
I created some extensions to help you use bundletool directly in your pipelines, take a look at my tutorial about it.
You will find full source code in this Github repository.
You liked this tutorial? Leave a star in the associated Github repository!