测量Android项目中本地构建的JDK更新
#java #android #gradle #dpe

语境

最新的Android Gradle插件8.0.0-Alpha10要求AGP的JDK17 min版本:

JDK min requirement

最好的时机展示了更新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 position

当我们在模块: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

Image description

Android Gradle插件

dexmergingTask

Image description

dexarchiveBuilderTask

Image description

包装

Image description

Kotlin Gradle插件

KaptgenerateStubStask

Image description

kaptwithoutkotlinct

Image description

概括

收集所有结果,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的发布,但是只需努力,您就可以做好准备并改善团队的构建时间。

新年快乐,建筑快乐!