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

doe*_*doe 8 java android android-gradle-plugin clean-architecture android-architecture

我有一个以模块化方式构建的Android项目.我按照干净的架构,通过在多个Gradle模块之间划分源代码来模块化项目.

这是App的结构.

在此输入图像描述

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

    implementation project(':domain')
    api project(':data')
Run Code Online (Sandbox Code Playgroud)

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

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

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

我的所有其它模块app,domain以及data将具有该模块作为一个依赖.

implementation project(':common')
Run Code Online (Sandbox Code Playgroud)

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

这是一个好方法吗?或者有没有办法有效地解决这个问题?

Jak*_*eam 10

我们最近遇到了这个问题,因为我们转换到一个多模块项目进行重用,构建时间优化(未重新编译未更改的模块)等.您的核心目标是使您的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)的应用程序.实质上,所有子模块必须具有与模块相同的flavors和buildTypes app.

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

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

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