今天分享一下关于 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
文章目录 一、报错信息 二、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
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
什么是注解处理器 话说,最近尝试了一下写了个注解处理器,也就是我们常见的 apt,在 Kotlin 当中有个插件叫 kapt,说的就是注解处理器。注解处理器能干什么呢? /tmp/kapt3 下面有个 stubs 目录: ? 这个目录里面会有从你的 Kotlin 源码生成的 Java 源码,注解处理器后面会跟据这些源码去做注解处理,这实际上就是 kapt 的原理啦,如果你之前看到过官方写的介绍 kapt 原理的文章,里面说的 ,所以我们还是要把它添加到运行时依赖的(kapt 下面 implementation 那句)。 kapt3/classes 中(原来是在 build/classes/java/main 中) ?
诸如 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
// 启用 DataBinding dataBinding { enabled = true } } } 2、导入 kotlin-kapt 插件 凡是 在 Kotlin 中使用到注解的情况下 , 都需要导入 kotlin-kapt 插件 ; 在 Module 下的 build.gradle 构建脚本中 , 导入 kotlin-kapt 插件 ; plugins { id 'kotlin-kapt' } 3、数据模型类 数据类中 , 主要 封装 数据模型 ; package kim.hsl.databinding_demo class } } BR 类是 BaseObservable 子类中由 @Bindable 注解修饰的函数生成 ; BR 类生成位置在 app\build\generated\source\kapt
缓存 kapt 任务 目前即使使用–build-cache,针对kapt的缓存也默认是禁用的,因为 Gradle 还没有一种方法来映射注解处理器的输入和输出。 你可以通过在kapt配置中将useBuildCache设置为true来明确启用针对 Kotlin 注解处理任务的构建缓存。 kapt { useBuildCache = true } 参考: 你可以通过下列资源来了解更多关于利用 Gradle 构建缓存的信息: https://docs.gradle.org/current