11

我有一个以模块化方式构建的 Android 项目。我遵循干净的体系结构,通过在多个 Gradle 模块之间划分它们的源代码来对项目进行模块化。

这是应用程序的结构。

在此处输入图像描述

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

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

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

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

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

我的所有其他模块appdomain并将data将此模块作为依赖项。

implementation project(':common')

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

这是一个好方法吗?或者有什么方法可以有效地解决这个问题?

4

1 回答 1

17

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

我们使用了一些一般原则,可能会对您有所帮助:

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

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

在确保在所有子模块中使用相同版本的应用程序( buildType, ) 时,我们遇到了一些问题。flavors本质上,所有子模块必须具有与模块相同flavor的 s 和buildTypes 定义app

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

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

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

于 2019-01-13T22:12:56.723 回答