繁体   English   中英

如何在模块化Android应用程序中共享依赖项

[英]How to share dependencies in a Modularized Android App

我有一个以模块化方式构建的Android项目。 我按照干净的架构 ,通过在多个Gradle模块之间划分源代码来模块化项目。

这是App的结构。

在此输入图像描述

此层次结构中的顶层模块, App是其他模块所不依赖的模块,是应用程序的主要模块。 较低级别的模块domaindata不依赖于App模块,其中App模块包括datadomain模块。 我在app模块的build.gradle中添加了以下代码

    implementation project(':domain')
    api project(':data')

现在,我在维护每个模块的依赖关系时遇到了一些问题。 由于它们中的每一个都是一个单独的android模块,因此每个模块都有自己的build.gradle App模块可以使用datadomain模块中的类。 但是,我有一些通用的类,(例如一些注释,实用程序,广播类,Dagger范围等),我想在所有模块中使用它们。 但这些是我面临的问题

  • 由于这些类包含在主模块app ,因此我无法在我的datadomain访问这些类,因为这些模块不依赖于更高层的app
  • 我在所有层中使用的任何库(例如:RxJava)都需要包含在每个模块的build.gradle

作为解决方案,我想添加一个更多的android模块,比如说common ,它将包含我所有的通用类以及我在所有模块中使用的库。

我的所有其他模块appdomaindata都将此模块作为依赖项。

implementation project(':common')

因此,任何全局库和类都将添加到此模块中,并且每个单独的模块将只具有特定于模块的类。

这是一个好方法吗? 或者有没有办法有效地解决这个问题?

我们最近遇到了这个问题,因为我们转换到一个多模块项目进行重用,构建时间优化(未重新编译未更改的模块)等。您的核心目标是使您的app模块尽可能小,因为它将是每次重新编译。

我们使用了一些通用原则,可以帮助您:

  • 一个常见的base-ui模块包含主要的strings.xmlstyles.xml等。
  • 其他前端模块( profiledashboard等)实现了这个base-ui模块。
  • 将在所有面向用户的模块中使用的库包含在base-ui ,作为api而不是implementation
  • 仅在某些模块中使用的库仅作为依赖项添加到这些模块中。
  • 该项目也广泛使用数据同步等,因此还有base-datadashboard-data等模块,遵循相同的逻辑。
  • dashboard功能模块依赖于dashboard-data
  • app模块仅依赖于功能模块, dashboardprofile等。

我强烈建议事先草拟出你的模块依赖流程,我们最终得到了大约15个模块,都是严格组织的。 在你的情况下,你提到它已经是一个相当大的应用程序,所以我想app需要功能模块从中拉出来, domain也是如此。 请记住,小模块=需要重新编译的代码更少!

我们遇到了一些问题,确保在所有子模块中使用相同版本的应用程序( buildTypeflavors )。 实质上,所有子模块必须具有与app模块相同的flavorbuildType

另一方面,多模块开发确实让您考虑依赖关系,并强制执行功能之间的严格分离。 您可能会遇到一些您以前从未考虑过的意外问题。 例如,显示应用程序版本这样简单的东西突然变得复杂 (免责声明:我的文章)。

本文还帮助我们决定了我们的方法。 您链接的文章似乎也是一个很好的资源,我希望它在我们过渡时存在!

在评论讨论之后,这是一个示例图(不幸的不整洁,但足以说明这个概念。请注意,区分apiimplementation将是一个很好的下一步): 模块依赖图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM