今天分享一下关于 Kotlin 编译里面比较重要的相关步骤:kapt。 在 kotlin 里,需要使用 apt 的话,需要使用 kapt 插件来替代 annotationProcessor 的声明: apply plugin: 'kotlin-kapt' // 依赖 kapt 需要把 kotlin 文件生成一个 Java 编译可以认识的产物。 (kaptClassLoader)) 这里执行的是 org.jetbrains.kotlin.kapt3.base.Kapt对象的 kapt 方法。 相关的内容,我们可以从中相关的内容了解 kapt 的原理。
APT和KAPT APT (Annotation Processor Tool):注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具。你可以为特定的注解,注册你自己的注解处理器。 KAPT与APT完全相同,只是在Kotlin下的注解处理器。 实例 使用编译时注解+APT+动态生成字节码完成了一个butterKnife最基础的findViewById的功能,适合入门学习。
应用Kotlin之后,涉及到注解的注解处理器依赖也会由annotationProcessor替换成kapt,和最初应用Kotlin一样,总会让人一种感觉,一番应用Kotlin和Kapt之后,编译耗时更长了 app module下的 build.gradle 文件增加如下代码 1 kapt { 2 useBuildCache = true 3 } 注意: kapt配置和android配置同一层级。 API实现并行执行kapt任务。 /gradlew aDeb -Pkapt.verbose=true | grep KAPT [INFO] Incremental KAPT support is disabled. /gradlew aDeb -Pkapt.verbose=true | grep KAPT [INFO] Incremental KAPT support is disabled.
Compared to KAPT, annotation processors that use KSP can run up to 2x faster. 同时ksp相比于kapt接入方式也更清凉,还有就是它本身也支持增量编译等。有兴趣的老哥可以仔细阅读下谷歌对于ksp的介绍,下面是传送门。 因为我们要获取到ksp的依赖,同时ksp和kapt一样,都是通过SPI的机制进行加载的,所以我们本身也要引入一个ksp的注解库。 耗时比较 我对其中一个module同时打开了ksp以及kapt,进行了数据测试。发现ksp的总耗时要比kapt要少。 对于编译速度有要求,同时对kapt当前的表现贼不满意的,就可以尝试下先行开发下kspCompiler了,因为这部分都是类生成,所以ksp和kapt可以同时存在于项目中,进行灰度实验测试编译速度哦。
‘annotationProcessor’ dependencies won’t be recognized as kapt annotation processors. Please change the configuration name to ‘kapt’ for these artifacts: ‘com.airbnb:deeplinkdispatch-processor 简而言之,需要把annotationProcessor切换为kapt就可以了。 'com.github.bumptech.glide:compiler:4.9.0' 切换后: api 'com.github.bumptech.glide:glide:4.9.0' kapt
① 为什么 KAPT 已经是瓶颈 KAPT(Kotlin Annotation Processing Tool)在 2017 年诞生时是一个"临时方案"——把 Java APT 的接口桥接到 Kotlin ,KAPT 相关任务往往占据 30-50% 的全量构建时间。 更形象地说,KAPT 是用了九年的 USB-A 转接头——凑合能用,但原生接口早就该上了。 ,生产版本(1.15.x)也已支持 KSP,且从 KAPT 迁移时 无需修改业务代码: // 移除旧的 KAPT 处理器 // kapt("com.squareup.moshi:moshi-kotlin-codegen 注意 Room schema 路径配置变更 4 彻底移除 KAPT 插件 所有处理器迁移完成后,从 plugins{} 移除 kotlin-kapt,清理残留 kapt{} 块 5 度量与优化
文章目录 一、报错信息 二、kotlin-kapt 插件简介 三、解决方案 一、报错信息 ---- 在 Android Studio 中开发 DataBinding , 使用 如下代码开发 绑定适配器 ; 在 @BindingAdapter("image") 处报如下错误 : To use data binding annotations in Kotlin, apply the 'kotlin-kapt ' plugin in your module's build.gradle 如下图所示 : 二、kotlin-kapt 插件简介 ---- kapt 英文全称为 " Kotlin Annotation Processing Tool " , Kotlin 语言注解处理工具 ; kotlin-kapt 插件 是 Kotlin 编译器插件的一种 , 其作用是在编译时处理 注解 ; 借助 kotlin-kapt 模块 , 这是 Kotlin 注解模块 ; plugins { id 'kotlin-kapt' } 添加完毕后 , 上述报错信息消失 ;
同时由于是一个空工程,我们把空工程定义为bundle-kapt,所以整体来说对于编译速度影响会变到最小。让各位大佬看下我们后续的优化结果。 初一开始我以为是kapt没有生成好或者别的什么原因导致的。 image.png 由于Hilt使用了kapt,所以很自然的打开了build/generated/source/kapt文件路径,之后我看了下DaggerHiltApplication_HiltComponents_SingletonC 突然这个时候我想到了一件事哦,也就是说我们的bundle-kapt模块,其实它的实际编译产物会根据接入业务的不同而产生实际的变更。 而bundle-kapt这个模块也很不幸,被当做了一个静态模块,变成了一个远端的产物,之后即时业务添加了再多的注入相关的,因为bundle-kapt没有参与编译,所以注入的能力就出错了。
引入kaptTheRouter的注解处理依赖kapt执行,所以要在项目里面手动引入,否则无法处理注解注:所有的模块都必须引入kapt,否则就有可能造成某些路由表不生成。 我最开始以为简单,就在最底层模块依赖了kapt,结果上层模块路由表都没有生成,查了好久才发现,所有模块都要加。 图片如果报找不到kapt,可能是因为没有引入kotlin-kapt的插件,参考步骤3里面的截图,接入对应的kapt。 如果是纯Java工程,需要用Java的APT处理,APT就不用引入插件了,直接把kapt改成annotationProcessorannotationProcessor "cn.therouter:apt 3.14159265358972F) .navigation(); TheRouter.build("如果没有参数,可以什么都不传").navigation();}KSP接入(可选,用于替代kapt
可以兼容 annotationProcessor,反之不行) // 注意 Kotlin 版本要加上 apply kapy // 或者 plugins { id 'kotlin-kapt Please change the configuration name to 'kapt' for these artifacts: 'xxxx'. 如果你是 kotlin 工程,请使用 kapt {your_porcessor_module} 的方式依赖,且需要依赖 kapt gradle 插件 apply kotlin-kapt 如果你是 Java 工程,请使用 annotationProcessor {your_porcessor_module} 的方式依赖,且不需要加上 apply kotlin-kapt kapt 可以兼容 annotationProcessor {your_porcessor_module} 的方式依赖,且需要依赖 kapt gradle 插件 apply kotlin-kapt,否则如果使用 annotationProcessor {your_porcessor_module
什么是注解处理器 话说,最近尝试了一下写了个注解处理器,也就是我们常见的 apt,在 Kotlin 当中有个插件叫 kapt,说的就是注解处理器。注解处理器能干什么呢? /tmp/kapt3 下面有个 stubs 目录: ? 这个目录里面会有从你的 Kotlin 源码生成的 Java 源码,注解处理器后面会跟据这些源码去做注解处理,这实际上就是 kapt 的原理啦,如果你之前看到过官方写的介绍 kapt 原理的文章,里面说的 ,所以我们还是要把它添加到运行时依赖的(kapt 下面 implementation 那句)。 kapt3/classes 中(原来是在 build/classes/java/main 中) ?
2.1.4"mmkv = "1.3.1"utilcodex = "1.31.1"arouter = "1.5.2"arouter-compiler = "1.5.2"org-jetbrains-kotlin-kapt "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin-android" }org-jetbrains-kotlin-kapt = {id = "org.jetbrains.kotlin.kapt",version.ref = "org-jetbrains-kotlin-kapt"}[bundles]2.添加lib-common implementation(libs.appcompat) implementation(libs.material) implementation(libs.arouter) kapt )}implementation(libs.arouter)kapt(libs.arouter.compiler)7.2 添加模块名称配置:kapt { arguments { arg
经验:很多团队构建慢的真正原因不是代码编译,而是 kapt 注解处理或某个资源合并 Task,Build Scan 一查便知。 KSP(Kotlin Symbol Processing) 是 Google 推出的替代方案,直接处理 Kotlin 符号,构建速度比 kapt 快 2~3 倍,且支持增量处理。 迁移 Room 从 kapt 到 KSP // build.gradle.kts(模块级) plugins { // 移除 kapt // id("kotlin-kapt")// 改为 KSP id(" com.google.devtools.ksp") }dependencies { // 将 kapt 改为 ksp // kapt("androidx.room:room-compiler:2.6.1 ⚠️ 注意:如果项目中 kapt 和 KSP 同时存在(混用不同注解处理器),两套流程都会跑,构建时间不降反升。迁移要彻底,尽量做到"只剩 KSP"。
诸如 Room 等注释处理器在 Android 平台无处不在,它们依赖于通过 Kotlin 注释处理工具 (KAPT) 实现的 Java 注释处理兼容性。 但是,KAPT 的运行速度可能会很慢,因为它需要生成中间的 Java 存根,然后 Java 注释处理系统才能对其进行提取。 KSP 提供了一个功能强大且简单的 API,它可以直接解析 Kotlin 代码,因此大大降低了 KAPT 生成存根所带来的构建速度负担。 实际上,利用 Room 库执行的初始基准测试表明,KSP 相比 KAPT 速度提高了 2 倍左右。 也就是说,在同一模块中使用 KAPT 和 KSP 最初可能会降低您的构建速度,因此在 Alpha 版期间,最好在单独的模块中使用 KSP 和 KAPT。
其与 Kotlin 注解处理工具 (KAPT) 的功能相似,但速度提高了 2 倍,同时还可以直接访问 Kotlin 语言结构并支持多个平台目标。 为 Room 添加 KSP 支持不仅能提升编译速度,还能让 Room 更好地理解 Kotlin 代码,比如使用 KAPT 无法实现的泛型的可空性。 Kotlin 注释处理工具 (KAPT) 通过与 Java 注释处理基础架构相结合,让大部分 Java 语言注释处理器能够在 Kotlin 中开箱即用。 为此,KAPT 将 Kotlin 代码编译进 Java 存根,这些存根中保留了 Java 注释处理器关注的信息。 最后 通过使用 KSP 1.0 版,您可以发现 Kotlin 项目的构建速度得到了提升,因为您将不再使用基于 KAPT 的库。
apply plugin: 'kotlin-kapt' // ensure kapt plugin is applied dependencies { implementation 'org.greenrobot :eventbus:3.1.1' kapt 'org.greenrobot:eventbus-annotation-processor:3.1.1' } kapt { arguments arg('eventBusIndex', 'com.github.easybus.MyEventBusIndex') } } 由于我的 Demo 使用 Kotlin 编写,所以配置的是 kapt 详细配置文档可以参考EventBus文档 通过 AS 编译之后,就会在 build/generated/source/kapt/debug/com/github/easybus目录下生成索引文件 MyEventBusIndex 这个文件名称就是在 kapt 中配置的。
implementation 'com.google.dagger:dagger-android-support:2.26' implementation 'com.google.dagger:dagger:2.26' kapt 'com.google.dagger:dagger-compiler:2.26' kapt 'com.google.dagger:dagger-android-processor:2.26' 并且应用
中进行如下配置 ; /** androidx 依赖与老版本的 butterknife 冲突 */ implementation 'com.jakewharton:butterknife:10.0.0' kapt com.jakewharton:butterknife-compiler:10.0.0' ② 应用插件 : 在 Module 下的 build.gradle 顶部添加如下配置 ; apply plugin: 'kotlin-kapt /** androidx 依赖与老版本的 butterknife 冲突 */ implementation 'com.jakewharton:butterknife:10.0.0' kapt /** androidx 依赖与老版本的 butterknife 冲突 */ implementation 'com.jakewharton:butterknife:8.8.1' kapt /** androidx 依赖与老版本的 butterknife 冲突 */ implementation 'com.jakewharton:butterknife:10.0.0' kapt
版本更新的主要范围为 Kotlin/Native、KAPT 的性能优化以及对 IntelliJ IDEA 的支持优化。 KAPT 支持注解处理器增量编译 KAPT 已经支持注解处理器增量编译,该特性仍处灰度实验阶段,你可以通过在gradle.properties中添加以下配置来启用它: kapt.incremental.apt KAPT: 其他提升 引入了两个配置来提升编译性能。其一是使用 Gradle workers: 这个版本也对它做了优化。
build.gradle 中 , kotlin-android 是必须配置的 , kotlin-android-extensions 是扩展 , 选择性配置 , 配置了之后 , 可以很方便地使用视图绑定 ; kotlin-kapt 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' id 'kotlin-kapt 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' id 'kotlin-kapt