[Kotlin翻译]让增量的KAPT发挥作用(加速你的Kotlin项目!)。

761 阅读3分钟

本文由 简悦SimpRead 转码,原文地址 medium.com

你的build.gradledependencies中是否有提到kapt?你是否使用Dagger, Glide, R......

你的build.gradle依赖项中有kapt吗?你是否使用Dagger、Glide、Room?有可能你可以通过启用增量注释处理来使你的项目构建速度更快。

Kotlin中的kapt编译器插件支持注释处理器。流行的库如DaggerData binding都在使用它。kapt编译器直到最近才支持增量处理--Kotlin 1.3.30发布时(2019年4月12日)。这意味着,某个模块的任何变化都会导致在每次构建中重新处理整个模块。这将导致大型模块的构建速度不必要地非常慢。

递增的kapt并不是开箱即用的。有三个条件需要满足。

  • 使用Kotlin 1.3.31或更新的版本
  • 通过在项目的gradle.properties中添加kapt.incremental.apt=true来启用增量kapt
  • 确保模块中的所有注解处理器都支持增量kapt整个Gradle模块将是非增量的 如果只有一个非增量的注释处理器。这也意味着你可以将带有非增量Kotlin注释的代码移到单独的模块中,以加快构建速度。

如何检测你项目中的非递增注释处理器?

你可以手动浏览你项目的所有模块并检查其依赖性。对于每个 "kapt "条目,你可以检查它是否支持增量 "kapt"(例如,有一个list here)。但最简单的方法是检查Gradle日志。

确保你的gradle.properties中有kapt.use.worker.api=true(如果没有,就在短时间内添加它),然后运行。

./gradlew aDeb -Pkapt.verbose=true

image.png

在日志输出中搜索字符串 "Processors that are not incremental"。这将列出每个模块中的非增量处理器。这是一个很好的起点。

注意: 你也可以在没有kapt.use.worker.api=true的情况下得到这个输出,但你需要用--info标志运行它--这会产生大量的输出。

如果你在你的模块中发现非增量注释处理器,该怎么办?

第一步是检查你是否在使用该库的最新版本。很多库最近刚刚增加了对增量注释处理器的支持(Realm, Dagger, ...)。所以你也许可以通过更新它们来使大部分的依赖关系支持增量处理。

有些库需要你手动启用它。例如,Dagger要求你在你的模块中添加这个。

android {
   defaultConfig {
      javaCompileOptions {
         annotationProcessorOptions {
            arguments << ["dagger.gradle.incremental": "true"]
         }
      }
   }
]

Note。如果你搜索一下,Dagger有几种方法,有些有效,有些无效--这个方法保证有效 :-)。

有一些流行的库仍然不支持增量注释处理。例如,来自Android架构组件的RoomLifecycle。或者Epoxy。你能做的不多--除了把带有注解的Kotlin类移到一个单独的Gradle模块中。这样一来,每次构建时就只有一个小模块需要重新处理了。

对构建性能的影响是巨大的--我们在Avast的一个大项目,的增量构建时间从3分钟降到了1分钟。如果你有较大的Gradle模块或单一模块的项目,那就更明显了

如何加快注释处理的更多方法

你还可以探索其他选项来加快处理速度。在kotlinlang.org/docs/refere…有一个很好的总结。你肯定应该启用kapt build cache,并尝试启用并行kapt处理。


www.deepl.com 翻译