Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin2.0対応などでビルド時間を45%削減したぞ!
Search
napplecomputer
August 09, 2024
Technology
0
870
Kotlin2.0対応などでビルド時間を45%削減したぞ!
napplecomputer
August 09, 2024
Tweet
Share
More Decks by napplecomputer
See All by napplecomputer
EmojiPicker触ってみた
napplecomputer
0
650
compileSdkVersion33でgetSerializable/getParcelableがつらい話
napplecomputer
12
5.2k
式年遷Target SDK Version
napplecomputer
0
320
Target SDK Versionを上げない Notification runtime permission対応
napplecomputer
0
440
通知がOFFだとToastは表示されな… されてる!?
napplecomputer
0
970
Photo Pickerを触って比較してみた
napplecomputer
0
2k
Android Qのストレージの話
napplecomputer
3
1.1k
Wi-Fi RTTによる屋内測位アプリを作ろう
napplecomputer
5
17k
Other Decks in Technology
See All in Technology
入社後SREチームのミッションや課題の整理をした話
morix1500
1
170
React Server Componentは 何を解決し何を解決しないのか / What do React Server Components solve, and what do they not solve?
kaminashi
6
1.3k
Amebaにおける Platform Engineeringの実践
kumorn5s
0
170
スケールアップ企業のQA組織のバリューを最大限に引き出すための取り組み
tarappo
4
990
caching_sha2_passwordのはなし
boro1234
0
220
パスキー導入の課題と ベストプラクティス、今後の展望
ritou
7
1.3k
アプリケーション固有の「ロジックの脆弱性」を防ぐ開発者のためのセキュリティ観点
flatt_security
35
14k
Tirez profit de Messenger pour améliorer votre architecture
tucksaun
1
160
Javaの新しめの機能を知ったかぶれるようになる話 #kanjava
irof
3
5k
Amazon EKS Auto ModeでKubernetesの運用をシンプルにする
sshota0809
0
120
AWS CDK コントリビュート はじめの一歩
yendoooo
1
120
3/26 クラウド食堂LT #2 GenU案件を通して学んだ教訓 登壇資料
ymae
1
220
Featured
See All Featured
Designing for Performance
lara
606
69k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
29
2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
How GitHub (no longer) Works
holman
314
140k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Embracing the Ebb and Flow
colly
85
4.6k
Side Projects
sachag
452
42k
Producing Creativity
orderedlist
PRO
344
40k
The Pragmatic Product Professional
lauravandoore
33
6.5k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Fireside Chat
paigeccino
37
3.3k
Docker and Python
trallard
44
3.3k
Transcript
© GO Inc. Kotlin 2.0対応などで ビルド時間を45%削減したぞ! @napplecomputer
© GO Inc. • @napplecomputer • なっぴー • GO株式会社 •
タクシーアプリ『GO』 • このあと静岡に帰ります 2 自己紹介
© GO Inc. • ビルド速度遅くね? • 並列ビルドの改善 • kaptのksp化 •
DataBinding対応 • Kotlin 2.0対応 • 結果 • まとめ 3 目次
© GO Inc. 4 ビルド速度 遅くね?
© GO Inc. • チーム内でビルド速度が遅いことが話題になる • 何かをしたら遅くなったという特定の原因があるわ けではない • ビルドを解析して有効そうな⼿段を探しビルド速度
改善を⾏うことに ◦ profileオプションとgradle profiler 5 ビルド速度遅くね?
© GO Inc. • ビルド解析でわかった改善できそうな部分 ◦ 並列ビルド改善 ◦ kaptのksp化 •
それ以外 ◦ Kotlin 2.0対応 6 ビルド速度遅くね?
© GO Inc. 7 並列ビルドの 改善
© GO Inc. • 対象のアプリはレイヤー+featureごとの縦横のマ ルチモジュール構成 • 実⾏中のビルドプロセスを⾒ると単⼀のモジュール だけをビルドしている時間がちらほらある 8
並列ビルドの改善
© GO Inc. 9 並列ビルドの改善 module A module E module
D module C module F module B module G
© GO Inc. • 多くのモジュールが依存しているモジュール • 多くのモジュールを依存しているモジュール 10 並列ビルドの改善
© GO Inc. 11 並列ビルドの改善 module A module E module
D module C module F module B module G
© GO Inc. • 多くのモジュールが依存しているモジュール ◦ 未整理のモジュールが多くの実装を抱え込んで おり、ほとんどのモジュールがこのモジュール のビルドを待ってしまう 12
並列ビルドの改善
© GO Inc. 13 並列ビルドの改善 module A module E module
D module C module F module B module G
© GO Inc. • 多くのモジュールを依存しているモジュール ◦ デバッグ機能など⼀部のモジュールが多くのモ ジュールに依存しており、このモジュールがビ ルドする頃には⼀緒にビルドできるモジュール がない
14 並列ビルドの改善
© GO Inc. 対応 15 並列ビルドの改善
© GO Inc. • 多くのモジュールが依存しているモジュール ◦ 未整理の実装をあるべき場所に切り出し、ほと んどのモジュールが依存している部分を⼩さく する •
多くのモジュールを依存しているモジュール ◦ 依存性の逆転や実装の⾒直しで依存を減らす 16 並列ビルドの改善
© GO Inc. 17 kaptのksp移⾏
© GO Inc. • kaptよりkspの⽅がビルド速度が速い(はず) • このとき既に⼀部のライブラリをkaptからkspに移 ⾏済み • DataBindingなどでkaptは残ったまま
18 kaptのksp移行
© GO Inc. 19 kaptのksp移行 • Hilt • Room •
Moshi • DataBinding • PermissionDispatcher • DataBinding • PermissionDispatcher • Hilt • Room • Moshi kapt kapt ksp
© GO Inc. ビルド解析 20 kaptのksp移行
© GO Inc. • 改めてビルドプロセスの実⾏時間を⾒るとkaptも kspもそれなりに時間がかかっている • kaptもkspもプロセスを動かすだけである程度の時 間がかかってしまうのでは? •
kaptよりもkspのほうが速いはずだが混在した場合 はkaptだけの状態より遅いのでは? 21 kaptのksp移行
© GO Inc. • 計測した結果、kaptとkspが混在した環境では kaptだけの環境よりビルドに時間がかかることが 判明 22 kaptのksp移行
© GO Inc. 23 kaptのksp移行 • Hilt • Room •
Moshi • DataBinding • PermissionDispatcher • DataBinding • PermissionDispatcher • Hilt • Room • Moshi kapt kapt ksp
© GO Inc. 24 kaptのksp移行 • Hilt • Room •
Moshi • DataBinding • PermissionDispatcher • DataBinding • PermissionDispatcher • Hilt • Room • Moshi kapt kapt ksp こっちのほうが速い
© GO Inc. 25 kaptのksp移行 • Hilt • Room •
Moshi • DataBinding • PermissionDispatcher • DataBinding • PermissionDispatcher • Hilt • Room • Moshi kapt kapt ksp こっちのほうが速い kspのみ > kaptのみ > kaptとksp混在
© GO Inc. • kaptだけに戻すか、ksp移⾏を進めるか • このとき並⾏してKotlin 2.0移⾏を進めており、 Kotlin 2.0ではkaptが使えないことがわかっていた
• ビルド時間改善だけでなくKotlin 2.0移⾏の観点で もkaptを完全にksp移⾏することを⽬標に 26 kaptのksp移行
© GO Inc. ksp移⾏ 27 kaptのksp移行
© GO Inc. • PermissionDispatcherはRuntime Permissionが Result⽅式になった時点で外すべきだったが、特 に問題も起きていないので対応していなかった ◦ ⼯数を確保してResult⽅式の実装に変更
• DataBindingは… 28 kaptのksp移行
© GO Inc. 29 DataBinding 対応
© GO Inc. • Kotlin 2.0ではkaptが使えない • ビルド速度改善の観点からkaptを駆逐したい • DataBindingはkspに対応していない!!!
• つまりDataBindingをやめる必要がある 30 DataBinding対応
© GO Inc. 31 DataBinding対応
© GO Inc. 32 DataBinding対応
© GO Inc. 😱 33 DataBinding対応
© GO Inc. DataBindingを 消すための案 34 DataBinding対応
© GO Inc. • DataBindingを消すための案 ◦ すべてCompose化する ◦ DataBindingで⽣成されたファイルをリポジト リに取り込む
◦ ViewBindingに置き換える ◦ 移⾏ツールを使う 35 DataBinding対応
© GO Inc. • Compose化する ◦ 理想的 ◦ 今回は画⾯数が多すぎるため⻑期的に作業する 必要がある
36 DataBinding対応
© GO Inc. • DataBindingで⽣成されたファイルをリポジトリ に取り込む ◦ ⽣成されたファイルを⼈間がメンテするのは難 しく変更に弱い ◦
変更時にkaptに再⽣成させるのも時間がかかり すぎる 37 DataBinding対応
© GO Inc. • ViewBindingに置き換える ◦ それなりに作業が発⽣するので画⾯数的に⾟い ◦ 将来的にComposeに置き換わるコードなので モチベーションが保てない
38 DataBinding対応
© GO Inc. • 移⾏ツールを使う ◦ Wantedlyのくぼぼ(swiz_ard)さんが移⾏ツー ルを公開しており、ViewBindingとViewModel をつなぐファイルを⽣成してくれる ◦
単純にViewBindingに移⾏するよりは楽 ◦ 詳しくはくぼぼさんの資料を⾒てね 39 DataBinding対応
© GO Inc. 40 DataBinding対応 https://speakerdeck.com/kubode/easier-migration-of-data-binding
© GO Inc. DataBindingを消す 41 DataBinding対応
© GO Inc. • くぼぼさんの移⾏ツールを使う⽅針に決定 • DataBindingハンターを募り⼿分けをして DataBinding殺しを実⾏ • ハンターのおかげで短期間でDataBinding移⾏が
完了 • QAはしっかり⽬にやったほうがいいです ◦ DataBinding移⾏関連で不具合が結構出ました 42 DataBinding対応
© GO Inc. 43 Kotlin 2.0対応
© GO Inc. • Kotlin 2.0からCompilerがK2 Compilerに変わる ことでビルド速度が向上する(はず) • いずれライブラリ都合などでもKotlin
2.0が必要に なりそう • 早めに対応してビルド速度向上の恩恵を享受したい • マイグレーションガイドが公式に出ている 44 Kotlin 2.0対応
© GO Inc. 対応 45 Kotlin 2.0
© GO Inc. • kaptが使えないので以下の対応をする必要がある ◦ ksp化 ◦ kspに対応していないライブラリを外す •
Compilerが変わったことで型推論が賢くなってお り、Warningが出まくるのでその対応 ◦ allWarningsAsErrors = trueしているとビルド が通らない 46 Kotlin 2.0対応
© GO Inc. 47 結果
© GO Inc. • 並列ビルドの改善:10%削減 ◦ まだin progress • ksp移⾏とDataBindingの削除:25%削減
• Kotlin2.0対応:10%削減 48 結果
© GO Inc. • 並列ビルドの改善:10%削減 ◦ まだin progress • ksp移⾏とDataBindingの削除:25%削減
• Kotlin2.0対応:10%削減 49 結果 合計45%削減!!
© GO Inc. 50 まとめ
© GO Inc. • モジュール内でkaptとkspが混在すると遅くなる事 がある • ⼀部だけksp移⾏する場合はビルド速度を確認すべ き •
DataBindingを剥がすのは画⾯数が多いアプリで は⾮常に困難 • kaptの削除さえできていればKotlin 2.0対応は楽勝 51 まとめ
© GO Inc. • Kotlin 1.9系のK2 modeでは互換kaptが動きます がめちゃくちゃ不安定でビルドが5回に1回くらい しか成功しなかったので期待しないほうがいいです 52
おまけ
文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください。 © GO Inc.