Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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.