应用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. word中图片超出页边距_如何在Word中更改页边距
  2. 数据结构 - 二叉排序树BST(创建、遍历、删除节点)
  3. 兰州大学c语言课程作业答案,兰州大学C语言程序设计课程作业1.doc
  4. hackathon活动复盘
  5. 拓端tecdat|R语言极值分析:分块极大值Block-maxima、阈值超额法threshold excess、广义帕累托分布GPD拟合降水数据时间序列
  6. SpringBoot 实现SQL脚本自动执行
  7. newifi3 高恪魔改_新路由3高恪魔改固件
  8. Qt学习——任务一:按钮点击打开和关闭窗口
  9. 初学51单片机--网上教程(51自学网)
  10. mysql root不能登录密码怎么办_mysql 忘记root密码,重置密码,及重置密码后权限问题不能登录的解决方案...
  11. 用python读取Excel数据
  12. RabbitMQ使用教程
  13. AutoPatch java_《Oracle Applications DBA 基础》5- AD 工具 and patching
  14. [转]window xp IIS的配置(1)
  15. 深度解读AMBA、AHB、APB、AXI总线
  16. 软件评测师:数据库知识
  17. 养殖专家告诉你在农村养啥赚钱
  18. 伟大的程序员同志们累了看看我这笑话,巨搞笑!
  19. 不为人知的黑科技||双十一薅羊毛正确姿势
  20. 硅基压力传感器—MEMS

热门文章

  1. mysql丢失数据_MySQL数据丢失问题
  2. mysql btree fulltext_Mysql主要索引方式:FULLTEXT,HASH,BTREE,RTREE。
  3. python访问网页被拒_Python Requests.get访问网页403错误
  4. python函数参数的作用是_python函数参数的不同
  5. IDEA两步删除版本控制
  6. 根据两点经纬度计算距离和角度
  7. RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)
  8. 远程桌面服务器无法复制粘贴了怎么解决
  9. JavaScript get set方法 ES5 ES6写法
  10. GCD学习(五) dispatch_barrier_async