Slide 1

Slide 1 text

KSPの導入・移行を 前向きに検討しよう DroidKaigi 2024

Slide 2

Slide 2 text

https://kotlinlang.org/docs/k sp-overview.html#supported -libraries ※ 2024/9

Slide 3

Slide 3 text

> KSP is a more efficient replacement for kapt. For libraries that support both, KSP should be used to improve build times. KSP は、kapt より効率的な代替ツール 両方サポートしている場合は、ビルド時間を改善するために KSP を使用すべ き https://googlesamples.github.io/android-custom-lint-rules/checks/KaptUsageInsteadOfKsp.md.html

Slide 4

Slide 4 text

この機会に、 KSPについておさらいし、 導入・移行・実装していきましょう!

Slide 5

Slide 5 text

@shuxn6934 name: しゅんいち - shxun6934 affiliation: PORT INC. Occupation: Android アプリ エンジニア / Rails エンジニア service: 就活会議 Android

Slide 6

Slide 6 text

Session’s targets ● KSPってなんだっけ? kaptと何が違うの? ● すでに知っている、導入・移行・実装したことあるけど、あんまりわかって ない ● K2で何が変わるの? Compiler の話はあまりしないです 🙏

Slide 7

Slide 7 text

Session’s goal ● KSPの特徴とkaptとの比較、具体的な導入方法を理解 ● K2で変わっていることを把握

Slide 8

Slide 8 text

Agenda ● KSP ○ kapt ○ annotation processor (Java) ● KSP・kaptの特徴と比較 ● KSPの実装・導入・移行方法 ○ 単純な導入 ○ SymbolProcessorでの導入 ○ 検証 ○ 検討 ● KSP2 ● まとめ

Slide 9

Slide 9 text

Agenda ● KSP ○ kapt ○ annotation processor (Java) ● KSP・kaptの特徴と比較 ● KSPの実装・導入・移行方法 ○ 単純な導入 ○ SymbolProcessorでの導入 ○ 検証 ○ 検討 ● KSP2 ● まとめ

Slide 10

Slide 10 text

What is KSP Kotlin Symbol Processing Kotlin の軽量なCompiler Plugin を開発するための API Kotlin の機能を活用して、簡略化された Compiler Plugin を提供 2021年にstable Kotlin 1.5.30 〜 Document: https://kotlinlang.org/docs/ksp-overview.html GitHub: https://github.com/google/ksp

Slide 11

Slide 11 text

What is kapt Kotlin Annotation Processing Tool Kotlin でAnnotation processor を使用する ためのツール 2016年にstable Kotlin 1.0 〜 Document: https://kotlinlang.org/docs/kapt.html GitHub: kapt3: https://github.com/JetBrains/kotlin/tree/master/plugins/kapt3 kapt4: https://github.com/JetBrains/kotlin/tree/master/plugins/kapt4

Slide 12

Slide 12 text

What is Annotation Processor Pluggable Annotation Processing API Compile 時にAnnotation 付きのソースコードを解析し、追加のコードや リソースを生成する Compiler Plugin Java 6 〜 (2006) JSR269: https://jcp.org/en/jsr/detail?id=269

Slide 13

Slide 13 text

What is Compiler Plugin Compilerの機能を拡張するためのソフトウェアモジュール コードの変換、分析、最適化が可能( = メタプログラミング) Java・Kotlinにそれぞれ提供されている example: Java:Annotation Processor・Lombok Kotlin: KSP・Parcelize

Slide 14

Slide 14 text

Compiler Plugin Annotation Processor kapt KSP

Slide 15

Slide 15 text

Agenda ● KSPとは ○ kapt ○ annotation processor (Java) ● KSP・kaptの特徴と比較 ● KSPの実装・導入・移行方法 ○ 単純な導入 ○ SymbolProcessorでの導入 ○ 検証 ○ 検討 ● KSP2 ● まとめ

Slide 16

Slide 16 text

kapt

Slide 17

Slide 17 text

kapt’s features ● Annotation からコードを生成 ● Kotlin からJava のコードを生成 ● Annotation Processor に対応しているLibrary に対して利用可能 ● メンテナンスモード(2021 〜) ● K2 Compiler へのサポート(Experimental)

