前提:如果你不了解ksp是什么的,可以去看看官网,类似kapt的增量注解处理插件,但是它是专门为kotlin而衍生的,但又完全兼容java代码的处理,速度上比kapt快,这篇文章可能要有一点kapt之类的经验
ksp:官网
废话不多说,开始吧!
注意请使用新的项目来测试ksp,因为gradle脚本语言需要换成kotlin脚本
1.settings.gradle更名为:settings.gradle.kts
然后将里面的代码更改为
include("app")
rootProject.name="KspTest" // 项目名称,自己取
rootProject.buildFileName = "build.gradle.kts" // 指定脚本为build.gradle.kts,下一步介绍
pluginManagement {
val kotlinVersion="1.5.10" // kotlin版本
val kspVersion="1.5.10-1.0.0-beta01" //ksp版本,最新的可根据官网卑职
plugins {
id("com.google.devtools.ksp") version kspVersion
kotlin("jvm") version kotlinVersion
}
repositories {
gradlePluginPortal()
google()
maven("https://dl.bintray.com/kotlin/kotlin-eap")
}
}
2.将整个项目最后层的build.gradle更改为build.gradle.kts
然后将里面的代码更改为
buildscript {
val kotlinVersion="1.5.10" // kotlin版本
repositories {
google()
mavenLocal()
gradlePluginPortal()
maven("https://dl.bintray.com/kotlin/kotlin-eap")
//noinspection JcenterRepositoryObsolete
jcenter()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
classpath("com.android.tools.build:gradle:4.2.1")
classpath("com.neenbedankt.gradle.plugins:android-apt:1.8")
}
}
allprojects {
repositories {
google()
mavenLocal()
gradlePluginPortal()
maven("https://dl.bintray.com/kotlin/kotlin-eap")
//noinspection JcenterRepositoryObsolete
jcenter()
}
}
tasks.register<Delete>("clean") {
delete(rootProject.buildDir)
}
3.在项目里面新建一个module:kspCompiler用于存放ksp代码,并将module里面的build.gradle更改为build.gradle.kts
然后将里面的代码更改为
plugins {
kotlin("jvm")
}
dependencies {
implementation(kotlin("stdlib"))
implementation(project(":annotationLib"))
implementation("com.squareup:javapoet:1.13.0")
implementation("com.squareup:kotlinpoet:1.7.2")
implementation("com.google.devtools.ksp:symbol-processing-api:1.5.10-1.0.0-beta01")
}
注意这里!!!!!!
然后在kspCompiler的src/mian路径下创建一个文件夹resources,然后在resources里面创建一个META-INF,然后在META-INF里面创建一个services,最后在services里面创建一个文件:com.google.devtools.ksp.processing.SymbolProcessorProvider,没有后缀名
该文件后面指定创建ksp类的,后面会介绍
4.在kspCompiler里面创建一个ksp处理类:TestKsp
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.processing.SymbolProcessor
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
import com.google.devtools.ksp.processing.SymbolProcessorProvider
import com.google.devtools.ksp.symbol.KSAnnotated
class TestKsp(val environment: SymbolProcessorEnvironment):SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> { // 里面就可以处理你的ksp逻辑了
return emptyList()
}
class TestKspCreate:SymbolProcessorProvider{ // 该类用来创建一个SymbolProcessor类
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
return TestKsp(environment)
}
}
}
里面还有一个TestKspCreate类用于创建TestKsp,然后我们需要把TestKspCreate添加到第3步创建的文件里面:
5.将 app module里面的build.gradle更改为build.gradle.kts
然后将里面的代码更改为
plugins {
id("com.android.application")
id("kotlin-android")
id("com.google.devtools.ksp") version "1.5.10-1.0.0-beta01"
}
android {
compileSdkVersion(30)
defaultConfig {
applicationId("com.test.ksp")
minSdkVersion(19)
targetSdkVersion(30)
versionCode(1)
versionName("1.0")
multiDexEnabled = true
testInstrumentationRunner("androidx.test.runner.AndroidJUnitRunner")
}
buildTypes {
val release = getByName("release")
release.apply {
sourceSets {
getByName("main") {
java.srcDir(File("build/generated/ksp/release/kotlin")) // 指定ksp生成目录,否则编译器不会之别生成的代码
}
}
isMinifyEnabled = true
signingConfig = signingConfigs.getByName("debug")
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
val debug = getByName("debug")
debug.apply {
sourceSets {
getByName("main") {
java.srcDir(File("build/generated/ksp/debug/kotlin")) // 指定ksp生成目录,否则编译器不会之别生成的代码
}
}
}
}
compileOptions {
sourceCompatibility(JavaVersion.VERSION_1_8)
targetCompatibility(JavaVersion.VERSION_1_8)
}
kotlinOptions {
jvmTarget = "1.8"
}
ksp {
}
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.5.10")
implementation("androidx.core:core-ktx:1.5.0")
implementation("androidx.appcompat:appcompat:1.3.0")
implementation("com.google.android.material:material:1.3.0")
implementation("androidx.constraintlayout:constraintlayout:2.0.4")
testImplementation("junit:junit:4.13.2")
implementation("com.squareup:kotlinpoet:1.7.2")
androidTestImplementation("androidx.test.ext:junit:1.1.2")
androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
implementation(project(":kspCompiler"))
ksp(project(":kspCompiler"))
}
好了,集成ksp完成了,调试跟apt一样,ksp项目好像不支持断点调试,只能打log,具体ksp的使用教程还很少,可以去官网看看