【译】Android Gradle 插件 4.0.0 中 Feature-on-Feature 的依赖关系

恋猫de小郭 2020/5/29 23:56:35

原文地址 : medium.com/pulselive/a…随着 Android Studio 4.0 稳定版的发布,有人对于 Feature-on-Feature Dependencies 的作用提出了疑问,表示不理解,通过本篇将介绍它在 Android Studio 4.0 新版本中的作用。这个功能其实和 com.android.dynamic-feature 有关,将某…

原文地址 : medium.com/pulselive/a…

随着 Android Studio 4.0 稳定版的发布,有人对于 Feature-on-Feature Dependencies 的作用提出了疑问,表示不理解,通过本篇将介绍它在 Android Studio 4.0 新版本中的作用。

这个功能其实和 com.android.dynamic-feature 有关,将某些库模块迁移到 DFM (Dynamic Feature Modules) 要求在项目结构中进行更改,可以使基础 com.android.application 特性与任何 dynamic features 之间的依赖关系反转,更多可见底部拓展阅读。

在 Android Gradle Plugin 4.0.0 中,动态功能现在可以依赖于其他动态功能,当你的应用程序下载动态功能时,它还会下载它依赖的所有动态功能。

更多官方解释可见 feature-on-feature。

一般 Feature-on-Feature Dependencies 中 Gradle 依赖关系图可以如下所示:

最初,你可能会认为这仅适用于动态功能的某些特定用途,但这实际上有助于解决 Android Gradle Plugin 3.5 当前动态功能项目面临的一个非常现实的问题。

假设你有一个具有 3 个动态功能的项目,:video-list:video-player:news。其中 :video-list:video-player 依赖于一个共同的库 :video-data,如下图所示可能是你会使用的 Gradle 依赖项:

具有3个动态功能的示例项目,其中2个依赖于相同的库模块。

如果此时尝试构建此库,可能会收到一条错误消息,指出 2 个动态功能都打包了相同的库:

[: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

如果要制作 :newsInstant 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.applicationcom.android.dynamic-feature 模块的依赖项,这意味着您可以使用 DFM 中基本模块及其库中定义的任何类,但是在编译时不能从 base application 中引用 DFM 中定义的任何代码。

Further Reading

  • developer.android.com/studio/prev…
  • issuetracker.google.com/issues/1168…
  • stackoverflow.com/questions/5…
  • developer.android.com/guide/app-b…
  • medium.com/androiddeve…

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[【译】Android Gradle 插件 4.0.0 中 Feature-on-Feature 的依赖关系]http://www.zyiz.net/tech/detail-137790.html

上一篇:带你深入理解 Flutter 中的字体“冷”知识

下一篇:为什么说80%的人都把ViewPager用错了?

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程