许多小模块,或几个大模块,以获得最佳的构建性能?

几年前,当我第一次采用Gradle for Android(在Gradle 2.0之前)时,我发现使用并依赖于模块会有一些开销,所以我没有将我的项目分成更小的模块,而是创建了非常大的模块。 在尝试了一些其他构建系统(例如Buck)之后,通过将代码分成多个小模块来获得性能。 一些像Kotlin这样的现代编程语言甚至具有可见性修饰符,这些修饰符专门围绕将代码分割为模块的概念而构建。

我们目前处于Gradle 2.14.1(差不多3.0),在过去的几个版本中,他们引用了大量的性能提升。 随着过去几年对Gradle / Android插件的更改,现在它是否会生成更快的构建,以将代码分割成更小的模块,或者使用更少的大型模块?

对于Gradle和Kotlin来说,最近整体构建的编译性能都有很大的提升。 包括降低构建中多个模块的开销。

您可以在最近的这篇文章中看到这些增长的一些示例: Kotlin与Java编译速度

多个模块之间的开销通过结合Gradle的配置步骤减少,模块的数量级更快,并且通过保留更多的内存使得它不必在每次编译运行时重新加载,而不是编译细粒度的东西依赖性检查认为不需要重新编译。

以下是提示:

  • 确保Gradle守护程序已启用(默认情况下是现在,因此,除非您将其关闭,否则一切正常)
  • 升级到Kotlin 1.0.3(并尽快关注1.0.4发布)
  • 启用增量Kotlin编译 :

    要为Gradle启用增量编译,需要将kotlin.incremental属性设置为true(例如,将行kotlin.incremental = true添加到项目根目录中的gradle.properties文件中)。

  • 使用Android Studio 2.1或更高版本并在Process中启用DEX

    Android Studio 2.1启用了一项新function:Dex In Process,可以显着提高完全清理构建的速度,并提高Instant Run性能。

  • 确保您使用的任何任务都支持Gradle中的增量运行,有些则不支持并且可以减慢构建时间(例如Dokka任务运行无论发生什么变化),您可以禁用始终不需要的任务-x参数到Gradle。

现在,对于多模块构建或单个模块构建来说,它是否更快,我现在发现没有改变的模块的开销可以忽略不计。 而对于那些有编译的正常成本。

请注意,由于Gradle的Android插件更改了构建之间的类路径顺序 ,渐进式编译在Gradle中的Android构建之间并不总是有效。 虽然这在构建之间往往是一致的,但如果它重新计算类路径,它将是一个不同的顺序并导致新的完整构建。 但无论您是单个还是多个模块构建,这都是一个问题。

您的问题的总体答案可能在项目,硬件,不同配置,人们的看法,甚至是构建的误用和错误配置方面存在很大差异。 鉴于上面提到的改进,你必须决定花时间测试你的实际项目的当前状态 – 并亲自看看!