Slide 18

Slide 18 text

kapt’s features ● Annotation からコードを生成 ● Kotlin からJava のコードを生成 ● Annotation Processor に対応しているLibrary に対して利用可能 ● メンテナンスモード(2021 〜) ● K2 Compiler へのサポート(Experimental)

Slide 19

Slide 19 text

kapt’s task ● kaptGenerateStubs ○ Kotlin Compiler によるスタブ作成 ○ androidTest・main・test ○ BuildVariantsごと ● kapt ○ Annotation Processor によるコード生成 ○ androidTest・main・test ○ BuildVariantsごと

Slide 20

Slide 20 text

kapt’s task ● kaptGenerateStubs ○ Kotlin Compiler によるスタブ作成 ○ androidTest・main・test ○ BuildVariantsごと ● kapt ○ Annotation Processor によるコード生成 ○ androidTest・main・test ○ BuildVariantsごと

Slide 21

Slide 21 text

kaptGenerateStubs Annotation Processor がKotlin のコードを読み取るために、Java のスタ ブクラスを生成 ● クラス・メソッド・プロパティ・インターフェースなどの定義 ● 型情報 生成されたJavaファイルには、@kotlin.Metadataが含まれている → KotlinとJavaの相互運用 を可能にしている

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

@kotlin.Metadata Kotlinのクラス・メソッド・プロパティなどの特有の情報を保持する ためのア ノテーション アノテーションの各引数に情報を保持する https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-metadata/

Slide 27

Slide 27 text

k: エンコードするメタデータの種類(数値ごとに意味が決まっている) mv: メタデータのバージョン == Kotlinバージョン d1: カスタム形式のメタデータ d2: d1への追加情報 xs: 文字列型での追加情報 pn: パッケージ名 xi: 数値型での追加情報(数値ごとに意味が決まっている) ※ Kotlin 2.0 ※ Kotlinのバージョンによって異なる @kotlin.Metadata https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-metadata/

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

UserDao.kapt_metadata ?? z ? Lcom/example/ksp_sample/db/dao/UserDao#getAll()Lkotlinx/co routines/flow/Flow;?/Users/hoge/Work/Android/Kotlin/kapt_ksp_ sample_for_droid_kaigi_2024/db/src/main/kotlin/com/example/ ksp_sample/db/dao/UserDao.kt%com/example/ksp_sample/db/ dao/UserDao?/Users/hoge/Work/Android/Kotlin/kapt_ksp_sampl e_for_droid_kaigi_2024/db/src/main/kotlin/com/example/ksp_s ample/db/dao/UserDao.ktgetAll()&getAll()Lkotlinx/coroutines/flo w/Flow; encoded by UTF-8

Slide 30

Slide 30 text

UserDao.kapt_metadata ● ファイルの絶対パス ● インタフェース名・関数のシグネチャ

Slide 31

Slide 31 text

kapt’s task ● kaptGenerateStubs ○ Kotlin Compiler によるスタブ作成 ○ androidTest・main・test ○ BuildVariantsごと ● kapt ○ Annotation Processor によるコード生成 ○ androidTest・main・test ○ BuildVariantsごと

Slide 32

Slide 32 text

kapt 作成されたスタブクラス・メタデータを元に、Annotation Processor がコード を解析し、生成を行う Annotation Processor を動かすため、javac で動作する

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

kapt’s features ● Annotation からコードを生成 ● Kotlin からJava のコードを生成 ● Annotation Processor に対応しているLibrary に対して利用可能 ● メンテナンスモード( 2021 〜) ● K2 Compiler へのサポート( Experimental)

Slide 36

Slide 36 text

Maintenance Mode > We are keeping it up-to-date with recent Kotlin and Java releases but have no plans to implement new features. Kotlin・Java のリリースを追ってアップデートはしている ただし、kaptに対する新機能開発が計画されていない https://kotlinlang.org/docs/kapt.html https://github.com/JetBrains/kotlin-web-site/commit/755eec6d7e41dee9b39c1c427f0dd884cfb20b4a

Slide 37

Slide 37 text

