Feature modules allow you to separate certain features and resources from the base module of your app and include them in your app bundle. You can then customize delivery options to control when and how devices running Android 5.0 (API level 21) or higher download your app's features.
Keep in mind, this type of modularization requires more effort and possibly refactoring your app’s existing code, so consider carefully which of your app’s features would benefit the most from being available to users on demand.
If you want to gradually modularize app features over time, without changing the behavior of your app or customizing advanced delivery options, you can do so by creating feature modules that are configured for install-time delivery. That is, you can modularize a feature as a feature module, but not enable advanced options so the feature is available when a user installs your app.
Additionally, feature modules that are configured for install-time delivery have the option to later be uninstalled if they're no longer required. For that, they need to be set up as removable.
This section describes how to create a feature module for install-time delivery. Before you begin, make sure you're using Android Studio 3.5 or higher and Android Gradle Plugin 3.5.0 or higher.
Configure a new module for install-time delivery
The easiest way to create a new feature module is by using Android Studio 3.5 or higher. Because feature modules have an inherent dependency on the base app module, you can add them only to existing app projects.
To add a feature module to your app project using Android Studio, proceed as follows:
- If you haven’t already done so, open your app project in the IDE.
- Select File > New > New Module from the menu bar.
- In the Create New Module dialog, select Dynamic Feature Module and click Next.
- In the Configure your new module section, complete the
- Select the Base application module for your app project from the dropdown menu.
- Specify a Module name. The IDE uses this name to identify the
module as a Gradle subproject in your
Gradle settings file. When you
build your app bundle, Gradle uses the last element of the subproject
name to inject the
<manifest split>attribute in the feature module’s manifest.
- Specify the module’s package name. By default, Android Studio suggests a package name that combines the root package name of the base module and the module name you specified in the previous step.
- Select the Minimum API level you want the module to support. This value should match that of the base module.
- Click Next.
In the Module Download Options section, complete the following:
Specify the Module title using up to 50 characters. Your app’s base module must include the module title as a string resource, which you can translate. When creating the module using Android Studio, the IDE adds the string resource to the base module for you and injects the following entry in the feature module’s manifest:
<dist:module ... dist:title="@string/feature_title"> </dist:module>
In the dropdown menu under Install-time inclusion, select Include module at install-time. Android Studio injects the following in the module’s manifest to reflect your choice:
<dist:module ... > <dist:delivery> <dist:install-time /> </dist:delivery> </dist:module>
If you want to learn how to create a feature module that you can download after app install, read configure on-demand delivery.
Check the box next to Fusing if you want this module to be available to devices running Android 4.4 (API level 20) and lower and included in multi-APKs. That means you can omit it from devices that don’t support downloading and installing split APKs. Android Studio injects the following in the module’s manifest to reflect your choice:
<dist:module ...> <dist:fusing dist:include="true | false" /> </dist:module>
After Android Studio finishes creating your module, inspect its contents yourself from the Project pane (select View > Tool Windows > Project from the menu bar). The default code, resources, and organization should be similar to those of the standard app module.
Make an install-time module removable
It might be useful to create feature modules for install-time delivery that have the option to be later uninstalled if no longer required. For example, to reduce the installed size of your app, you can modularize content that's required for training or onboarding, and then uninstall the feature module using the Play Core API after the user is set up to use your app.
Install-time modules are not removable by default. To mark a module as removable and allow it to be uninstalled, add the
removable tag and set its value to
<dist:module ... > <dist:delivery> <dist:install-time> <dist:removable dist:value="true"/> </dist:install-time> </dist:delivery> </dist:module>