[英]How to share dependencies in a Modularized Android App
我有一个以模块化方式构建的Android项目。 我按照干净的架构 ,通过在多个Gradle模块之间划分源代码来模块化项目。
这是App的结构。
此层次结构中的顶层模块, App
是其他模块所不依赖的模块,是应用程序的主要模块。 较低级别的模块domain
和data
不依赖于App
模块,其中App
模块包括data
和domain
模块。 我在app
模块的build.gradle中添加了以下代码
implementation project(':domain')
api project(':data')
现在,我在维护每个模块的依赖关系时遇到了一些问题。 由于它们中的每一个都是一个单独的android模块,因此每个模块都有自己的build.gradle
。 App
模块可以使用data
和domain
模块中的类。 但是,我有一些通用的类,(例如一些注释,实用程序,广播类,Dagger范围等),我想在所有模块中使用它们。 但这些是我面临的问题
- 由于这些类包含在主模块
app
,因此我无法在我的data
和domain
访问这些类,因为这些模块不依赖于更高层的app
- 我在所有层中使用的任何库(例如:RxJava)都需要包含在每个模块的
build.gradle
中
作为解决方案,我想添加一个更多的android模块,比如说common
,它将包含我所有的通用类以及我在所有模块中使用的库。
我的所有其他模块app
, domain
和data
都将此模块作为依赖项。
implementation project(':common')
因此,任何全局库和类都将添加到此模块中,并且每个单独的模块将只具有特定于模块的类。
这是一个好方法吗? 或者有没有办法有效地解决这个问题?
我们最近遇到了这个问题,因为我们转换到一个多模块项目进行重用,构建时间优化(未重新编译未更改的模块)等。您的核心目标是使您的app
模块尽可能小,因为它将是每次重新编译。
我们使用了一些通用原则,可以帮助您:
base-ui
模块包含主要的strings.xml
, styles.xml
等。 profile
, dashboard
等)实现了这个base-ui
模块。 base-ui
,作为api
而不是implementation
。 base-data
, dashboard-data
等模块,遵循相同的逻辑。 dashboard
功能模块依赖于dashboard-data
。 app
模块仅依赖于功能模块, dashboard
, profile
等。 我强烈建议事先草拟出你的模块依赖流程,我们最终得到了大约15个模块,都是严格组织的。 在你的情况下,你提到它已经是一个相当大的应用程序,所以我想app
需要功能模块从中拉出来, domain
也是如此。 请记住,小模块=需要重新编译的代码更少!
我们遇到了一些问题,确保在所有子模块中使用相同版本的应用程序( buildType
, flavors
)。 实质上,所有子模块必须具有与app
模块相同的flavor
和buildType
。
另一方面,多模块开发确实让您考虑依赖关系,并强制执行功能之间的严格分离。 您可能会遇到一些您以前从未考虑过的意外问题。 例如,显示应用程序版本这样简单的东西突然变得复杂 (免责声明:我的文章)。
本文还帮助我们决定了我们的方法。 您链接的文章似乎也是一个很好的资源,我希望它在我们过渡时存在!
在评论讨论之后,这是一个示例图(不幸的不整洁,但足以说明这个概念。请注意,区分api
和implementation
将是一个很好的下一步):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.