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

几年前,当第一次采用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启用了一项新功能:Dex In Process,可以显着提高完整清理版本的速度,并提高即时运行性能。

  • 请确保您使用的任何任务都支持Gradle中的增量运行,有些则不会,并且可能会减慢构建时间(例如,无论更改哪个Dokka任务都会运行),您可以禁用所有不需要的任务-x<task>参数到Gradle。

现在,无论是多模块构建还是单模块构建都更快,我发现现在没有改变的模块开销可以忽略不计。 而对那些有,是编制的正常成本。

请注意,增量编译并不总是适用于Gradle中的Android构建,因为Gradle的Android插件改变了构建之间的类路径排序 。 虽然这在构建之间往往是一致的,但如果重新计算类路径,它将会是一个不同的顺序,并导致新的完整构建。 但是,无论您是单一或多个模块构建,这将是一个问题。

对于你的问题的总体回答可能在项目,硬件,不同的配置和人们的看法,甚至滥用和错误配置的基础上有根本的不同。 鉴于上面提到的改进,您必须决定花时间测试您的实际项目的当前状态 – 亲自查看!