iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
Mobile Development

如何使用 Kotlin Annotation Processor 做出自己的 Custom Data Parser Library系列 第 27

KSP Setup

檢查 gradle 版本

把 gradle build script 改成 KTS 之後,我們可以先確認一下現有的 project gradle 的版本,最好是要有 gradle 7 以上的版本。在 project 根目錄的地方找到 gradle/wrapper/gradle-wrapper.properties 裡面的 distributionUrl 確認版本號。

Screen Shot 2021-09-21 at 10.50.01 AM.png

加 JVM plugin

接著,到 :annotation 的 module 底下的 build.gradle.kts 加入 JVM plugin :

plugins {
    kotlin("jvm")
    // 略
}

:processor 的 module 也要加 JVM plugin 和 KSP 的 dependency :

plugins {
		kotlin("jvm")
		// 略
}

dependencies {
		implementation("com.google.devtools.ksp:symbol-processing-api:1.5.30-1.0.0")
		// 略
}

加完了 plugin 和 dependency 就要在使用 annotation 和 annotation processor 的地方,加上 KSP 的 plugin 和 dependency ,要加的 module 應該有 :processorTest ,如果你有其他地方也有做測試或是用到 processor 都要加。

plugins {
    id("com.google.devtools.ksp") version "1.5.30-1.0.0"
		// 略
}

dependencies {
		ksp(project(":processor"))
		// 略
}

settings.gradle.kts 那邊,加上 KSP plugin management 的宣告和指定 project 要拉的 repository 。

pluginManagement {
    plugins {
        id("com.google.devtools.ksp") version "1.5.30-1.0.0"
        kotlin("jvm") version "1.5.30"
    }
    repositories {
        gradlePluginPortal()
        google()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

include(":kotlin", ":testCommon", ":processorTest", ":processor", ":annotation", ":android", ":app")
rootProject.name = "KtRssReader"

如果你有決心要把 KAPT 都改掉的話,要把 KAPT 的 dependencies 都刪乾淨。都改完了之後,記得要先 sync 一次 gradle 的 build !

創建新的 processor

:processor module 底下建立新的 processor

class KspProcessor(
    private val codeGenerator: CodeGenerator,
    private val logger: KSPLogger,
    private val options: Map<String, String>
): SymbolProcessor {
    override fun process(resolver: Resolver): List<KSAnnotated> {
        logger.info("[testksp]")
        val symbols = resolver
            .getSymbolsWithAnnotation("tw.ktrssreader.annotation.RssTag")
            .filterIsInstance<KSClassDeclaration>()
        symbols.forEach { logger.info("[testksp] ${it.simpleName.getShortName()}") }
        return emptyList()
    }
}

我們先把有標註 @RssTag 的 class 名稱 log 出來。

然後在同一個 module 底下建立一個 processor provider

class KspProcessorProvider : SymbolProcessorProvider {

    override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
        return KspProcessor(
            codeGenerator = environment.codeGenerator,
            logger = environment.logger,
            options = environment.options
        )
    }
}

最後一個步驟,要在 processor/src/main/resources/META_INF/servies 底下增加一個名為 com.google.devtools.ksp.processing.SymbolProcessorProvider 的檔案 (路徑跟之前使用的 AutoService 同路徑),檔案內容如下:

com.google.devtools.ksp.processing.SymbolProcessorProvider

Screen Shot 2021-09-21 at 11.21.28 AM.png

上述步驟都完成之後,就可以 rebuild 一次 project 看看有什麼效果囉!如果沒有意外應該可以看到 IDE build output 的 log 有我們在 KspProcessor 寫的 log !

Screen Shot 2021-09-21 at 11.16.52 AM.png


上一篇
使用 KSP 來改善 annotation processor?
下一篇
KSP 的實作方向
系列文
如何使用 Kotlin Annotation Processor 做出自己的 Custom Data Parser Library30

尚未有邦友留言

立即登入留言