应用Kotlin之后,涉及到注解的注解处理器依赖也会由annotationProcessor替换成kapt,和最初应用Kotlin一样,总会让人一种感觉,一番应用Kotlin和Kapt之后,编译耗时更长了,不过好在Kotlin和Google 在这一方面做了很多的优化和改进,本文将简单介绍一些配置,来实现项目编译关于kapt这方面的加速。

开启Gradle 构建缓存支持(Gradle build cache support)

默认情况下,kapt注解处理任务并没有利用开启gradle的构建缓存,需要我们手动增加配置开启

开启方式:在项目的app module下的 build.gradle 文件增加如下代码

1
2
3
kapt {useBuildCache = true
}

注意:

  • kapt配置和android配置同一层级。
  • 该特性支持从Kotlin 1.2.20开始。
  • 上述配置生效需Gradle为4.3及以上,且开启build-cache。(增加—build-cache 选项或在gradle.properties文件添加org.gradle.caching=true

并行执行kapt任务

为了加快构建速度,我们可以利用Gradle worker API实现并行执行kapt任务。

开启方式,在gradle.properties文件中增加

1
kapt.use.worker.api=true

注意:

  • Gradle worker API需依赖Gradle4.10.3及以上。
  • 该特性支持自Kotlin 1.2.60
  • 启用并行执行,会引发更高的内存占用

启用kapt编译规避

除此之外,我们可以利用Gradle compile avoidance(编译规避)来避免执行注解处理。

注解处理被略过的场景有

  • 项目的源文件没有改变
  • 依赖的改变是ABI(Application Binary Interface)兼容的,比如仅仅修改某个方法的方法体。

开启方式:

  • 对于注解依赖需要使用kapt显式声明
  • gradle.properties文件中增加kapt.include.compile.classpath=false

注意:

  • 该特性需 Kotlin 1.3.20 及以上

增量注解处理

Kotlin 自1.3.30引入了一个实验功能,即支持注解增量处理。

开启需要很简单,在gradle.properties中加入

1
kapt.incremental.apt=true

但是还需要有一个前提,就是开启Gradle的增量编译(Kotlin 1.1.1已默认开启)。

除此之外,关键的因素还是需要开依赖的注解处理器是否支持增量处理。

如何查看注解处理器是否支持增量编译

1
2
3
4
5
6
7
8
9
10
11
12
13
./gradlew aDeb -Pkapt.verbose=true | grep KAPT[INFO] Incremental KAPT support is disabled. Processors that are not incremental:com.bumptech.glide.annotation.compiler.GlideAnnotationProcessor,dagger.internal.codegen.ComponentProcessor,android.arch.lifecycle.LifecycleProcessor.
[INFO] Incremental KAPT support is disabled. Processors that are not incremental:butterknife.compiler.ButterKnifeProcessor,com.alibaba.android.arouter.compiler.processor.AutowiredProcessor,com.alibaba.android.arouter.compiler.processor.InterceptorProcessor,com.alibaba.android.arouter.compiler.processor.RouteProcessor,dagger.internal.codegen.ComponentProcessor,com.google.auto.service.processor.AutoServiceProcessor.

更新依赖至最新版

上面我们看到了glide,butterknife等依赖,我们都可以通过将这些依赖更新到最新版来解决

  • Glide在v4.9.0版本增加了增量处理支持,对应的github commit为 https://github.com/bumptech/glide/commit/a16a1baa140c9b87b9a68a2a3b91047fd60ba5d8
  • google/auto 也在较早的时候进行了支持,对应的github commit为 https://github.com/google/auto/commit/a5673d06f687e1354f1f069cce36136538cf532c

更新加手动配置

以Dagger为例,除了更新到最新版之外,还需要增加如下的配置

1
2
3
4
5
6
7
8
9
android {defaultConfig {javaCompileOptions {annotationProcessorOptions {arguments << ["dagger.gradle.incremental": "true"]}}}
]

参考链接https://github.com/google/dagger/issues/1120

Troubleshooting

  • 如果启用上面的方案导致问题,可以找到对应的配置,关闭该特性。

最后的建议

  • 积极保持依赖为最新(稳定)版,否则时间越长升级成本越大。

References

  • https://kotlinlang.org/docs/reference/kapt.html
  • https://medium.com/avast-engineering/making-incremental-kapt-work-speed-up-your-kotlin-projects-539db1a771cf

相关内容

  • 一些关于加速Gradle构建的个人经验
  • 关于应用Kotlin后的编译速度问题

简单几招提速 Kotlin Kapt编译相关推荐

  1. 轻松使用计算机,职称计算机Excel辅导:简单四招让你使用Excel轻松提速

    1.闪电般地输入数据 当你可以使用填充柄一步就完成数据输入时,为什么还要浪费时间在Excel中输入一连串的数据呢?这个程序能够为你自动生成所有类型的数字和文本序列,它甚至还能够在你创建自定义序列的时候 ...

  2. Kotlin1.6.20好用的新特性:多receiver扩展函数,绝不可空类型,并行编译kotlin减少编译时间

    前言 最近kotlin1.6.20新版本出来了,并带来了几个很好用的特性,来尝尝鲜 正文 1.多receiver扩展函数 kt的扩展函数大家应该都懂,但什么是receiver呢?比如下面的代码,是给V ...

  3. 安卓okhttp上传jason和图片_微信图片总是「已过期或被清理」?简单 3 招,可摆脱烦恼...

    微信图片总是「已过期或被清理」?简单 3 招可摆脱烦恼 除了文字.表格.PPT 和 PDF,大家日常办公中也常常和「图片文件」打交道. 于是,我们总碰到这样的问题: 1)图片文件太大,在线传输耗时,甲 ...

  4. 简单一招搞定公司牛人 转自 潘文富

    简单一招搞定公司牛人 潘文富 所谓公司牛人,就是在老板之下,众员工之上的人物.公司牛人,有的是凭借资历,有的是身居高位的职业经理人,有的是凭借自己在某方面的专业水平和经验,总之,有牛的资本. 这些牛人 ...

  5. 一支笔的测试点_一张纸一支笔,简单一招教你自测是否有眼底黄斑病变

    原标题:一张纸一支笔,简单一招教你自测是否有眼底黄斑病变 用眼过度.视力疲劳,紧张的工作或学习后,大多数人都容易出现眼前黑影.暗点,视力下降等情况.因为这些症状和"黄斑病"的早期症 ...

  6. pubg体验服服务器维护,简单1招,教你快速获得《Pubg Mobile》体验服“邀请码”!...

    大家好,欢迎来到<刺激实战教室>,我是你们的老朋友刺激哥. 收到粉丝私信,有粉丝询问:"怎么才能获得<Pubg Mobile>体验服的邀请码?"刚看到这个问 ...

  7. 【PR】简单一招教你使用蒙版做文字动画

    更多PR简单技巧尽在专栏中,会一直更新PR使用技巧 简单一招教你使用蒙版做文字动画 效果图 制作步骤 还可以加一个文字的缩放,从小到大的过程 博主微信欢迎交流 效果图 制作步骤 点击选择的字幕 点击钢 ...

  8. 计算机如何永久删除文件无法找回,电脑文件永久性删除了怎么办?简单五招教你恢复...

    原标题:电脑文件永久性删除了怎么办?简单五招教你恢复 怎样算是将电脑中的文件彻底删除掉了?要说平常的文件删除工作,我们一般只会右键点击文件,然后选择删除,这样,在原本位置上就看不到该文件,但是说到底, ...

  9. u盘电视测试软件,智能电视安装软件无法识别U盘怎么办?简单几招教你搞定!...

    原标题:智能电视安装软件无法识别U盘怎么办?简单几招教你搞定! U盘是智能电视及网络机顶盒安装软件必备的工具,但是也经常会出现U盘插在智能设备上不识别的情况,那么针出现这类情况有哪些原因呢?又该如何解 ...