Support for K2 Compiler (kapt) Kotlin 1.9.20 〜(Experimental) K2 Compiler上でkaptを使用することができる → パフォーマンスが向上 https://blog.jetbrains.com/kotlin/2023/11/kotlin-1-9-20-released/ https://kotlinlang.org/docs/kapt.html#try-kotlin-k2-compiler

Slide 38

Slide 38 text

KSP

Slide 39

Slide 39 text

KSP’s features ● Kotlin のソースコードをKotlin で解析し、コード生成できる ● Multi Platform 対応 (JVM・JS・Native) ● コードの変更・置換はできない ● K2 Compiler へのサポート(Beta) == KSP2

Slide 40

Slide 40 text

KSP’s features ● Kotlin のソースコードを Kotlin で解析し、コード生成できる ● Multi Platform 対応 (JVM・JS・Native) ● コードの変更・置換はできない ● K2 Compiler へのサポート(Beta) == KSP2

Slide 41

Slide 41 text

KSP’s task ● ksp ○ Symbol Processor によるコード解析・コード生成 ■ 生成先:Java or Kotlin ■ Annotation に限らない ○ androidTest・main・test ○ BuildVariantsごと ※ Symbol Processor については後半で!

Slide 42

Slide 42 text

Code Analysis & Generate Kotlinのクラスやプロパティ・関数などをSymbol Model として認識 Visitorパターンを採用していて、各Symbol に対して訪問し、解析 コード生成を行うためのAPI が提供 → API を使用して生成 https://kotlinlang.org/docs/ksp-overview.html#how-ksp-looks-at-source-files

Slide 43

Slide 43 text

● KSClassDeclaration:クラス ● KSFunctionDeclaration:メソッド ● KSPropertyDeclaration:プロパティ ● KSTypeParameter:パラメータ ● KSType:型 etc… https://kotlinlang.org/docs/ksp-overview.html #how-ksp-looks-at-source-files

Slide 44

Slide 44 text

https://kotlinlang.org/docs/ksp-additional-details.html How Kotlin code models?

Slide 45

Slide 45 text

KSP’s features ● Kotlin のソースコードをKotlin で解析し、コード生成できる ● Multi Platform 対応 (JVM・JS・Native) ● コードの変更・置換はできない ● K2 Compiler へのサポート(Beta) == KSP2

Slide 46

Slide 46 text

Code cannot be changed (KSP) > Unlike a full-fledged compiler plugin, processors cannot modify the code. A compiler plugin that changes language semantics can sometimes be very confusing. KSP avoids that by treating the source programs as read-only. 言語のセマンティクス(意味や動作を定義する概念)を変更してしまうと、予期し ない意味・動作になり混乱を招くため 、書き込みを行えないようにしている https://kotlinlang.org/docs/ksp-overview.html#overview

Slide 47

Slide 47 text

比較

Slide 48

Slide 48 text

Compare KSP with kapt ● コード生成方法が異なる ○ kapt: Kotlin → Java(stub) → Java(impl) ○ KSP: Kotlin → Java or Kotlin(impl)

Slide 49

Slide 49 text

Compare KSP with kapt ● コード生成方法が異なる ○ kapt: Kotlin → Java(stub) → Java(impl) ○ KSP: Kotlin → Java or Kotlin(impl) ビルド時間差に起因

Slide 50

Slide 50 text

Compare KSP with kapt ● コード生成方法が異なる ○ kapt: Kotlin → Java(stub) → Java ○ KSP: Kotlin → Java or Kotlin ● 将来性 ○ kapt: K2 Compiler (Experimental) ○ KSP: K2 Compiler (Beta) https://kotlinlang.org/docs/components-stability.html#stability-levels-explained

Slide 51

Slide 51 text

kaptよりKSPを使ったほうが良さそう

Slide 52

Slide 52 text

どうやって使う??

Slide 53

Slide 53 text

Agenda ● KSPとは ○ kapt ○ annotation processor (Java) ● KSP・kaptの特徴と比較 ● KSPの実装・導入・移行方法 ○ 単純な導入 ○ SymbolProcessorでの導入 ○ 検証 ○ 検討 ● KSP2 ● まとめ

Slide 54

Slide 54 text

Sample Project

