Java 如何在模块化Android应用程序中共享依赖项
我有一个Android项目,它的架构是模块化的。我通过在多个Gradle模块之间划分它们的源代码来模块化这些项目,如下所示 下面是应用程序的结构 此层次结构中的顶部模块,Java 如何在模块化Android应用程序中共享依赖项,java,android,android-gradle-plugin,clean-architecture,android-architecture,Java,Android,Android Gradle Plugin,Clean Architecture,Android Architecture,我有一个Android项目,它的架构是模块化的。我通过在多个Gradle模块之间划分它们的源代码来模块化这些项目,如下所示 下面是应用程序的结构 此层次结构中的顶部模块,App是其他模块都不依赖的模块,是应用程序的主要模块。较低级别的模块domain和data不依赖于App模块,其中App模块包括data和domain模块。我在app模块的build.gradle中添加了以下代码 implementation project(':domain') api project(':d
App
是其他模块都不依赖的模块,是应用程序的主要模块。较低级别的模块domain
和data
不依赖于App
模块,其中App
模块包括data
和domain
模块。我在app
模块的build.gradle中添加了以下代码
implementation project(':domain')
api project(':data')
现在,我在维护每个模块之间的依赖关系方面遇到了一些问题。由于每个模块都是一个单独的android模块,因此每个模块都有自己的build.gradle
。应用程序
模块可以使用数据
和域
模块中的类。但是,我有一些通用类(如一些注释、实用程序、广播类、匕首作用域等),我想在所有模块中使用它们。但这些是我面临的问题
- 由于这些类包含在主模块
中,因此我无法 在我的app
和数据
中访问这些模块,因为这些模块没有 取决于更高层的域
app
- 我在所有层中使用的任何库(例如:RxJava)都需要
包含在每个模块的
中build.gradle
common
,它将包含我所有的通用类以及我在所有模块中使用的库
我的所有其他模块app
、domain
和data
都将依赖此模块
implementation project(':common')
因此,任何全局库和类都将添加到此模块中,并且每个单独的模块都只有特定于模块的类
这是一个好方法吗?或者有什么方法可以有效地解决这个问题吗?我们最近遇到了这个问题,因为我们过渡到多模块项目以进行重用、构建时优化(不重新编译未更改的模块)等。您的核心目标是使您的
应用程序
模块尽可能小,因为它每次都会重新编译
我们使用了一些一般原则,这些原则可能对您有所帮助:
- 通用的
模块包含主要的基本ui
,字符串.xml
等样式.xml
- 其他前端模块(
,profile
等)实现此dashboard
模块基本ui
- 将在所有面向用户的模块中使用的库作为
而不是api
实现包含在
中基本ui
- 仅在某些模块中使用的库仅作为依赖项添加到这些模块中
- 该项目还广泛使用了数据同步等,因此也有
,基本数据
等模块,遵循相同的逻辑仪表板数据
功能模块取决于仪表板
仪表板数据
模块仅依赖于功能模块、应用程序
、仪表板
等配置文件
应用程序
需要从中提取功能模块,就像域
一样。记住,小模块=需要重新编译的代码更少
我们在确保在所有子模块中使用相同版本(buildType
,flavors
)的应用程序时遇到了一些问题。本质上,所有子模块都必须具有定义为app
模块的相同flavor
s和buildType
s
另一方面,多模块开发确实会让您考虑依赖关系,并强制要求功能之间严格分离。你可能会遇到一些你从未考虑过的意想不到的问题。例如,像显示应用程序版本这样简单的东西(免责声明:我的文章)
也帮助我们决定了我们的方法。您链接的文章似乎也是一个很好的资源,我希望它在我们转换时就存在
在评论讨论之后,这里有一个示例图(很不整洁,但足以说明这个概念。请注意,区分api
和实现
将是一个很好的下一步):
解调你的应用程序?模块化只会帮助大型团队高效协作。大多数应用程序并不真正需要它。如果您遇到问题并且是一个单一的开发/小型团队,那么除了学习经验之外,维护“干净的体系结构”是没有意义的。这仅仅是为了学习,还是你打算把它投入生产?@KaranHarshWardhan这是一个生产应用程序,它的大小有点大。所以,我们希望在模块之间有一些明确的分离模块化如何帮助满足大尺寸需求?听起来你结束了-engineering@KaranHarshWardhan我想试试看。忘记它是否过度工程化,但是如果我们采用这样的模块化,那么对于上述问题,什么是理想的解决方案呢?感谢您的详细解释。你的方法听起来不错。另外,我还有一些疑问。根据我的理解,
基本ui
层是更接近框架的层。该层是否充当依赖项注入逻辑的驱动程序模块?我们使用dagger2进行DI。那么,所有子模块的依赖解析代码可以存在于该层中吗?它充当驱动程序