https://droidyue.com/blog/2019/08/18/faster-kapt/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

应用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等依赖,我们都可以通过将这些依赖更新到最新版来解决

更新加手动配置

以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

相关内容

简单几招提速 Kotlin Kapt编译的更多相关文章

  1. DedeCMS数据负载性能优化方案简单几招让你提速N倍

    前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利.今天,分享一下DedeCMS数据负载性能优化的方法. 接触织梦也有三年多时间了,对它可谓 ...

  2. android开发(0):android studio的下载安装与简单使用 | sdk的安装与编译运行

    android studio,简称AS,是集成开发环境,所谓集成,就是集编辑.编译.调试.打包等于一体.简单来说,通过AS,就可以开发出在android系统上运行的APP. 我使用的是macos系统. ...

  3. Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】

    本文转载自:大神 通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一 ...

  4. kotlin查看编译后的Java代码

    java学一下kotlin,由于用的是同样的jvm,那就说明他们的字节码文件应该是一样的,那么,如果我们能看到编译后的文件,那么学的更快了. 操作 1.打开一个.kt文件 2.在Android Stu ...

  5. 简单一招实现json数据可视化

    开发一个内部功能时碰到的需求,要把json数据在页面上展示出来,平时浏览器会安装jsonView这样的扩展来看json数据,但是程序要用到的话该怎么办呢?今天在网上搜索的时候,发现了这个小技巧,分享一 ...

  6. Win10系统出问题?简单一招即可修复win10!

    时至今日,win10系统的普及率越来越高,在微软多种策略的强推下,10月份win10系统的市场份额已达22.59%,但win10系统也不是完美的,总有些还是会出现一些诸如打开应用程序出现闪退.乱码.总 ...

  7. 简单三招,设计复杂ERP报表

    报表无疑是ERP系统中用到的最频繁的单据之一.比如每天采购要打印采购明细帐:仓库每天要导出收货或者出货明细:销售每天要打印订单明细等.故报表的设计在ERP系统开发中占据大半江山. 不过笔者在实际工作中 ...

  8. 简单几招助您加速 ARM 容器应用开发和测试流程

    随着5G时代的临近,低延迟网络.AI硬件算力提升.和智能化应用快速发展,一个万物智联的时代必将到来.我们需要将智能决策.实时处理能力从云延展到边缘和IoT设备端.阿里云容器服务推出了边缘容器,支持云- ...

  9. 简单几招,解决jQuery.getJSON的缓存问题

    今天做测试工作,发现了一个令我费解的问题,jquery的getJson方法在firefox上运行可以得到返回的结果,但是在ie8上测试,竟发现没有发送请求,故不能取到任何返回的结果,经历了一翻周折,找 ...

随机推荐

  1. RST复位报文

    复位报文段: 一些特殊情况,TCP一端向另一端发送复位报文,以通知对方关闭链接或者重新建立链接. 产生复位报文的三种情况: 1. 当客户端访问一个不存在的端口时,目标主机会给客户端发送一个复位报文段. ...

  2. 论文阅读笔记六十一:Selective Kernel Networks(SKNet CVPR2019)

    论文原址:https://arxiv.org/pdf/1903.06586.pdf github: https://github.com/implus/SKNet 摘要 在标准的卷积网络中,每层网络中 ...

  3. 论文阅读笔记六十:Squeeze-and-Excitation Networks(SENet CVPR2017)

    论文原址:https://arxiv.org/abs/1709.01507 github:https://github.com/hujie-frank/SENet 摘要 卷积网络的关键构件是卷积操作, ...

  4. 4.Vue双向绑定

    1.什么是双向数据绑定 Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化.这也算是 Vue.js 的精髓之处了 ...

  5. [RN] react-native FlatList 实现列表选中的最佳方式(刷新指定Item)

    效果如下: 核心思路就是往数据源里面 给每条数据加一个选中状态. 如图在网络请求完成之后,给每条数据添加一个select的状态: data.list.forEach(item => item.s ...

  6. mysql增加字段,修改字段,增加索引等语句

    mysql语句: 1.修改表名: rename table 旧表名 to 新表名; 2.修改字段类型: alter table 表名 modify column 字段名 字段类型(长度) 3.修改字段 ...

  7. Casbin权限模型

    权限框架casbin1.概述Casbin是一个强大的.高效的开源访问控制框架,其权限管理机制支持多种访问控制模型. Casbin支持以下编程语言: Casbin可以做到:支持自定义请求的格式,默认的请 ...

  8. cocos: RenderTexture 合并精灵图片

    var render = new cc.RenderTexture(730, 450); //创建渲染纹理对象,并数字确定宽度 render.begin(); var sp1 = cc.Sprite. ...

  9. Spring IOC 常用的注解

    一.@Bean 1.配置类 @Configuration public class MainConfig { @Bean public Person person(){ return new Pers ...

  10. Nodejs操作MySQL数据库

    https://github.com/mysqljs/mysql   如何用nodejs操作MySql数据呢,其实写法还是简单的, 1.开始在你的node项目中 npm install mysql - ...