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 Slide

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

    View Slide

  3. KSPとは

    View Slide

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

    View Slide

  5. コンパイル

    View Slide

  6. コンパイル
    etc…

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. コンパイル
    etc…

    View Slide

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

    View Slide

  13. 作ってみる

    View Slide

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

    View Slide

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

    View Slide

  16. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. View Slide

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

    View Slide

  23. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. View Slide

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

    View Slide

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

    View Slide

  31. 依存

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  36. 生成コードを作る

    View Slide

  37. ファイルに書き出す

    View Slide

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

    View Slide

  39. 生成

    View Slide

  40. 生成
    変更
    再生成

    View Slide

  41. 生成
    変更

    View Slide

  42. ビルド時間を短縮

    View Slide

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

    View Slide

  44. aggregating?🤔

    View Slide

  45. 生成
    変更

    View Slide

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

    View Slide

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

    View Slide

  48. 基本はfalseでOK!

    View Slide

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

    View Slide

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

    View Slide

  51. コードを出力(outputStream)

    View Slide

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

    View Slide

  53. View Slide

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

    View Slide

  55. View Slide

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

    View Slide

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

    View Slide

  58. View Slide

  59. View Slide

  60. 完成🤩
    動かしてみる

    View Slide

  61. View Slide

  62. View Slide

  63. View Slide

  64. View Slide

  65. 自動生成された関数

    View Slide

  66. 対応状況

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide