iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Mobile Development

Android Studio 30天進階學習系列 第 10

Android Studio 30天進階學習-DAY10_Kotlin處理工具(KAPT & KSP)概述

  • 分享至 

  • xImage
  •  

在開始用Kotlin撰寫一個專案架構前,我要先來說明一下我在引入套件時所發生的一個Kotlin工具問題。

那就是KAPTKSP,根據這篇文章上線為止,kapt的官網顯示的資訊如下所示

kapt 處於維護模式。我們正在使其與最新的 Kotlin 和 Java 版本保持同步,但沒有計劃實現新功能。請使用Kotlin 符號處理 API (KSP)進行註釋處理。請參閱 KSP 支持的庫列表。

所以在我開始用Kotlin撰寫一份架構練習時就直接碰上了引用的套件工具進行維護的狀態,導致一直無法成功Sync,這時就一直上網查找是否有替代的工具,這時就找到了KSP這個工具套件,根據Kotlin官網所述,Kapt以及KSP皆是為Kotlin而生的註解處理工具。

KAPT(Kotlin Annotation Processing Tool)

kapt就是 (Kotlin 註解處理工具) 的縮寫,由於我並未真正操作到kapt,這邊只展示Kotlin官方所展示的如何將kapt套入到Android Studio中。

以下會展示兩種gradle,一種是Groovy DSL(.gradle)、另一種是Kotlin DSL(.gradle.kts)

  • build.gradle(Project:"你的專案名稱")
plugins {
    id "org.jetbrains.kotlin.kapt" version "1.9.10"
}
  • build.gradle.kts(Project:"你的專案名稱")
plugins {
    // kapt plugin
    kotlin("kapt") version "1.9.10"
}
  • build.gradle(Module:app)

這邊會放上兩個,一個是範例撰寫,引用的是hilt套件所需要的功能,另一個是官方的撰寫格式。

dependencies {
  // ... 省略以上
  kapt "com.google.dagger:hilt-compiler:2.44"
  // 撰寫格式如下
  kapt 'groupId:artifactId:version'
}
  • build.gradle.kts(Module:app)
dependencies {
  // ... 省略以上
  kapt("com.google.dagger:hilt-android-compiler:2.44")
  // 撰寫格式如下
  kapt("groupId:artifactId:version")
}

KSP(Kotlin Symbol Processing)

KSP(Kotlin的符號處理工具的簡稱)

  • KSP官方網站所述

Kotlin 符號處理 ( KSP ) 是一個 API,可用於開發輕量級編譯器外掛程式。KSP 提供了一個簡化的編譯器插件 API,它利用 Kotlin 的強大功能,同時將學習曲線保持在最低限度。與kapt相比,使用 KSP 的註解處理器的運作速度最多可達兩倍。

  • 目前有支援KSP的Android Studio套件
    以下是以支援KSP並且有接觸練習過的專案套件,更多套件請見下方連結。
Library Status
Room 官方支援(Android Studio)
RxHttp 官方支援(Github)
Glide 官方支援(Github)
Dagger Dagger_ksp(alpha階段)
Hilt 正在進行中(與Dagger在相同網站中)
  • 建立build.gradle程式碼

    • build.gradle(Project:"專案名稱")
    plugins {
        // ... 其他插件省略 
        id 'org.jetbrains.kotlin.jvm' version '1.9.10' apply false
    }
    
    buildscript {
        dependencies {
            classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10'
        }
    }
    
    • build.gradle.kts(Project:"專案名稱")
    plugins {
        // 其他套件省略
    
        id("org.jetbrains.kotlin.android") version "1.9.0" apply false
        // ksp (Kotlin Symbol Processing) devtools dependencies 
        id("com.google.devtools.ksp") version "1.9.10-1.0.13" apply false
    
        kotlin("jvm") version "1.9.10" apply false
    
    }
    buildscript {
        dependencies {
            classpath(kotlin("gradle-plugin", version = "1.9.10"))
        }
    }
    
    • build.gradle(Module:app)
    plugins {
        id 'com.google.devtools.ksp' version '1.9.10-1.0.13'
    }
    dependencies {
        // ... 各個支持ksp的工具套件
        ksp "...:version"
    }
    
    • build.gradle.kts(Module:app)
    plugins {
        // ...其他套件省略
        id("org.jetbrains.kotlin.android")
        id("com.google.devtools.ksp")
    }
    dependencies {
        // ... 各個支持ksp的工具套件
        ksp("...:version")
    }
    

kapt轉KSP

若是原本就在持續使用kapt的開發者想要使用ksp來替代kapt,轉換的步驟也是十分簡單。

  1. 將開頭的kapt轉成ksp就好了
  2. 當然也需要引入插件ksp才能輕鬆轉換
  3. 步驟如下:
  • Gradle(Project:"專案名稱")
plugins {
    id 'com.google.devtools.ksp' version '1.8.10-1.0.9' apply false
}
  • Gradle(Module:app)
plugins {
    id 'com.google.devtools.ksp'
}

都加入完成後進行Sync,完成後就進行以下動作

dependencies {
    // 將kapt開頭的去掉並更換成ksp開頭
    // kapt 'androidx.room:room-compiler:2.5.0'
    ksp 'androidx.room:room-compiler:2.5.0'
}

總結

kapt與ksp都是Kotlin中的註解處理工具,ksp與kapt相比如下

  • kapt
    1. 為了在不修改的情況下執行Java註解處理器,kapt Kotlin程式碼編譯成 Java 存根,保留Java註解處理器所關注的資訊。
  • ksp
    1. KSP 中的處理器不會從Java的角度看待輸入程式,因為少了轉成Java的處理的時間,所以整體的處理速度會比kapt

KSP 旨在隱藏編譯器更改,最大限度地減少使用它的處理器的維護工作。KSP 的設計目的是不要與 JVM 綁定,以便將來可以更輕鬆地適應其他平台。

以上是今天的兩個Kotlin註解處理工具的初見概述,主要是概述一下kapt和ksp的各別用法,並講述如何將其引入到 AndroidStudio。

參考來源

Kotlin Official_kapt_Overview
Kotlin Official_KSP_Overview
kapt轉換成KSP


上一篇
Android Studio 30天進階學習-DAY09_Kotlin介紹-下
下一篇
Android Studio 30天進階學習-DAY11_使用Kotlin基礎語法建立一個簡易計算機
系列文
Android Studio 30天進階學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言