构建时间: 多模块vs单模块

205 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情

构建时间: 多模块vs单模块

简介

安卓社区的许多文章都说, 构建时间是模块化的好处之一. 他们说, 有了模块, 你的代码会被编译得更快.

甚至官方文档也这么说 developer.android.com/topic/modul…

但我有一些疑虑 — 添加模块意味着在编译应用程序时给Gradle增加了更多的工作要做. 所以我一直想自己检查一下, 了解这其中有多少是真的.

我已经检查过了, 而且准备分享我的结果.

我测量的内容

我测量了在工作期间最常使用的Gradle任务的执行时间.

这是同一个项目(源代码), 但分为不同数量的模块.

  1. 大量的模块.
  2. 较少的模块.
  3. 只有一个模块.

我测量的用例

  • ./gradlew clean — 对我来说, 当我切换一个分支或想重建Hilt的依赖关系时, 这是一项重要的任务. 在启动clean任务之前, 我执行了assembleDevDebug任务, 所以有了要清理的东西.
  • ./gradlew assembleDevDebug — 这是最重要的任务. 每次我在Android Studio中点击Make ProjectRun app时, 它都会被执行. 运行这个任务后, 我用./gradlew clean清理了项目.
  • ./gradlew assembleDevDebug –offline — 如果我不确定我的网络连接, 有时我会使用离线模式. 在运行任务后, 我清理了项目.
  • ./gradlew assembleDevRelease — 这个任务是由我的CI在组装构建用于QA验证时使用的. 在运行这个任务后, 我清理了项目.
  • ./gradlew assembleDevDebug 但这次没有清理项目, 以便检查模块数量对增量构建的影响.

我查过的代码

我对我目前正在进行的项目obimy.com/进行了检查. 所以它并不是什么演示或样本应用程序, 而是已经在生产中运行的应用程序.

该项目有:

  • 59个模块
  • 864个kotlin文件和1个java文件
  • 65个文件在assets中
  • 1个proto文件
  • 161个带资源的文件

模块结构:

0_f1K4J5vPQ45nEKfR.png

下一步, 我做了一个副本, 将特征子模块合并为一个模块.

例如, feature-A有数据模块, 领域模块和UI模块. 我把数据和领域模块移到了UI模块中, 所以一个功能有3个模块, 我使用了一个模块.

在合并了所有我可以合并的模块后, 我得到了33个模块.

我得到的模块结构是:

0_FUNSkKN1Libi5KGM.png

最后, 我把所有东西都合并到一个app模块中(说实话, 这很有挑战性 - 我必须更新导入, 因为我的模块有自己的资源. 这真是一项艰巨的工作).

我得到的模块结构是😅:

0_jFF8lRW19-ubUYNl.png

检查的前置条件: 我使用的是MacBook Pro 15, i7和16Gb内存. 我关闭了笔记本电脑上的所有程序(网络浏览器, 通信软件等), 因此没有任何东西可以影响到运行任务.

要实现检查自动化, 我写了一个简单的python脚本, 来执行任务并测量任务运行时长. 每一个任务执行5次.

脚本的链接是: gist.github.com/o-vitaliy/d…

测试结果

1模块项目中的任务assembleDevDebug显示了最佳时间. 5次运行的平均时间是75.4秒. 有33个模块的项目多工作了19.6秒, 所以它多了26%. 而59个模块的项目工作时间长37%.

1_Q9IJxROkX_aWZJSG32WZnw.webp

我很惊讶, 带有参数- offlineassembleDevDebug任务的执行时间比没有它的时长更长. 不过, 正如你所看到的, 1个模块的项目显示了最好的构建时间:

1_JsncYAxnbHrZ6UODOLazwg.webp

clean任务并没有被模块的数量显著影响.

1_95wMie3G5wcx_PPa5FPr5A.webp

assembleDevRelease任务运行时长被模块数量影响最大(我的指的是秒数绝对值). 你有的模块越多, 任务执行的时间就更长. 与只有一个模块的项目相比, 59个模块的项目组装发布构建的时间要长50%. 它多了近100秒的时间.

1_jdQI1co9vBQSQzZO_uAxzA.webp

每次执行完assembleDevDebug任务后不运行clean, 显示在多模块项目中, 增量构建的时间明显更长.

1_jDUAoBgI5rdqPJ2asA1aCA.webp

结论

正如我之前提到的, 除了脚本, 笔记本上没有其他东西在运行. Gradle不需要与其他程序共享笔记本的资源.

通常, 当我工作时, 我有AndroidStudio, 浏览器, Figma和其他程序打开. 所以我很确定, 我检查的每一个任务都会运行得更久, 而且模块化对构建时间的影响也会更大(以绝对秒值为单位).

在运行这些测试后, 我发现尽管模块化有很多好处, 但对于构建MVP或演示项目来说, 它可能不是最好的选择. 多模块项目中的每个任务都需要更长的时间来构建, 因此与单模块项目相比, 我将在编译上花费更多的时间.

请注意, 模块化甚至会使你的速度变慢.

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情