我有一个以模块化方式架构的 Android 项目。我通过将项目的源代码划分到多个 Gradle 模块之间来模块化项目,遵循干净的架构 https://antonioleiva.com/clean-architecture-android/.
这是应用程序的结构。
该层次结构中的顶层模块,App
是没有其他模块依赖的模块,是应用程序的主模块。下层模块domain
and data
不依赖于App
模块,其中App
模块包括data
and domain
模块。我在 build.gradle 中添加了以下代码app
module
implementation project(':domain')
api project(':data')
现在,我在维护每个模块之间的依赖关系方面遇到了一些问题。由于它们中的每一个都是一个单独的 android 模块,因此它们中的每一个都有自己的build.gradle
. The App
模块可以使用中的类data
and domain
模块。但是,我有一些通用类(例如一些注释、实用程序、广播类、Dagger 范围等),我想在所有模块中使用它们。但这是我面临的问题
- 由于这些类包含在主模块中
app
, 我不能
在我的中访问这些data
and domain
,因为这些模块不
取决于更高层app
- 我在所有层中使用的任何库(例如:RxJava)都需要
包含在
build.gradle
每个模块的
作为这个问题的解决方案,我想再添加一个 android 模块,比如说common
它将包含我所有的通用类以及我在所有模块中使用的库。
我的所有其他模块app
, domain
and data
将将此模块作为依赖项。
implementation project(':common')
因此,任何全局库和类都将添加到此模块中,并且每个单独的模块将仅具有特定于模块的类。
这是一个好方法吗?或者有什么办法可以有效的解决这个问题吗?
我们最近遇到了这个问题,因为我们过渡到多模块项目以进行重用、构建时间优化(未更改的模块不会重新编译)等。您的核心目标是使您的app
模块尽可能小,因为每次都会重新编译。
我们使用了一些一般原则,可能会对您有所帮助:
- 普通的
base-ui
模块包含主要strings.xml
, styles.xml
etc.
- 其他前端模块(
profile
, dashboard
等)实现这个base-ui
module.
- 将使用的库all面向用户的模块包含在
base-ui
, as an api
代替implementation
.
- 仅在以下情况下使用的库some仅在这些模块中将模块添加为依赖项。
- 该项目也广泛使用数据同步等,因此还有
base-data
, dashboard-data
等模块,遵循相同的逻辑。
- The
dashboard
功能模块取决于dashboard-data
.
- The
app
模块仅依赖于功能模块,dashboard
, profile
, etc.
我强烈建议事先勾勒出模块依赖流程,我们最终得到了大约 15 个模块,所有模块都经过严格组织。就您而言,您提到它已经是一个相当大的应用程序,所以我想app
需要从中取出功能模块,就像domain
。请记住,小模块=需要重新编译的代码更少!
我们在确保相同版本时遇到了一些问题(buildType
, flavors
)的应用程序已在所有子模块中使用。本质上,所有子模块都必须具有相同的flavor
s and buildType
s 定义为app
module.
另一方面,多模块开发确实让您考虑依赖关系,并强制功能之间严格分离。您可能会遇到一些以前从未考虑过的意外问题。例如,像显示应用程序版本这样简单的事情突然变得复杂 https://blog.jakelee.co.uk/how-to-display-app-version-inside-a-submodule/(免责声明:我的文章)。
本文 https://medium.freecodecamp.org/how-modularisation-affects-build-time-of-an-android-application-43a984ce9968也帮助我们决定了我们的方法。您链接的文章似乎也是一个很好的资源,我希望它在我们转换时就存在!
After comment discussion, here's an example diagram (with unfortunate untidiness, but enough to illustrate the concept. Note that distinguishing between api
and implementation
would be a good next step):
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)