Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在模块化Android应用程序中共享依赖项_Java_Android_Android Gradle Plugin_Clean Architecture_Android Architecture - Fatal编程技术网

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

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

我有一个Android项目,它的架构是模块化的。我通过在多个Gradle模块之间划分它们的源代码来模块化这些项目,如下所示

下面是应用程序的结构

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

    implementation project(':domain')
    api project(':data')
现在,我在维护每个模块之间的依赖关系方面遇到了一些问题。由于每个模块都是一个单独的android模块,因此每个模块都有自己的
build.gradle
应用程序
模块可以使用
数据
模块中的类。但是,我有一些通用类(如一些注释、实用程序、广播类、匕首作用域等),我想在所有模块中使用它们。但这些是我面临的问题

  • 由于这些类包含在主模块
    app
    中,因此我无法 在我的
    数据
    中访问这些模块,因为这些模块没有 取决于更高层的
    app
  • 我在所有层中使用的任何库(例如:RxJava)都需要 包含在每个模块的
    build.gradle
为了解决这个问题,我考虑再添加一个android模块,比如说
common
,它将包含我所有的通用类以及我在所有模块中使用的库

我的所有其他模块
app
domain
data
都将依赖此模块

implementation project(':common')
因此,任何全局库和类都将添加到此模块中,并且每个单独的模块都只有特定于模块的类


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

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

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

  • 通用的
    基本ui
    模块包含主要的
    字符串.xml
    样式.xml
  • 其他前端模块(
    profile
    dashboard
    等)实现此
    基本ui
    模块
  • 将在所有面向用户的模块中使用的库作为
    api
    而不是
    实现包含在
    基本ui
  • 仅在某些模块中使用的库仅作为依赖项添加到这些模块中
  • 该项目还广泛使用了数据同步等,因此也有
    基本数据
    仪表板数据
    等模块,遵循相同的逻辑
  • 仪表板
    功能模块取决于
    仪表板数据
  • 应用程序
    模块仅依赖于功能模块、
    仪表板
    配置文件
我强烈建议你事先画出你的模块依赖流程,我们最终得到了大约15个模块,都是严格组织的。在您的案例中,您提到它已经是一个相当大的应用程序,所以我想
应用程序
需要从中提取功能模块,就像
一样。记住,小模块=需要重新编译的代码更少

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

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

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

在评论讨论之后,这里有一个示例图(很不整洁,但足以说明这个概念。请注意,区分
api
实现
将是一个很好的下一步):

解调你的应用程序?模块化只会帮助大型团队高效协作。大多数应用程序并不真正需要它。如果您遇到问题并且是一个单一的开发/小型团队,那么除了学习经验之外,维护“干净的体系结构”是没有意义的。这仅仅是为了学习,还是你打算把它投入生产?@KaranHarshWardhan这是一个生产应用程序,它的大小有点大。所以,我们希望在模块之间有一些明确的分离模块化如何帮助满足大尺寸需求?听起来你结束了-engineering@KaranHarshWardhan我想试试看。忘记它是否过度工程化,但是如果我们采用这样的模块化,那么对于上述问题,什么是理想的解决方案呢?感谢您的详细解释。你的方法听起来不错。另外,我还有一些疑问。根据我的理解,
基本ui
层是更接近框架的层。该层是否充当依赖项注入逻辑的驱动程序模块?我们使用dagger2进行DI。那么,所有子模块的依赖解析代码可以存在于该层中吗?它充当驱动程序