Pulselive
Published in

Pulselive

A Quick Look at Feature-on-Feature Dependencies in Android Gradle Plugin 4.0.0

At first glance, Feature-on-Feature dependencies appears to be a change meant for niche dynamic features use cases. However, in this post we’ll explore how this change will make it much easier to build and ship instant apps.

In Android Gradle Plugin 4.0.0, dynamic features can now depend on other dynamic features. Now, when your app downloads a dynamic feature, it also downloads any dynamic features that it depends on.

Your Gradle dependency graph can now look something like this:

Feature-on-Feature example from https://developer.android.com/studio/preview/features

At first you may think that this only serves some niche use cases of dynamic features, however this actually helps solves a very real problem that dynamic feature projects currently face in Android Gradle Plugin 3.5.

Suppose you have a project with 3 dynamic features; :video-list, :video-player and :news. Both :video-list and :video-player depend on a common library; :video-data. You may try to set up your Gradle dependencies like this:

Example project with 3 dynamic features. 2 of which depend on the same library module.

If you now try to build this, you’ll get an error that says that 2 dynamic features both package the same library.

[:video-list, :video-player] all package the same library [:video-data].

Multiple APKs packaging the same library can cause runtime errors.
Adding the above library as a dependency of the base module will resolve this
issue by packaging the library with the base APK instead.

In Android Gradle Plugin 3.5, common dependencies have to be provided by base. So instead, your Gradle dependencies will look like this:

:video-data has to be provided by :base, because 2 or more dynamic features depend on it

This has produced an interesting side effect, :news now implicitly depends on :video-data . This becomes a huge problem if you want to make :news an instant app. Instant apps have a 4MB download size limit, and if you depend on libraries that you don’t actually need, it is going to make it very difficult to get the download size below 4MB. For example, :video-data may depend on the Cast library from Google Play Services, which is a big dependency if your project doesn’t already use Google Play Services.

Feature-on-Feature dependencies in Android Gradle Plugin 4.0 solves this issue, and you have a couple of different options.

You can make :video-list depend on :video-player like so:

This also works vice versa, i.e :video-player depending on :video-list

Now, you no longer have 2 completely separate dynamic features that depend on :video-data, and AGP is happy.

You can also make :video-data itself a dynamic feature, and have :video-list and :video-player depend on :video-data.

Either of these solutions will avoid the common dependency build error, and ensure that :news doesn’t depend on :video-data, so that :news can live happily as a 4MB instant app!

Further Reading

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store