Slide 55

Slide 55 text

Sample Project Application・UI Room Custom KSP

Slide 56

Slide 56 text

Sample Project Application・UI Room Custom KSP 導入・移行 実装

Slide 57

Slide 57 text

導入・移行

Slide 58

Slide 58 text

Introduce・Migrate ● KSP のGradle Plugin を定義 ● (kapt を使用している場合は、kapt のGradle Plugin を削除) ● Library のAnnotation Processor をksp で依存定義 ● (ksp のオプション設定追加) ● (kapt のオプション設定を削除) https://developer.android.com/build/migrate-to-ksp

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

※ KotlinとKSPのKotlinのバージョンを 合わせる

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

※ Room の場合

Slide 63

Slide 63 text

設定完了!

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

実装

Slide 68

Slide 68 text

Implementation ● (Annotation classを用意) ● SymbolProcessorProvider と SymbolProcessor を実装 ● META-INF/services/com.google.devtools.ksp.processing.S ymbolProcessorProvider に、実装した SymbolProcessorProvider を宣言 ※ 公式からもサンプルコードが提供されているので、参考に! Example:https://github.com/google/ksp/tree/main/examples/playground

Slide 69

Slide 69 text

Implementation (Sample) ● ViewModelFactory Annotation を作成 ● ViewModel を継承したクラスに ViewModelFactory Annotationを付 与すると、ViewModelProvider.Factory を継承したクラスを生成

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

SymbolProcessor & Provider ● SymbolProcessorProvider ○ SymbolProcessor を提供するクラス ● SymbolProcessor ○ 実際のコード解析を行い、コード生成するクラス

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

SymbolProcessor を返す

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

KSP を実行している環境情報 https://github.com/google/ksp/blob/main/api/src/main/kotlin/com/google/devtools/ksp/processing/SymbolProcessorE nvironment.kt

Slide 82

Slide 82 text

KSP を実行している環境情報 コード生成に必要なオブジェクト ログ主力に必要なオブジェクト https://github.com/google/ksp/blob/main/api/src/main/kotlin/com/google/devtools/ksp/processing/SymbolProcessorE nvironment.kt ※ そのほかにも情報を取得できる

Slide 83

Slide 83 text

No content

Slide 84

Slide 84 text

No content

Slide 85

Slide 85 text

実行メソッド (= コード解析・コード生成) (must)

Slide 86

Slide 86 text

KSPの実行終了時に呼ばれるメソッド (optional)

Slide 87

Slide 87 text

processメソッド内でKSPLogger#errorを 呼ぶと呼ばれるメソッド (optional)

Slide 88

Slide 88 text

No content

Slide 89

Slide 89 text

Kotlin Symbol を取得する機能を SymbolProcessor へ提供する

Slide 90

Slide 90 text

Kotlin Symbol を取得する機能を SymbolProcessor へ提供する Symbol を取得

Slide 91

Slide 91 text

有効なSymbol に対して、コード解析・生成を行う

Slide 92

Slide 92 text

無効なSymbol は、次ラウンドへ

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

Get Kotlin Symbol ● getAllFiles:全ラウンドの全てのファイルを取得する ● getNewFiles:ラウンドごとの全てのファイルを取得する ● getSymbolsWithAnnotation:特定のAnnotation が付与された Symbol を全て取得(ラウンドごと) etc … https://github.com/google/ksp/blob/main/api/src/main/kotlin/com/google/devtools/ksp/ processing/Resolver.kt

Slide 95

Slide 95 text

Get Kotlin Symbol ● getAllFiles:全ラウンドの全てのファイルを取得する ● getNewFiles:ラウンドごとの全てのファイルを取得する ● getSymbolsWithAnnotation:特定のAnnotation が付与された Symbol を全て取得(ラウンドごと) etc … https://github.com/google/ksp/blob/main/api/src/main/kotlin/com/google/devtools/ksp/ processing/Resolver.kt

Slide 96

Slide 96 text

Multi Round processing SymbolProcessor#process は複数回に実行する 一つ一つの実行 == ラウンド SymbolProcessor#process の返り値に処理できなかったSymbol のリス トを設定 → 次ラウンドで処理される 全ラウンドで新しいファイルが生成されなくなると終了 https://kotlinlang.org/docs/ksp-multi-round.html

