KSPの概要、使い方について簡単に説明したスライドです。
KSPで自動生成コードを作る起塚 亮
View Slide
起塚 亮自己紹介岡山大学工学部 24卒Androidエンジニア趣味:刀鑑賞、麻雀、プログラミング@bugdog24
KSPとは
- Kotlin Symbol Processingの略- コンパイラプラグイン用API- コードの自動生成プログラムを書くときに利用
コンパイル
コンパイルetc…
etc…コンパイル既存ファイル読み取り
コンパイルetc…コード生成してファイル追加
コンパイルetc…生成しなくなるまでラウンドを回す
etc…全てのファイルをコンパイルコンパイル
KSPの利点 高速Kaptよりも2倍近い速度で動作可能実装コストシンプルなAPIセットで構成バージョン間の互換性Kotlinのバージョンが違っても動作可能
作ってみる
Compose用ViewModelFactory生成プログラム
一見便利だが引数があると・・・
- ボイラーコードを書く必要がある- 引数を追加するたびに書き直す必要あり- コンパイル時に気づけない
これを付けることで対応するFactoryを生成するようにする
1. 依存関係を追加2. SymbolProcessorを実装3. SymbolProcessorProviderを実装4. Meta-INFに登録
2. SymbolProcessorを実装3. SymbolProcessorProviderを実装4. Meta-INFに登録1. 依存関係を追加
1. 依存関係を追加3. SymbolProcessorProviderを実装4. Meta-INFに登録2. SymbolProcessorを実装
毎ラウンド呼ばれる処理引数のResolverから各ファイルにアクセス可能
生成終了時の処理を記述
プロセッサーがエラーを投げた時の処理を記述*他のプロセッサーがエラーを投げても呼び出される
今回の用途だとprocess関数だけ実装でOK!
指定されたアノテーションのついた要素を取得
処理出来るものと出来ないものを分ける
依存
依存自動生成されるコードだとすると?
依存スーパークラスを参照できない😭
依存次のラウンドだと存在するかも??
直接関連する要素が参照可能かどうか検証してくれる
生成コードを作る
ファイルに書き出す
どのファイルが変更されたらコードの再生成を行うか指定
生成
生成変更再生成
生成変更
ビルド時間を短縮
関連するファイル群可変長引数で指定
aggregating?🤔
生成変更aggregating = trueの時関係ないファイルの変更でも再生成される
生成変更aggregating = falseの時関係ないファイルの変更では再生成されない(isolate)
基本はfalseでOK!
他のファイル変更時に再生成するかどうか
パッケージ名、ファイル名の指定
コードを出力(outputStream)
処理しなかった要素を返す
2. SymbolProcessorを実装1. 依存関係を追加4. Meta-INFに登録3. SymbolProcessorProviderを実装
先ほど作ったクラスをインスタンス化するだけ
2. SymbolProcessorを実装1. 依存関係を追加3. SymbolProcessorProviderを実装4. Meta-INFに登録
完成🤩動かしてみる
自動生成された関数
対応状況
- Room- RxHttp- Koin Annotations- Epoxy対応済み
- Room- RxHttp- Koin Annotations- Epoxy対応済みDagger Hiltは未対応
そのうちKaptからKSPに完全移行されるはず
ご清聴ありがとうございました!