2016-08-20 32 views
6

几年前,当第一次采用gradle for Android(在Gradle 2.0之前)时,我发现使用和取决于一个模块会有一些开销,所以我已经远离将我的项目拆分为更小的模块,而是已经创建了非常大的模块。在尝试了一些其他构建系统(例如Buck)之后,通过将您的代码拆分为多个小模块来获得性能。 Kotlin等一些现代编程语言甚至具有专门构建的可见性修饰符,这些修饰符围绕将代码分解为模块的概念而构建。许多小模块或少数大型模块具有最佳构建性能?

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

+0

看到在整个构建过程主要是连续的,我不能完全肯定“揪”出来更小的模块会比在其他项目中潜在的再利用有利于其他。 –

+0

构建过程可以并行。好处是,如果你改变了依赖关系底部的一段代码,那么其他模块就不需要重建,而只需要把它们的输出合并到最终的版本中。 – spierce7

+0

如果这些模块不需要重建,那么这似乎回答你的问题,不是吗?这一过程将更快 –

回答

2

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

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

多个模块之间的开销由模块是量值的次序摇篮的配置步骤的组合减少得更快,并在内存中保存更多因此不必在每次编译运行时重新加载,也不要编译细粒度依赖性检查认为不需要重新编译的内容。

这里有提示:

  • 确保摇篮守护进程启用(默认情况下,现在,所以,除非你把它关掉了,都好)
  • 升级到1.0.3科特林(并保持眼出来不久1.0.4版本)
  • 使incremental Kotlin compilation

    要启用摇篮增量编译,你需要将kotlin.incremental属性设置为true(例如,通过将线kotlin.incremental = TR ue到项目根目录下的gradle.properties文件)。

  • 采用Android 2.1的工作室或更新,enable DEX in Process

    的Android 2.1工作室实现了新功能:敏捷在过程中,可以显着提高全面清理的速度建立以及提高即时运行性能。

  • 确保任何任务,您使用支持增量运行在摇篮,有的没有,可以减慢您的构建时间(例如Dokka任务运行,不管是什么改变了),你可以禁用你不工作” t需要所有的时间使用-x<task>参数到Gradle。

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

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

总体回答您的问题可能是整个项目的硬件,不同的配置,以及人们的观念,甚至滥用,并建立的错误配置不同的根本。考虑到上述改进,您必须决定花时间测试您的实际项目的当前状态 - 然后亲自查看!

+0

我很感谢你的彻底和深思熟虑的答案! – spierce7