Slide 97

Slide 97 text

Multi Round processing A.kt B.kt SymbolProcessor#process

Slide 98

Slide 98 text

Multi Round processing A.kt B.kt SymbolProcessor#process ABuilder.kt BBuilder.kt

Slide 99

Slide 99 text

Multi Round processing SymbolProcessor#process ABuilder.kt BBuilder.kt

Slide 100

Slide 100 text

Multi Round processing SymbolProcessor#process ABuilder.kt BBuilder.kt SymbolProcessor#finish

Slide 101

Slide 101 text

Multi Round processing 1st round 2st round

Slide 102

Slide 102 text

No content

Slide 103

Slide 103 text

KSNode.validate 対象のSymbol 内に存在する全ての型が有効かどうかを検証する 有効 == Symbol として読み取れている 別のSymbolProcessor で作成したコードを参照している場合、無効になる https://github.com/google/ksp/blob/main/api/src/main/kotlin/com/google/devtools/ksp/utils.kt#L120-L126

Slide 104

Slide 104 text

https://github.com/google/ksp/blob/main/examples/playground/workload/src/main/java/com/example/ACl ass.kt

Slide 105

Slide 105 text

https://github.com/google/ksp/blob/main/examples/playground/workload/src/main/java/com/example/ACl ass.kt 別のSymbolProcessor で生成するクラス

Slide 106

Slide 106 text

https://github.com/google/ksp/blob/main/examples/playground/workload/src/main/java/com/example/ACl ass.kt 別のSymbolProcessor で生成するクラス 生成されるまでは無効、生成された後は有効

Slide 107

Slide 107 text

Symbol の種類が「クラス」 && クラス内の全ての Symbol を読み取れる

Slide 108

Slide 108 text

取得したSymbol に対して、訪問し、操作を行う

Slide 109

Slide 109 text

No content

Slide 110

Slide 110 text

クラスのSymbol に対して訪問

Slide 111

Slide 111 text

クラスのSymbol に対して訪問 ※ パラメータや関数の Symbol に訪れる 関数もある

Slide 112

Slide 112 text

コード生成

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

Dependencies 入力ファイルと出力先のファイルの依存関係を設定する = 変更が入った場合に、再生成するかどうか を設定可能 ● aggregating: 出力先のファイルが複数のシンボルに依存しているかどう か ● sources: 依存するファイルのリスト https://github.com/google/ksp/blob/main/api/src/main/kotlin/com/google/devtools/ksp/processing/CodeGe nerator.kt#L179-L206

Slide 115

Slide 115 text

Dependencies ● aggregating = false, sources = listOf(A.kt) ○ A.kt への変更がある時のみ 再生成 ● aggregating = true, sources = listOf(A.kt) ○ 他のファイルへの変更がある時に A.kt も対象になる https://github.com/google/ksp/blob/main/api/src/main/kotlin/com/google/devtools/ksp/processing/CodeGe nerator.kt#L179-L206

Slide 116

Slide 116 text

Dependencies A.kt B.kt SymbolProcessor#process ABuilder.kt BBuilder.kt aggregating = false, sources = listOf(A.kt) changed

Slide 117

Slide 117 text

Dependencies A.kt B.kt SymbolProcessor#process ABuilder.kt BBuilder.kt aggregating = false, sources = listOf(A.kt) changed

Slide 118

Slide 118 text

Dependencies A.kt B.kt SymbolProcessor#process ABuilder.kt BBuilder.kt aggregating = true, sources = listOf(A.kt) changed

Slide 119

Slide 119 text

Dependencies A.kt B.kt SymbolProcessor#process ABuilder.kt BBuilder.kt aggregating = true, sources = listOf(A.kt) changed

Slide 120

Slide 120 text

Generated File

Slide 121

Slide 121 text

Generated File

Slide 122

Slide 122 text

実装完了!

Slide 123

Slide 123 text

本当に、KSPってkaptより早いの??

Slide 124

Slide 124 text

検証!

Slide 125

Slide 125 text

