Android app bundle (.aab) it's a new publishing format for android apps. This presentation handles all that is involved from dynamic delivery, split APKs, bundletool and dynamic features.
What is the need? ● It makes the support of different configurations better - Dynamic delivery ● Your users have a smaller APK to download ● It favors modularization i.e cleaner code base ● Leads us to dynamic features ● Google Play console handles the serving for you Lagos
● A fundamental component of Dynamic Delivery. ● Available on L+. ● With split APKs Google Play can break up a large app into smaller packages that are installed on a user's device based on device’s configuration Split APKs
● Base APK: contains all common code and resources ● Configuration APKs: contains resources based on device’s config i.e locale, architecture, screen density ● Dynamic Feature APKs: contains codes that can be downloaded at a later time. This will be discussed later in the presentation. 3 Kinds of Split APKs
12 android{ ... bundle { language { /* This property is set to true by default. Specifies that the app bundle should not support configuration APKs for language resources. These resources are instead packaged with each base and dynamic feature APK.*/ enableSplit = false } density { enableSplit = true } abi { enableSplit = true } } } Version 3.2+ + /app/build.gradle
Enroll in Google Play App Signing Create and manage your releases - upload app bundle Google Play serves APKs to devices as required Publishing App Bundles
It allows you break your app into modules/features. Your app handles the download and installation of each module when the user needs it. The core of this mechanism is the Play core library. This further helps your initial app size really small
● How many % of your users really need that feature? ● How large is the feature? ● Can your users wait a few seconds to download that feature? When to use dynamic features
32 val manager = SplitInstallManagerFactory.create(this) //check if module has already been installed if (manager.installedModules.contains(module_name)) { //load the module }
33 val manager = SplitInstallManagerFactory.create(this) if (manager.installedModules.contains(module_name)) { //load the module } // Create request to install a feature module by name. val request = SplitInstallRequest.newBuilder() .addModule(module_name) .build()
34 val manager = SplitInstallManagerFactory.create(this) if (manager.installedModules.contains(module_name)) { //load the module } // Create request to install a feature module by name. val request = SplitInstallRequest.newBuilder() .addModule(module_name) .build() // Load and install the requested feature module. manager.startInstall(request) .addOnSuccessListener {} .addOnFailureListener {}
37 //defer installation of some modules manager.deferredInstall(modules).addOnSuccessListener {} //uninstall modules that are no more needed val installedModules = manager.installedModules.toList() manager.deferredUninstall(installedModules).addOnSuccessListener {}