AndroidStudio Kotlin使用ksp

11 篇文章 0 订阅
8 篇文章 0 订阅

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

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

    }
}

里面还有一个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的使用教程还很少,可以去官网看看

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值