Verify (Environment) ● M3 Pro Macbook Pro ○ Memory 36GB ○ MacOS 14.4 ● Gradle 8.5 ● Kotlin 1.9.0 ● KSP 1.9.0-1.0.13 ● room 2.6.1

Slide 126

Slide 126 text

Sample Project Application・UI Room Custom KSP

Slide 127

Slide 127 text

Verify ● db ○ kapt ○ KSP ● app (== view_model_factory) ○ kapt ○ KSP それぞれの Gradle task を10回行った平均秒数を比較

Slide 128

Slide 128 text

Verify

Slide 129

Slide 129 text

● db ○ kapt:0.718 s ○ KSP:0.592 s ● app ○ kapt:0.539 s ○ KSP:0.215 s Result

Slide 130

Slide 130 text

● db ○ kapt:0.718 s ○ KSP:0.592 s ● app ○ kapt:0.539 s ○ KSP:0.215 s Result + 17.46 % + 60.14 %

Slide 131

Slide 131 text

🥳

Slide 132

Slide 132 text

kapt + KSPの併用はどうなの??

Slide 133

Slide 133 text

Application・UI・Room・Hilt https://developer.android.com/build/migrate-to-ksp

Slide 134

Slide 134 text

検証!

Slide 135

Slide 135 text

Verify (Environment) ● M3 Pro Macbook Pro ○ Memory 36GB ○ MacOS 14.4 ● Gradle 8.5 ● Kotlin 1.9.24 ● KSP 1.9.24-1.0.20 ● room 2.6.1 ● hilt 2.52

Slide 136

Slide 136 text

Sample Project Application・UI・Room・Hilt

Slide 137

Slide 137 text

Verify ● room (KSP) + hilt (KSP) ● room (KSP) + hilt (kapt) ● room (kapt) + hilt (kapt) それぞれの Gradle task を10回行った平均秒数を比較

Slide 138

Slide 138 text

Result ● room (KSP) + hilt (KSP):1.077 s ● room (KSP) + hilt (kapt):1.571 s ● room (kapt) + hilt (kapt):1.312 s

Slide 139

Slide 139 text

Result ● room (KSP) + hilt (KSP):1.077 s ● room (KSP) + hilt (kapt):1.571 s ● room (kapt) + hilt (kapt):1.312 s - 19.73 %

Slide 140

Slide 140 text

Result ● room (KSP) + hilt (KSP):1.077 s ● room (KSP) + hilt (kapt):1.571 s ● room (kapt) + hilt (kapt):1.312 s + 17.89 %

Slide 141

Slide 141 text

😥

Slide 142

Slide 142 text

Verification result ● 移行により、ビルド時間の改善 が見込める ○ ※ Project により差が出る ● 実装を行うことで、Project にあったコード生成を自動で行える ○ 例:計測用のタグ生成 ● 併用だと、逆にビルド時間の悪化 になる ○ 移行は一気に行う ■ モジュール単位で移行・導入を検討する

Slide 143

Slide 143 text

Agenda ● KSPとは ○ kapt ○ annotation processor (Java) ● KSP・kaptの特徴と比較 ● KSPの実装・導入・移行方法 ○ 単純な導入 ○ SymbolProcessorでの導入 ○ 検証 ○ 検討 ● KSP2 ● まとめ

Slide 144

Slide 144 text

KSP2 K2 Compiler 上で動くKSP KSP 1.0.21 〜(Beta) Kotlin 2.0.0 〜 gradle.properties に ksp.useKSP2=true を追加 Github: https://github.com/google/ksp/blob/main/docs/ksp2.md

Slide 145

Slide 145 text

KSP2 ● Compiler Plugin → Compiler API ● エントリポイントを他のプログラムから呼び出せるようになった ● KSP APIの動作が一部変更 https://github.com/google/ksp/blob/main/docs/ksp2.md# ksp1-deprecation-schedule

Slide 146

Slide 146 text

KSP2 ● Compiler Plugin → Compiler API ● エントリポイントを他のプログラムから呼び出せるようになった ● KSP APIの動作が一部変更 https://github.com/google/ksp/blob/main/docs/ksp2.md# ksp1-deprecation-schedule

Slide 147

Slide 147 text

