【问题标题】:Many small modules, or few large modules for best build performance?许多小模块,还是几个大模块以获得最佳构建性能?
【发布时间】:2016-08-20 23:33:25
【问题描述】:

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

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

【问题讨论】:

  • 鉴于构建过程大多是按顺序进行的,因此我不完全确定“拉出”较小的模块是否会比在其他项目中潜在的重用有益。
  • 构建过程可以是并行的。这样做的好处是,如果您更改了依赖项底部的一段代码,则不需要重新构建其他模块,只需将它们的输出合并到最终构建中即可。
  • 如果这些模块不需要重建,那么这似乎回答了你的问题,不是吗?这个过程会更快
  • 1.我不确定 android 插件有多聪明,但理论上它不应该被重建,并且 2. 我不知道将多个构建的源合并在一起会有多昂贵。几年前,我再次尝试过,发现多个模块速度较慢。

标签: java android gradle kotlin


【解决方案1】:

对于 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 文件中)。

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

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

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

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

请注意,由于Android plugin for Gradle changing the classpath ordering between builds,Gradle 中的 Android 构建之间的增量编译并不总是有效。尽管这在构建之间往往是一致的,但如果它重新计算类路径,它可能会是一个不同的顺序并导致一个新的完整构建。但无论您是构建单个模块还是多个模块,这都是一个问题。

您的问题的总体答案可能因项目、硬件、不同配置和人们的看法,甚至误用和错误配置而存在根本差异。鉴于上述改进,您必须决定花时间测试您实际项目的当前状态 - 并亲自看看!

【讨论】:

  • 感谢您周全而深思熟虑的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2020-04-04
  • 2018-11-12
相关资源
最近更新 更多