简单几招提速 Kotlin Kapt编译

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

相关内容

原文地址:https://www.cnblogs.com/bluestorm/p/11403386.html

时间: 2024-08-03 02:27:21

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

简单十招提高jQuery执行效率

1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的jQuery选择语句: $('.elem') $('.elem', context) context.find('.elem') 我们用1.4.2.1.4.4.1.6.2三个版本的jQuery测试,看看浏览器在1秒内能够执行多少次.结果如下: 可以看到,1.6.2版本的运行次数,远远超过两个老版本.尤

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

本文转载自:大神 通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一下如何通过编译Android源码来手动添加一个系统服务,让编译之后的Android系统中存在我们的这个服务,每个应用都可以调用.但是本文得先介绍一下如何编写一个简单的驱动程序,先介绍了驱动程序,然后在通过JNI让framework层访问这个驱动程序,在通过注册服务来封装这个功能,最后在把这个服务添加

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

通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一下如何通过编译Android源码来手动添加一个系统服务,让编译之后的Android系统中存在我们的这个服务,每个应用都可以调用.但是本文得先介绍一下如何编写一个简单的驱动程序,先介绍了驱动程序,然后在通过JNI让framework层访问这个驱动程序,在通过注册服务来封装这个功能,最后在把这个服务添加到系统中,实现上层

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

android studio,简称AS,是集成开发环境,所谓集成,就是集编辑.编译.调试.打包等于一体.简单来说,通过AS,就可以开发出在android系统上运行的APP. 我使用的是macos系统.在这个网站寻找AS来安装:https://developer.android.com/studio/ 这个网站的最下面有提到对电脑的最低要求. 下载3.2版本,安装. 安装后就可以启动as,如果是覆盖安装,比如从2.3升级到3.2,那可以按向导的指引,使用之前的偏好设置. 这时as这个ide已经安装

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

时至今日,win10系统的普及率越来越高,在微软多种策略的强推下,10月份win10系统的市场份额已达22.59%,但win10系统也不是完美的,总有些还是会出现一些诸如打开应用程序出现闪退.乱码.总是弹出错误提示等,而之所以会出现这些问题,有可能是系统文件损坏了. 那么,遇到这些情况该怎么办?有一个简单的办法那就是直接用Dism命令修复即可,具体方法如下: 1.使用win+x快捷键打开菜单,选择"命令提示符(管理员)(A)",如下图所示: 2.打开后依次执行下面两条命令: DISM.

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

开发一个内部功能时碰到的需求,要把json数据在页面上展示出来,平时浏览器会安装jsonView这样的扩展来看json数据,但是程序要用到的话该怎么办呢?今天在网上搜索的时候,发现了这个小技巧,分享一下. 要用到的核心是JSON.stringify这个函数,没想到吧,平时我们只把它用来序列号json数据.但是这个stringify是有三个参数的, JSON.stringify(value [, replacer] [, space]) ,具体描述请看这里:https://msdn.microso

简单几招模拟网络超时情况

我们先来聊一聊网络超时的概念,以及模拟网络超时对我们程序的必要性 要想了解如何模拟网络超时的情况,我们需要先了解一下 为什么会网络超时呢 简单的说:就是你向服务端发送数据请求,然尔服务器没返回数据,或返回数据太慢导致未收到返回数据. 比如,你要下载一个东东,你向服务器发送下载这个东东的请求,但等了好长时间都没有收到服务器同意你接收下载数据的请求,所以也不能一直这样等下去,你的电脑就会报告网络超时,如果不是你的网络故障,那么就是对方服务器的问题. 我们知道在TCP建立连接的时候有3次握手的规则 1

简单几招删除MindManger中的幻灯片

MindManager 15中文版中,许多用户为了对制作的导图进行审阅和检查,会运用到幻灯片功能,将主题单独列出,也可以扩大细节.同样的,在完成对思维导图的检查后,用户可以幻灯片进行删除,恢复导图,文章主要讲解的是如何在MindManager 15中文版中删除幻灯片. 打开在MindManager 15中文版思维导图软件,制作好幻灯片后,在主题后会显示幻灯片图标. 在界面的左侧也会有幻灯片任务版面出现,其中会显现幻灯片主题. 在需要对幻灯片进行删除时,点击任务版面内的主题,右击在出现的对话框内选

简单三招,看清理财产品真面目

理财产品可分为如下三类 收利息的产品 原理:通过把钱借给别人,获得收益. 这类产品主要包括:银行存款.P2P.国债.企业债等. 做买卖的产品 原理,通过购买资产,赚得收益. 这类产品主要包括:股票.房子.黄金.外汇等. 雇人投资的产品 原理:通过花钱雇佣专业的投资人士,来帮你做投资,获得收益. 这类产品主要包括:基金公司发行的基金.银行发行的理财产品.证券公司发现的券商集合理财计划和信托公司发行的信托理财产品等. 原文地址:https://www.cnblogs.com/youcong/p/11