Slide 1

Slide 1 text

© GO Inc. Kotlin 2.0対応などで ビルド時間を45%削減したぞ! @napplecomputer

Slide 2

Slide 2 text

© GO Inc. ● @napplecomputer ● なっぴー ● GO株式会社 ● タクシーアプリ『GO』 ● このあと静岡に帰ります 2 自己紹介

Slide 3

Slide 3 text

© GO Inc. ● ビルド速度遅くね? ● 並列ビルドの改善 ● kaptのksp化 ● DataBinding対応 ● Kotlin 2.0対応 ● 結果 ● まとめ 3 目次

Slide 4

Slide 4 text

© GO Inc. 4 ビルド速度 遅くね?

Slide 5

Slide 5 text

© GO Inc. ● チーム内でビルド速度が遅いことが話題になる ● 何かをしたら遅くなったという特定の原因があるわ けではない ● ビルドを解析して有効そうな⼿段を探しビルド速度 改善を⾏うことに ○ profileオプションとgradle profiler 5 ビルド速度遅くね?

Slide 6

Slide 6 text

© GO Inc. ● ビルド解析でわかった改善できそうな部分 ○ 並列ビルド改善 ○ kaptのksp化 ● それ以外 ○ Kotlin 2.0対応 6 ビルド速度遅くね?

Slide 7

Slide 7 text

© GO Inc. 7 並列ビルドの 改善

Slide 8

Slide 8 text

© GO Inc. ● 対象のアプリはレイヤー+featureごとの縦横のマ ルチモジュール構成 ● 実⾏中のビルドプロセスを⾒ると単⼀のモジュール だけをビルドしている時間がちらほらある 8 並列ビルドの改善

Slide 9

Slide 9 text

© GO Inc. 9 並列ビルドの改善 module A module E module D module C module F module B module G

Slide 10

Slide 10 text

© GO Inc. ● 多くのモジュールが依存しているモジュール ● 多くのモジュールを依存しているモジュール 10 並列ビルドの改善

Slide 11

Slide 11 text

© GO Inc. 11 並列ビルドの改善 module A module E module D module C module F module B module G

Slide 12

Slide 12 text

© GO Inc. ● 多くのモジュールが依存しているモジュール ○ 未整理のモジュールが多くの実装を抱え込んで おり、ほとんどのモジュールがこのモジュール のビルドを待ってしまう 12 並列ビルドの改善

Slide 13

Slide 13 text

© GO Inc. 13 並列ビルドの改善 module A module E module D module C module F module B module G

Slide 14

Slide 14 text

© GO Inc. ● 多くのモジュールを依存しているモジュール ○ デバッグ機能など⼀部のモジュールが多くのモ ジュールに依存しており、このモジュールがビ ルドする頃には⼀緒にビルドできるモジュール がない 14 並列ビルドの改善

Slide 15

Slide 15 text

© GO Inc. 対応 15 並列ビルドの改善

Slide 16

Slide 16 text

© GO Inc. ● 多くのモジュールが依存しているモジュール ○ 未整理の実装をあるべき場所に切り出し、ほと んどのモジュールが依存している部分を⼩さく する ● 多くのモジュールを依存しているモジュール ○ 依存性の逆転や実装の⾒直しで依存を減らす 16 並列ビルドの改善

Slide 17

Slide 17 text

© GO Inc. 17 kaptのksp移⾏

Slide 18

Slide 18 text

© GO Inc. ● kaptよりkspの⽅がビルド速度が速い(はず) ● このとき既に⼀部のライブラリをkaptからkspに移 ⾏済み ● DataBindingなどでkaptは残ったまま 18 kaptのksp移行

Slide 19

Slide 19 text

© GO Inc. 19 kaptのksp移行 ● Hilt ● Room ● Moshi ● DataBinding ● PermissionDispatcher ● DataBinding ● PermissionDispatcher ● Hilt ● Room ● Moshi kapt kapt ksp

Slide 20

Slide 20 text

© GO Inc. ビルド解析 20 kaptのksp移行

Slide 21

Slide 21 text

© GO Inc. ● 改めてビルドプロセスの実⾏時間を⾒るとkaptも kspもそれなりに時間がかかっている ● kaptもkspもプロセスを動かすだけである程度の時 間がかかってしまうのでは? ● kaptよりもkspのほうが速いはずだが混在した場合 はkaptだけの状態より遅いのでは? 21 kaptのksp移行

Slide 22

Slide 22 text

© GO Inc. ● 計測した結果、kaptとkspが混在した環境では kaptだけの環境よりビルドに時間がかかることが 判明 22 kaptのksp移行

Slide 23

Slide 23 text

© GO Inc. 23 kaptのksp移行 ● Hilt ● Room ● Moshi ● DataBinding ● PermissionDispatcher ● DataBinding ● PermissionDispatcher ● Hilt ● Room ● Moshi kapt kapt ksp

Slide 24

Slide 24 text

© GO Inc. 24 kaptのksp移行 ● Hilt ● Room ● Moshi ● DataBinding ● PermissionDispatcher ● DataBinding ● PermissionDispatcher ● Hilt ● Room ● Moshi kapt kapt ksp こっちのほうが速い

Slide 25

Slide 25 text

© GO Inc. 25 kaptのksp移行 ● Hilt ● Room ● Moshi ● DataBinding ● PermissionDispatcher ● DataBinding ● PermissionDispatcher ● Hilt ● Room ● Moshi kapt kapt ksp こっちのほうが速い kspのみ > kaptのみ > kaptとksp混在

Slide 26

Slide 26 text

