【问题标题】:What are the benefits of a multi-project build in Android?在 Android 中构建多项目有什么好处?
【发布时间】:2015-04-14 15:11:23
【问题描述】:

我正在阅读Android : Clean Architecture 的源代码,主要是为了学习如何正确地将应用程序组织成层,以及 MVP 模式,并将其与我在 MVP here 上阅读的内容相匹配.

但是,尽管结构很漂亮,但我并不真正理解将单个应用程序放入多个 子项目模块的好处 。考虑到它们(数据、表示、域)相互依赖,最终将成为同一个可执行文件的一部分,它看起来更像是配置地狱。

dependencies {
  ...
  compile project(':domain')
  compile project(':data')

Android 应用程序 划分为多个子项目(模块)有什么好处,而不是将它们保留在一个项目中而仅仅通过包将它们分开?

【问题讨论】:

  • 更多的是帮助您定义架构中层(圆)之间的线。如果您尝试向某个没有正确依赖关系的模块添加一些东西,它将阻止您这样做,因此您将符合架构

标签: android gradle multi-project


【解决方案1】:

实际上,这个问题不是针对 Android 的,而是更多与软件架构相关的问题,因为它适用于您开发的几乎所有软件(例如,为什么任何应用都包含多个模块,而不是全部在一个包中)。

将代码拆分成模块至少会给您带来以下好处(这是我想到的前 3 个):

  1. 模块之间的明确隔离。 MVP 模式的整个目标是确保您的业务逻辑和表示层没有紧密耦合在一起。通过在不同的模块中定义它们,可以使这种分离更加清晰,并鼓励您坚持这种模式。
  2. 代码重用 - 考虑这样一种情况:您有一个应用程序要出售给多个客户,但每个客户都希望获得不同的外观和感觉。如果您将所有代码都放在一个单一项目中,您将不得不为您的项目创建多个分支,每个客户一个分支,或者使用自定义选项使提供的应用程序代码膨胀。现在,如果另一方面你已经分离了你的模块,那么你可以为每个客户准备一个不同的表示层并将它与其他常见模块捆绑在一起。
  3. 将项目拆分为子项目可提高构建和测试的效率,因为您可以仅重新构建和测试已更改的模块,而不是在其中一个文件发生更改时重新编译整个项目。

我希望这对你有意义。

【讨论】:

  • 1 和 2 是的,3 .. 与 gradle 不一样,有时多模块方法实际上会减慢构建速度 [我的意见 - 懒于参考]
  • 但您可以选择仅构建特定模块(例如 gradlew -p submodule)而不是整个项目。此外,在 #2 中描述的场景的情况下,您将为所有发行版只编译一次公共代码,而不是为每个应用程序风格重新编译整个代码库。
  • @AmnonShochot 1. - MVP 的目标不是将业务与表示逻辑分离。它是只关注表示层,目标是使视图逻辑可测试。通过实现分层架构实现业务逻辑与ui(展示)、数据等层的分离。
【解决方案2】:

使用多模块项目而不仅仅是包的主要好处是模块之间的代码使用只在一个方向上。

模块内部的任何代码都可以有来回关系:

A -> 使用来自 -> B 的类

B -> 使用来自 -> A

的类

如果 A 和 B 在 单独的 模块中,这只会是单向的:

A ->(使用来自的类)-> B...

但是 B 在 A 中看不到任何东西。

这会将您的思维分成更小、更小的块。如果你需要了解模块 B 中的一个类是如何工作的,你只需要查看 B 中的其他类。 但是在第一种情况下,您必须查看 A 和 B 中的所有类。

另外,如果您确实想重用任何代码,您可以将该模块直接复制到下一个项目。

我通常将大部分代码放在模块中,并通过一个薄应用层将它们连接在一起。我建议使用依赖倒置来建立模块之间的任何连接。

【讨论】:

  • 即使你提到的是真的。您不能在两个方向上都依赖模块(这称为循环依赖)。你可以用包完成同样的事情。所以这根本不是优势。这被称为糟糕的设计。有许多不同的场景可以使用模块。值得一提的一个重要优势是,如果您创建了一个库模块,该模块将被应用程序的其余部分使用。然后当你编译时,如果你的库模块没有被修改,它就不必重新编译。这可以为您节省大量的构建时间。 (以及模块的其他用法)
【解决方案3】:

除了更快的构建时间之外,拆分成模块的另一个 Android 特定优势是应用的更新大小会更小。

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多