SymbolProcessor in Program コンパイラーを設定せずに、KSPを実行することが可能に! == プログラム内で KSPを実行できる → テスト・デバッグが容易になる! https://github.com/google/ksp/blob/main/docs/ksp2entrypoints.md

Slide 148

Slide 148 text

SymbolProcessor in Program ● Processor をロード ● Logger を実装する or KspGradleLogger を使用する ● KSPConfig を設定 ● KotlinSymbolProcessing を実行 https://github.com/google/ksp/blob/main/docs/ksp2entrypoints.md

Slide 149

Slide 149 text

テストコード実装

Slide 150

Slide 150 text

No content

Slide 151

Slide 151 text

Annotation Class & Annotation 付き Class

Slide 152

Slide 152 text

生成が期待されるファイル

Slide 153

Slide 153 text

No content

Slide 154

Slide 154 text

No content

Slide 155

Slide 155 text

各Platform ごとのConfigクラスが用意されている ● KSPJvmConfig:JVM ● KSPNativeConfig:Native ● KSPJsConfig:JS ● KSPCommonConfig:Common(MultiPlatform) KSPConfig https://github.com/google/ksp/blob/2.0.0-1.0.22/common-deps/src/main/kotlin/com/google/devtools /ksp/KSPConfig.kt

Slide 156

Slide 156 text

JVM version Kotlin version & KSP version

Slide 157

Slide 157 text

生成対象 生成先

Slide 158

Slide 158 text

No content

Slide 159

Slide 159 text

No content

Slide 160

Slide 160 text

Config・Processor・Loggerを渡して、 execute

Slide 161

Slide 161 text

実行できたか & 生成できたかを検証

Slide 162

Slide 162 text

🎉

Slide 163

Slide 163 text

Agenda ● KSPとは ○ kapt ○ annotation processor (Java) ● KSP・kaptの特徴と比較 ● KSPの実装・導入・移行方法 ○ 単純な導入 ○ SymbolProcessorでの導入 ○ 検証 ○ 検討 ● KSP2 ● まとめ

Slide 164

Slide 164 text

Conclution ● KSPは、Annotation が付与された Kotlin コードを別の Kotlin・Java コードに生成 ○ kapt と比べて高速で、 Multi Platform に対応 ● GradlePlugin・Library を追加することで、導入・移行可能 ● SymbolProcessor・Provider を実装することで、実装可能 ● K2 Compiler 上で動く新しい KSP == KSP2 ● KSP2では、KSPのデバッグ・テストが簡単に

Slide 165

Slide 165 text

Sample GitHub

Slide 166

Slide 166 text

References ● https://github.com/google/ksp ● https://kotlinlang.org/docs/ksp-overview.html ● https://kotlinlang.org/docs/ksp-quickstart.html ● https://kotlinlang.org/docs/ksp-why-ksp.html ● https://kotlinlang.org/docs/ksp-examples.html ● https://kotlinlang.org/docs/ksp-additional-details.html ● https://kotlinlang.org/docs/ksp-reference.html ● https://kotlinlang.org/docs/ksp-incremental.html ● https://kotlinlang.org/docs/ksp-multi-round.html ● https://blog.jetbrains.com/kotlin/2023/11/kotlin-1-9-20-released/ ● https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-metadata/ ● https://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/ ● https://github.com/JetBrains/kotlin-web-site/pull/2591 ● https://jcp.org/en/jsr/detail?id=269 ● https://developer.android.com/build/migrate-to-ksp ● https://inside.pixiv.blog/2023/05/23/110000 ● https://tech.every.tv/entry/2024/06/20/095753 ● https://star-zero.medium.com/annotation-processor%E3%81%A7kotlin-metadata-789b36c76a1a ● https://qiita.com/kitakkun/items/f8702d5975809c2bea05 ● https://kotlinlang.org/docs/k2-compiler-migration-guide.html ● https://blog.jetbrains.com/kotlin/2015/05/kapt-annotation-processing-for-kotlin/ ● https://kotlinlang.org/docs/k2-compiler-migration-guide.html ● https://kotlinlang.org/docs/gradle-configure-project.html

Slide 167

Slide 167 text

End