当前位置:   article > 正文

AndroidStudio Kotlin使用ksp_android ksp

android ksp

前提:如果你不了解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")
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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")
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

注意这里!!!!!!
然后在kspCompilersrc/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)
        }

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

里面还有一个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"))
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

好了,集成ksp完成了,调试跟apt一样,ksp项目好像不支持断点调试,只能打log,具体ksp的使用教程还很少,可以去官网看看

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/293423
推荐阅读
相关标签
  

闽ICP备14008679号