TheRouter 在1.1.4-rc2
开始,已经将KSP
能力合并至主分支,不再是单独的功能分支了,下面介绍一下如何使用 KSP
。
KSP全称:Kotlin Symbol Processing。
借助官网的描述:KSP 提供了一种基于 Kotlin 的轻量级的编译期插件 API,其编译速度最快可以达到 kapt 速度的两倍。
从原理角度讲,Android
项目构建过程中,可用的注解处理器总共有三种:APT、KAPT、KSP。
APT 比较好理解,就是 JDK 提供的注解处理器,通常在 Gradle 项目中不需要引入什么额外插件,只需要在依赖时使用 annotationProcessor "cn.therouter:apt:x.x.x
,但是他不支持 Kotlin 注解的解析。
KAPT 最早是 Kotlin 推出的APT,用于兼容 Kotlin 代码的注解,但是他的实现比较简单粗暴,内部实际上是包了一层APT,他编译时首先处理 Kotlin 的注解解析,如果无法解析,再用APT去解析,所以相当于同一个模块,如果是Java、Kotlin混编时,会执行两遍注解解析。
KSP 是基于语法分析的注解解析,严格来讲,他不仅仅可以用来做注解解析,还可以做一些基于语法分析的事情,比如自定义的代码语法检查,相当于替代了一部分 lint 可以做的事情。正因为基于语法分析来做的,所以性能必然是比 KAPT 高,毕竟编译期一定会先走一遍语法分析。
在项目中所有使用了注解的模块,对应的build.gradle
文件中都需要加入如下依赖,所有模块都要添加,不能只添加子模块:
注意 ,使用KSP
以后,如果之前使用了kapt
需要将原本的kapt
依赖删掉
// Gradle7.x以下版本,这样加入 KSP插件
apply plugin: 'com.google.devtools.ksp'
// 删除之前的kapt依赖(如有)
// apply plugin: 'kotlin-kapt'
// Gradle7.x及以上版本,提供了新的方式,也这样加入 KSP插件
// 当然,也可以继续使用上面那种方式
plugins {
id "com.google.devtools.ksp"
// 删除之前的kapt依赖(如有)
//id 'org.jetbrains.kotlin.kapt'
}
dependencies {
// 从1.1.4-rc2 开始在正式版本支持ksp,此前需要使用beta版本,但用法一致
ksp "cn.therouter:apt:1.1.4-rc4"
// 删除之前的kapt依赖(如有)
// kapt "cn.therouter:apt:1.1.4-rc4"
}
在项目根目录build.gradle
引入 kapt 插件的 classpath :
注意,版本号需要在KSP官网https://github.com/google/ksp/releases,找到跟自己项目中 Kotlin 版本号对应的KSP
插件版本号。例如,我的 Kotlin 版本号是 1.5.31
,所以 KSP 插件的版本号就使用对应的1.5.31-1.0.0
// Gradle7.x以下版本,这样加入
buildscript {
dependencies {
classpath "com.google.devtools.ksp:symbol-processing-gradle-plugin:xxx-xxx"
}
}
// Gradle7.x及以上版本,提供了新的方式,也这样加入
// 当然,也可以继续使用上面那种方式
plugins {
id "com.google.devtools.ksp" version 'xxx-xxx' apply false
}