语境
最新的Android Gradle插件8.0.0-Alpha10要求AGP的JDK17 min版本:
最好的时机展示了更新Java版本的潜在胜利。一些公司已经转移到了更新的Java版本,但是大多数Android项目仍在使用Java 11中建立。本文显示了在nowinandroid项目中使用不同JDK版本的构建影响的结果。我们将重点介绍应用于项目的增量更改,模拟本地构建。
Nowinandroid
存储库遵循开发的最佳实践,旨在作为开发人员的参考。它是由Kotlin和Jetpack组成的。
鉴于项目的规模(27个模块)以及最近在Android开发中构建组件的使用情况,这是一个完美的项目,应用我们将使用测量结果的方案。
设想
为了衡量JDK更新的影响,我们需要创建一个方案,该方案是对代码库中增量更改的模拟。为了创建和自动化场景,我们使用Gradle Profiler。 Gradle Profiler允许在增量场景中使用不同的突变,其中一些是:
- 申请构建脚本变更
- 应用项目依赖性变化
- 应用-Ab-Change-to-to
- 申请 - 非AB-Change-to
- 应用申请 - 统治 - 储备 - 更改
- 应用Android-Resource-Change-to
- 应用android-manifest-change-to
在本文中,我们将在模块:core:database
中使用apply-abi-change-to
。依赖关系图中模块:core:database
的位置为:
当我们在模块:core:database
(类NewsRopository)中执行任务assembleDebug
时,对构建的影响是:
- 22个受影响的项目
- 执行462个任务(31%)
- 执行58种不同类型的任务。
这些数字看起来不错,我们可以通过应用增量更改来复制本地方案。但是在开始实验之前,让我们首先讨论方法。
方法
- 我们将NowInandroid更新为Gradle 7.6,以支持JDK 19
- 实验的变体是JDK11,JDK17和JDK19。
- 每个变体执行都会运行一个带有2个热身和6个迭代的Gradle Profiler方案。
- 我们已经使用Gradle Enterprise API检索构建的构建信息。
- 结果在结果中被忽略了。
- 每个变体执行已重复48次。这意味着我们总共执行了288个构建。当然,不需要执行如此多的构建(10-20就足够),但是样本越重要,results的准确性就越准确。
- 结果基于任务执行而不是构建执行。我们倾向于通过构建执行来推动实验,但是我更喜欢更颗粒状并针对受更新影响的组件。我们需要减少构建的可变性。例如,我们对I/O操作所产生的配置时间或潜在改进(例如从本地缓存中阅读)不感兴趣。在Java更新上测量Kotlin/Java编译器任务时间比考虑整体构建更为重要。
- 为了避免结果中的噪音,我们只是考虑了任务类型,每次构建2秒的汇总时间。
结果
遵循方法,结果中仅考虑了5种不同的任务类型:
Gradle Base插件
Javacompile
Android Gradle插件
dexmergingTask
dexarchiveBuilderTask
包装
Kotlin Gradle插件
KaptgenerateStubStask
kaptwithoutkotlinct
概括
收集所有结果,NowInandroid项目中更新Java 11的改进为:
类型 | java 17 | java 19 |
---|---|---|
javacompile | 17% | 19% |
dexmeringTask | 5% | 14% |
dexarchiveBuilderTask | 10% | 12% |
packageapplication | 1% | 2% |
kotlincompile | 7% | 13% |
kaptgenerateStubStask | 5% | 11% |
kaptwithoutkotlinctask | 11% | 16% |
如果我们通过插件进行分组:
插件 | java 17 | java 19 |
---|---|---|
基本插件 | 17% | 19% |
Android Gradle插件 | 5% | 9% |
kotlin gradle插件 | 8% | 13% |
最后一句话
本文展示了使用较新的Java版本更新您的Android项目的潜在改进。当然,潜在的获胜可能会因您的项目和特征等特征而有所不同,例如模块数量,依赖关系图布局或开发人员执行的构建类型。但是,我们已经证明,更新Java版本会减少两个最昂贵的任务(例如Kotlin和Java编译器)的任务执行。
根据Java 17的更新,您有时间直到AGP 8的发布,但是只需努力,您就可以做好准备并改善团队的构建时间。
新年快乐,建筑快乐!