最新文章

  1. Kubernetes 整体架构图
  2. linux grep find查找文件夹、代码中的某行/字符串
  3. linux软件升级直接替换,Linux几个命令的升级替代品
  4. linux数据污点标记,Taints和Tolerations(污点和容忍)
  5. 打印机每天都要重新连接
  6. springboot配置允许跨域访问
  7. 【转】3:C#异步WaitAll的使用
  8. matlab中的nlinfit,matlab中nlinfit问题!!!!!!!!!!!!
  9. 对未来计算机的畅想初中英语,初中英语期中考试,作文停电一小时,在北京……在上海……在威海…….doc...
  10. python可以进行矩阵运算吗_python能做MATLAB等价的矩阵运算吗?
  11. @sql 单元测试_10个最常见SQL单元测试错误
  12. 51NOD-1028 大数乘法V2【大数】
  13. Ubuntu 下 MySQL 数据自执行备份
  14. 07、基于ADC0808/ADC0809的多通道电压采集程序设计
  15. 实用供暖通风空调设计手册 第三版_从设计到施工,设计师必知的工艺材料知识都在这里!...
  16. Android编译环境搭建
  17. oracle 10015 trace name adjust_scn level level_num
  18. CSS 实现水晶按钮特效 - 来自 www.codesc.net
  19. 关于树莓派DSI屏幕触摸不准的问题
  20. OpenCV源码剖析之ImageDecoder

热门文章

  1. 第八章 ---- 枚举注解
  2. java鸟_java飞扬的小鸟
  3. java三个技术平台_Java的3个平台有什么区别
  4. oracle unpivot 索引_Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
  5. cmd杀死MySQL进程命令
  6. Java数组去重的方法
  7. matlab练习程序(径向模糊1)
  8. Java系统中如何拆分同步和异步
  9. windows 哪些服务必须打开
  10. ueditor样式过滤问题