赞
踩
前提:如果你不了解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的使用教程还很少,可以去官网看看
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。