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

时间:2016-08-20 23:33:26

标签: java android gradle kotlin

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

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

1 个答案:

答案 0 :(得分:2)

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

您可以在最近的这篇文章中看到这些增加的一些示例:Kotlin vs. Java Compilation Speeds

通过结合Gradle的配置步骤减少了多个模块之间的开销,模块的速度更快,并且通过在内存中保留更多内容,以便不必在每次编译运行时重新加载,以及不编译细粒度依赖性检查认为不需要重新编译的东西。

以下是提示:

  • 确保Gradle守护程序已启用(默认情况下是现在,因此,除非您将其关闭,否则一切正常)
  • 升级到Kotlin 1.0.3(并尽快留意1.0.4版本)
  • 启用incremental Kotlin compilation
      

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

  • 使用Android Studio 2.1或更新版本和enable DEX in Process
      

    Android Studio 2.1启用了一项新功能:Dex In Process,可以显着提高全面清理构建的速度,并提高即时运行性能。

  • 确保您使用的任何任务都支持Gradle中的增量运行,有些不会减慢您的构建时间(例如Dokka任务运行无论发生什么变化),您可以禁用您不会执行的任务。 ; t一直需要使用-x<task>参数来Gradle。

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

请注意,由于Android plugin for Gradle changing the classpath ordering between builds,渐进式编译在Gradle中的Android版本之间始终不起作用。虽然这在构建之间往往是一致的,但如果它重新计算类路径,它将是一个不同的顺序并导致新的完整构建。但无论您是单个还是多个模块构建,这都是一个问题。

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