Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KSPで自動生成コードを作る

 KSPで自動生成コードを作る

KSPの概要、使い方について簡単に説明したスライドです。

bugdog24

April 22, 2023
Tweet

More Decks by bugdog24

Other Decks in Technology

Transcript

  1. KSPで
    自動生成コードを作る
    起塚 亮

    View full-size slide

  2. 起塚 亮
    自己紹介
    岡山大学工学部 24卒
    Androidエンジニア
    趣味:刀鑑賞、麻雀、プログラミング
    @bugdog24

    View full-size slide

  3. - Kotlin Symbol Processingの略
    - コンパイラプラグイン用API
    - コードの自動生成プログラムを
    書くときに利用

    View full-size slide

  4. コンパイル

    View full-size slide

  5. コンパイル
    etc…

    View full-size slide

  6. etc…
    コンパイル
    既存ファイル
    読み取り

    View full-size slide

  7. コンパイル
    etc…
    コード生成して
    ファイル追加

    View full-size slide

  8. コンパイル
    etc…
    生成しなくなるまで
    ラウンドを回す

    View full-size slide

  9. etc…
    全てのファイルを
    コンパイル
    コンパイル

    View full-size slide

  10. コンパイル
    etc…

    View full-size slide

  11. KSPの利点 高速
    Kaptよりも2倍近い速度で動作可能
    実装コスト
    シンプルなAPIセットで構成
    バージョン間の互換性
    Kotlinのバージョンが違っても動作可能

    View full-size slide

  12. 作ってみる

    View full-size slide

  13. Compose用ViewModelFactory
    生成プログラム

    View full-size slide

  14. 一見便利だが引数があると・・・

    View full-size slide

  15. - ボイラーコードを書く必要がある
    - 引数を追加するたびに書き直す必要あり
    - コンパイル時に気づけない

    View full-size slide

  16. これを付けることで対応する
    Factoryを生成するようにする

    View full-size slide

  17. 1. 依存関係を追加
    2. SymbolProcessorを実装
    3. SymbolProcessorProviderを実装
    4. Meta-INFに登録

    View full-size slide

  18. 2. SymbolProcessorを実装
    3. SymbolProcessorProviderを実装
    4. Meta-INFに登録
    1. 依存関係を追加

    View full-size slide

  19. 1. 依存関係を追加
    3. SymbolProcessorProviderを実装
    4. Meta-INFに登録
    2. SymbolProcessorを実装

    View full-size slide

  20. 毎ラウンド呼ばれる処理
    引数のResolverから各ファイルにアクセス可能

    View full-size slide

  21. 生成終了時の処理を記述

    View full-size slide

  22. プロセッサーがエラーを投げた時の処理を記述
    *他のプロセッサーがエラーを投げても
    呼び出される

    View full-size slide

  23. 今回の用途だと
    process関数だけ実装でOK!

    View full-size slide

  24. 指定されたアノテーションのついた要素を取得

    View full-size slide

  25. 処理出来るものと出来ないものを分ける

    View full-size slide

  26. 依存
    自動生成されるコードだとすると?

    View full-size slide

  27. 依存
    スーパークラスを参照できない😭

    View full-size slide

  28. 依存
    次のラウンドだと存在するかも?
    ?

    View full-size slide

  29. 直接関連する要素が参照可能かどうか
    検証してくれる

    View full-size slide

  30. 生成コードを作る

    View full-size slide

  31. ファイルに書き出す

    View full-size slide

  32. どのファイルが変更されたら
    コードの再生成を行うか指定

    View full-size slide

  33. 生成
    変更
    再生成

    View full-size slide

  34. 生成
    変更

    View full-size slide

  35. ビルド時間を短縮

    View full-size slide

  36. 関連するファイル群
    可変長引数で指定

    View full-size slide

  37. aggregating?🤔

    View full-size slide

  38. 生成
    変更

    View full-size slide

  39. 生成
    変更
    aggregating = trueの時
    関係ないファイルの変更
    でも再生成される

    View full-size slide

  40. 生成
    変更
    aggregating = falseの時
    関係ないファイルの変更
    では再生成されない(isolate)

    View full-size slide

  41. 基本はfalseでOK!

    View full-size slide

  42. 他のファイル変更時に
    再生成するかどうか

    View full-size slide

  43. パッケージ名、ファイル名の指定

    View full-size slide

  44. コードを出力(outputStream)

    View full-size slide

  45. 処理しなかった要素を返す

    View full-size slide

  46. 2. SymbolProcessorを実装
    1. 依存関係を追加
    4. Meta-INFに登録
    3. SymbolProcessorProviderを実装

    View full-size slide

  47. 先ほど作ったクラスを
    インスタンス化するだけ

    View full-size slide

  48. 2. SymbolProcessorを実装
    1. 依存関係を追加
    3. SymbolProcessorProviderを実装
    4. Meta-INFに登録

    View full-size slide

  49. 完成🤩
    動かしてみる

    View full-size slide

  50. 自動生成された関数

    View full-size slide

  51. 対応状況

    View full-size slide

  52. - Room
    - RxHttp
    - Koin Annotations
    - Epoxy
    対応済み

    View full-size slide

  53. - Room
    - RxHttp
    - Koin Annotations
    - Epoxy
    対応済み
    Dagger Hiltは未対応

    View full-size slide

  54. そのうちKaptからKSPに完全移行されるはず

    View full-size slide

  55. ご清聴
    ありがとうございました!

    View full-size slide