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

2024-04-17

我有一个以模块化方式架构的 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)的应用程序已在所有子模块中使用。本质上,所有子模块都必须具有相同的flavors and buildTypes 定义为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): module dependency diagram

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在模块化 Android 应用程序中共享依赖项 的相关文章

  • Android:保存新图像后刷新图库

    因此 在我的应用程序中 我有时将一堆图像保存到临时文件夹中 我希望它们立即显示在图库中 重新启动后 他们会这样做 但否则他们不会 我尝试过使用 sendBroadcast 方法 sendBroadcast new Intent Intent
  • 从 JVM 线程本地空间卸载 Clojure 变量

    我正在 Clojure 中为 BaseX 编写一个插件 通过 lein uberjar 构建 并包含 Clojure 解释器 在大多数情况下 这效果很好 然而 当通过 BaseX HTTP 实例运行时 评估在 Jetty 的线程池内进行 而
  • 如何为 JAXB MOXy 编写 JsonStructure (JSR-353) XmlAdaptor?

    我需要将一些任意 JSON 内容包装到 POJO 中 然后使用 MOXy JAXB 序列化为 JSON 但无法弄清楚如何绑定JsonObject与 JAXB 一起 我只需要整理JsonObject 不需要解组 即拥有 POJO XmlRoo
  • java有跳过列表实现吗

    I find ConcurrentSkipListSet http download oracle com javase 6 docs api java util concurrent ConcurrentSkipListSet html在
  • 在 Android 中移动目录的最快方法?

    在 Android 中移动目录最快的方法是什么 在大多数情况下 但并非所有情况 源和目标位于同一 SD 卡文件系统上 目前 我的代码遍历整个目录结构 并将每个文件的内容复制到新位置的同名新文件中 然后它会验证文件大小是否匹配 然后删除源文件
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • 主题中的文本外观

    我想将主题中的文本外观设置为 TextAppearnance Large 这是我在 styles xml 中所做的事情 我的应用程序在清单中指向这个主题 问题 我的文字仍然显示很小 问题 我在尝试在活动中使用预定义的 TextAppeara
  • 如何获取 Android 中其他应用程序的屏幕时间?

    我想达到在 Android 系统上运行的每个应用程序的屏幕时间 例如 Facebook 工作时间为 3 小时 但屏幕时间为 1 2 小时 我怎么才能得到它 android app usage 使用情况统计 public final clas
  • 模拟网络断开连接以在本地测试分布式应用程序分区

    我有几个在本地主机上运行的分布式应用程序实例 每个实例都通过某些端口与其他实例通信 所有实例一起构成一个整体 我实际上是在谈论动物园管理员 http hadoop apache org zookeeper 在 Linux 上运行 现在我想编
  • 在Android应用程序中导入Java项目?

    即使 Java 项目中的某些类在普通 Android 项目中无法识别 我是否可以在 Android 项目中使用 Java 项目 例如javax xml包 我认为有两种可能性 使用该 java 项目创建一个 jar 并将其导入到 androi
  • 多行 JTable 单元格在编辑期间不是多行的

    我正在开发一个应用程序 它有一个需要多行单元格的 JTable 因此 我扩展了 JTextArea 一切都显示出来了 但是当我尝试编辑单元格时 文本显示为单行 编辑后变为多行 我希望文本在编辑过程中保持多行 有没有办法做到这一点 创建您的表
  • 导航抽屉突出显示所选项目不起作用

    我试图突出显示选定的导航抽屉项目 但它不起作用 它仅在按下项目时突出显示 但在选择项目后不会保持突出显示 我有以下代码 列表视图
  • JDA Events 更新版本后停止工作 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个使用最新版本的 JDA 4 2 0 168 用 Ja va 开发的不和谐机器人 我的机器人中有几个事件 但只有一
  • ClassCastException:ApiVersionImpl 无法转换为 java.lang.Integer

    我有 android gradle 项目 当我尝试启动应用程序时出现以下异常 ClassCastException com android build gradle internal model ApiVersionImpl cannot
  • 使用外部属性文件执行 jar

    我有一个带有主类的 jar 可以像这样执行 java jar test jar 罐子里有类似的东西 public static void main String args throws IOException InputStream is
  • 带有 CompletableFuture 的 MDC 记录器

    我正在使用 MDC Logger 除了一种情况外 它对我来说非常适合 无论我们在代码中的何处使用 CompletableFuture 对于创建的线程 MDC 数据都不会传递到下一个线程 因此日志会失败 例如 在代码中我使用下面的代码片段来创
  • GSON 解析空日期字段时抛出异常

    我正在使用 GSON 反序列化一些 JSON JSON 是 employee id 297 surname Maynard givenname Ron lastlogin 员工对象有一个日期字段lastlogin public class
  • 创建 JSON 对象并将其转换为 Java 中的 String

    我需要通过 http post 发送一个相当长的 JSON 标头 在Python中是这样的 self body header client self client name clientRevision self client versio
  • 如何解决webview内容重叠的问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 嗨 当背景设置为透明时 如何解决we
  • 在Java中将资源文本文件读取到字符串[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有办法将资源中的文本文件读入字符串 我想这是一个流行的要求 但在谷歌搜索后我找不到任何实用工具 Y

随机推荐

  • 如何通过嵌套正确链接 Promise

    我的节点项目当前包含嵌套回调的侧向圣诞树 以便获取数据并按正确的顺序处理它们 现在我正在尝试使用 Promises 重构它 但我不确定如何正确执行 假设我要获取办公室列表 然后获取每个办公室的所有员工 然后获取每个员工的工资 最后 所有实体
  • 在共享内存进程中分配字符串

    我有一个程序需要在两个进程之间共享字符串 我已经声明了一个包含数组的结构 char 该结构体分配有shmget and shmat在主进程被分叉之前 typedef struct Queue int index char directory
  • 如何将 :first-child 选择器与 Shadow DOM 的 元素一起使用?

    我想从自定义元素的内容中提取第一段 作为摘要 我希望以下内容能够发挥作用
  • ObjectDatasource的Select方法抛出异常如何处理?

    我有一个连接到 ObjectDatasource 的 Select 方法 该方法可能会引发异常 但我不知道如何处理它 问题是我无法控制它 当页面呈现时 ObjectDatasource 直接调用 select 方法 并直接抛出未处理的异常
  • 基础目标、活动目标、部署目标

    我知道这个问题的部分内容有多种不同的形式 但我想确保我的答案是正确的 以下是我的假设和理解 我想在提交之前知道它们是否正确 我的应用程序假定所有操作系统都支持功能 因此我应该 将Active SDK设置为最新 当前为SDK 3 0 将部署目
  • Shapeless 中具有常量返回类型的多态函数

    长话短说 我试图弄清楚如何定义从通用输入到单一类型输出的函数 的背景 这是一个延续映射无形状记录 https stackoverflow com questions 26375886 mapping over shapeless recor
  • VSTO 加载项中的 SetProcessDPIAware

    网上有很多关于通过调用为 Winforms 应用程序设置 DPI 感知的帖子SetProcessDPIAware 或者通过对应用程序的清单进行一些相关更改 例如 如何配置应用程序以在具有高 DPI 设置 例如 150 的计算机上正确运行 h
  • 移动应用程序在后台时的 GPS 位置(使用 ionicframework)

    我需要实现一个应用程序来存储用户从 A 移动到 B 时的旅程 路径 现在 我知道 ionicframework 可以使用 GPS 但是当我的应用程序转到后台时会发生什么 我的应用程序如何继续存储用户位置 这可能吗 有没有我可以使用的插件 请
  • 图表网格线样式

    我正在使用 Visual Studio 2010 中的标准图表库 该图表工作正常 但我无法更改轴网格线样式 这些是已在 Form1 Designers cs 中设置的属性 chartArea3 Name ChartArea1 this ch
  • 当我们尝试将字符打印为浮点数和十六进制时,为什么 printf 的行为不同?

    我尝试在 printf 中将字符打印为浮点数并得到输出 0 这是为什么 还 char c z printf f X c c 给出了一些奇怪的十六进制输出 而当我这样做时输出是正确的 printf X c 为什么会这样呢 The printf
  • 如何在 Microsoft Surface 应用程序中显示 PDF 文档?

    我想在我的 Microsoft Surface 应用程序中显示 PDF 文档 我做了一些搜索 发现了很多可能性 但如果在 Microsoft Surface 中使用 所有这些似乎都有一些缺点 这个有趣的 http www screencas
  • 有类似“Firebug for IE”(用于调试 JavaScript)之类的东西吗?

    我正在尝试修复一些 JavaScript 错误 在 Firefox 中工作时 Firebug 使调试这些问题变得更加容易 但是当代码在 Firefox 上运行正常但 IE 却抱怨时 你该怎么办 您还可以查看IE 开发者工具栏 http ww
  • 使用 GOOGLE MAP API 的简单 Android 程序

    尝试使用 Google 地图 这是我使用 google Map API 的第一个程序 由于日志错误 我无法执行 我需要纠正自己的地方 MainActivity java public class MainActivity extends A
  • 如何将 {1,0} 与正则表达式匹配

    or 0 1 will match必要时采取一些模式 但现在我想反过来做 Say 不匹配如果需要的话 解决办法是什么 后面加个问号就可以了 0 1 as in 0 1 并且它会更喜欢匹配零次而不是一次 问号使它 不贪婪 这意味着它不会尽可能
  • UIButton 在 iOS 5.x 中不起作用,在 iOS 6.x 中一切正常

    通过点击主 UIView 上的简单 UIButton 附加视图 子视图 会出现在屏幕中央 以编程方式创建的子视图 在该子视图上 我有 UIButton 启动 MPMoviePlayer 此代码位于创建子视图的方法内部 Create play
  • Hibernate注解@Where带参数

    我目前有此类产品 以这种方式注释 我正在使用软删除 SQLDelete sql UPDATE products SET active 0 WHERE id product and last modification date Where c
  • IE(11)CSS多列处理不当?

    我正在使用 CSS 多列构建 2 列布局 并且我想给出有关在何处断开列的提示 所以我说 columns 2在容器上 以及break before column在我想要休息的地方 IE 在我的例子中是 11 决定将我的内容分成 3 列并溢出到
  • 使用条件对向量进行子集化(不包括 NA)

    vector1 c 1 2 3 NA condition1 vector1 2 vector1 condition1 vector1 condition1 TRUE 在上面的代码中 条件1是 FALSE TRUE FALSE NA 第三行和
  • 在执行器服务中实现线程超时

    所以现在我有一个相当基本的执行器服务 我用它来将程序分解为线程 如下所示 ExecutorService threadPool Executors newFixedThreadPool 12 for int i 0 i lt objectA
  • 如何在模块化 Android 应用程序中共享依赖项

    我有一个以模块化方式架构的 Android 项目 我通过将项目的源代码划分到多个 Gradle 模块之间来模块化项目 遵循干净的架构 https antonioleiva com clean architecture android 这是应