© GO Inc. ● kaptだけに戻すか、ksp移⾏を進めるか ● このとき並⾏してKotlin 2.0移⾏を進めており、 Kotlin 2.0ではkaptが使えないことがわかっていた ● ビルド時間改善だけでなくKotlin 2.0移⾏の観点で もkaptを完全にksp移⾏することを⽬標に 26 kaptのksp移行

Slide 27

Slide 27 text

© GO Inc. ksp移⾏ 27 kaptのksp移行

Slide 28

Slide 28 text

© GO Inc. ● PermissionDispatcherはRuntime Permissionが Result⽅式になった時点で外すべきだったが、特 に問題も起きていないので対応していなかった ○ ⼯数を確保してResult⽅式の実装に変更 ● DataBindingは… 28 kaptのksp移行

Slide 29

Slide 29 text

© GO Inc. 29 DataBinding 対応

Slide 30

Slide 30 text

© GO Inc. ● Kotlin 2.0ではkaptが使えない ● ビルド速度改善の観点からkaptを駆逐したい ● DataBindingはkspに対応していない!!! ● つまりDataBindingをやめる必要がある 30 DataBinding対応

Slide 31

Slide 31 text

© GO Inc. 31 DataBinding対応

Slide 32

Slide 32 text

© GO Inc. 32 DataBinding対応

Slide 33

Slide 33 text

© GO Inc. 😱 33 DataBinding対応

Slide 34

Slide 34 text

© GO Inc. DataBindingを 消すための案 34 DataBinding対応

Slide 35

Slide 35 text

© GO Inc. ● DataBindingを消すための案 ○ すべてCompose化する ○ DataBindingで⽣成されたファイルをリポジト リに取り込む ○ ViewBindingに置き換える ○ 移⾏ツールを使う 35 DataBinding対応

Slide 36

Slide 36 text

© GO Inc. ● Compose化する ○ 理想的 ○ 今回は画⾯数が多すぎるため⻑期的に作業する 必要がある 36 DataBinding対応

Slide 37

Slide 37 text

© GO Inc. ● DataBindingで⽣成されたファイルをリポジトリ に取り込む ○ ⽣成されたファイルを⼈間がメンテするのは難 しく変更に弱い ○ 変更時にkaptに再⽣成させるのも時間がかかり すぎる 37 DataBinding対応

Slide 38

Slide 38 text

© GO Inc. ● ViewBindingに置き換える ○ それなりに作業が発⽣するので画⾯数的に⾟い ○ 将来的にComposeに置き換わるコードなので モチベーションが保てない 38 DataBinding対応

Slide 39

Slide 39 text

© GO Inc. ● 移⾏ツールを使う ○ Wantedlyのくぼぼ(swiz_ard)さんが移⾏ツー ルを公開しており、ViewBindingとViewModel をつなぐファイルを⽣成してくれる ○ 単純にViewBindingに移⾏するよりは楽 ○ 詳しくはくぼぼさんの資料を⾒てね 39 DataBinding対応

Slide 40

Slide 40 text

© GO Inc. 40 DataBinding対応 https://speakerdeck.com/kubode/easier-migration-of-data-binding

Slide 41

Slide 41 text

© GO Inc. DataBindingを消す 41 DataBinding対応

Slide 42

Slide 42 text

© GO Inc. ● くぼぼさんの移⾏ツールを使う⽅針に決定 ● DataBindingハンターを募り⼿分けをして DataBinding殺しを実⾏ ● ハンターのおかげで短期間でDataBinding移⾏が 完了 ● QAはしっかり⽬にやったほうがいいです ○ DataBinding移⾏関連で不具合が結構出ました 42 DataBinding対応

Slide 43

Slide 43 text

© GO Inc. 43 Kotlin 2.0対応

Slide 44

Slide 44 text

© GO Inc. ● Kotlin 2.0からCompilerがK2 Compilerに変わる ことでビルド速度が向上する(はず) ● いずれライブラリ都合などでもKotlin 2.0が必要に なりそう ● 早めに対応してビルド速度向上の恩恵を享受したい ● マイグレーションガイドが公式に出ている 44 Kotlin 2.0対応

Slide 45

Slide 45 text

© GO Inc. 対応 45 Kotlin 2.0

Slide 46

Slide 46 text

© GO Inc. ● kaptが使えないので以下の対応をする必要がある ○ ksp化 ○ kspに対応していないライブラリを外す ● Compilerが変わったことで型推論が賢くなってお り、Warningが出まくるのでその対応 ○ allWarningsAsErrors = trueしているとビルド が通らない 46 Kotlin 2.0対応

Slide 47

Slide 47 text

© GO Inc. 47 結果

Slide 48

Slide 48 text

© GO Inc. ● 並列ビルドの改善:10%削減 ○ まだin progress ● ksp移⾏とDataBindingの削除:25%削減 ● Kotlin2.0対応:10%削減 48 結果

Slide 49

Slide 49 text

© GO Inc. ● 並列ビルドの改善:10%削減 ○ まだin progress ● ksp移⾏とDataBindingの削除:25%削減 ● Kotlin2.0対応:10%削減 49 結果 合計45%削減!!

Slide 50

Slide 50 text

© GO Inc. 50 まとめ

Slide 51

Slide 51 text

© GO Inc. ● モジュール内でkaptとkspが混在すると遅くなる事 がある ● ⼀部だけksp移⾏する場合はビルド速度を確認すべ き ● DataBindingを剥がすのは画⾯数が多いアプリで は⾮常に困難 ● kaptの削除さえできていればKotlin 2.0対応は楽勝 51 まとめ

Slide 52

Slide 52 text

© GO Inc. ● Kotlin 1.9系のK2 modeでは互換kaptが動きます がめちゃくちゃ不安定でビルドが5回に1回くらい しか成功しなかったので期待しないほうがいいです 52 おまけ

Slide 53

Slide 53 text

文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください。 © GO Inc.