原文地址 : medium.com/pulselive/a…android
随着 Android Studio 4.0 稳定版的发布,有人对于 Feature-on-Feature Dependencies 的做用提出了疑问,表示不理解,经过本篇将介绍它在 Android Studio 4.0 新版本中的做用。bash
这个功能其实和
com.android.dynamic-feature
有关,将某些库模块迁移到 DFM (Dynamic Feature Modules) 要求在项目结构中进行更改,可使基础 com.android.application 特性与任何 dynamic features 之间的依赖关系反转,更多可见底部拓展阅读。app
在 Android Gradle Plugin 4.0.0 中,动态功能如今能够依赖于其余动态功能,当你的应用程序下载动态功能时,它还会下载它依赖的全部动态功能。ide
更多官方解释可见 feature-on-feature。post
通常 Feature-on-Feature Dependencies 中 Gradle 依赖关系图能够以下所示:gradle
最初,你可能会认为这仅适用于动态功能的某些特定用途,但这实际上有助于解决 Android Gradle Plugin 3.5 当前动态功能项目面临的一个很是现实的问题。ui
假设你有一个具备 3 个动态功能的项目,:video-list
、:video-player
和 :news
。其中 :video-list
和 :video-player
依赖于一个共同的库 :video-data
,以下图所示多是你会使用的 Gradle 依赖项:this
具备3个动态功能的示例项目,其中2个依赖于相同的库模块。google
若是此时尝试构建此库,可能会收到一条错误消息,指出 2 个动态功能都打包了相同的库:spa
[: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.
复制代码
在Android Gradle Plugin 3.5 中,常见的依赖关系必须由 base 提供,所以你的 Gradle 依赖项将以下所示:
:video-data
必须由 :base
提供,由于 2 个或更多动态功能依赖于它, 这就产生了一个有趣的反作用,:news
如今隐含依赖 :video-data
。
若是要制做 :news
的 Instant apps
, 这将成为一个巨大的问题,由于 Instant apps
的下载大小限制为 4MB,若是此时依赖库实际上并不须要,那么将下载大小降至 4MB 如下将很是困难。
例如
:video-data
可能依赖于 Google Play 服务提供的 Cast 库,若是此时的项目还没有使用 Google Play 服务,则会变成一个很大浪费的依赖关系。
在 Android Gradle Plugin 4.0 中的 Feature-on-Feature 依赖关系解决了此问题,此时有两种不一样的选择,能够像这样进行 :video-list
依赖 :video-player
:
反之亦然,即 :video-player
取决于 :video-list
, 如今就再也不拥有 2 个彻底依赖于的动态功能 :video-data
,而且 “AGP is happy” 。
你还可使 :video-data
本身成为动态功能,并具备 :video-list
和 :video-player
依赖 :video-data
。
这些解决方案中的任何一个,都将避免 3.5 里常见的依赖项构建错误,并确保它们 :news
不依赖 :video-data
,所以 :news
能够做为 4MB 即时应用发布。
补充:对于 DFM (Dynamic Feature Modules),基本对象
com.android.application
是com.android.dynamic-feature
模块的依赖项,这意味着您可使用 DFM 中基本模块及其库中定义的任何类,可是在编译时不能从 base application 中引用 DFM 中定义的任何代码。