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
1k
Kotlin2.0対応などでビルド時間を45%削減したぞ!
napplecomputer
August 09, 2024
Tweet
Share
More Decks by napplecomputer
See All by napplecomputer
EmojiPicker触ってみた
napplecomputer
0
690
compileSdkVersion33でgetSerializable/getParcelableがつらい話
napplecomputer
13
5.6k
式年遷Target SDK Version
napplecomputer
0
360
Target SDK Versionを上げない Notification runtime permission対応
napplecomputer
0
460
通知がOFFだとToastは表示されな… されてる!?
napplecomputer
0
1.1k
Photo Pickerを触って比較してみた
napplecomputer
0
2.1k
Android Qのストレージの話
napplecomputer
3
1.2k
Wi-Fi RTTによる屋内測位アプリを作ろう
napplecomputer
5
17k
Other Decks in Technology
See All in Technology
そのコンポーネント、サーバー?クライアント?App Router開発のモヤモヤを可視化する補助輪
makotot
4
770
人と組織に偏重したEMへのアンチテーゼ──なぜ、EMに設計力が必要なのか/An antithesis to the overemphasis of people and organizations in EM
dskst
7
810
Grafana MCPサーバーによるAIエージェント経由でのGrafanaダッシュボード動的生成
hamadakoji
1
850
Bye-Bye Query Spaghetti: Write Queries You'll Actually Understand Using Pipelined SQL Syntax
tobiaslampertlotum
0
110
Jaws-ug名古屋_LT資料_20250829
azoo2024
3
190
実運用で考える PGO
kworkdev
PRO
0
120
Goss: Faiss向けの新しい本番環境対応 Goバインディング #coefl_go_jp
bengo4com
1
1.4k
攻撃と防御で実践するプロダクトセキュリティ演習~導入パート~
recruitengineers
PRO
3
1.6k
クラウドセキュリティを支える技術と運用の最前線 / Cutting-edge Technologies and Operations Supporting Cloud Security
yuj1osm
2
230
Microsoft Fabric のネットワーク保護のアップデートについて
ryomaru0825
1
120
プロダクトの成長に合わせたアーキテクチャの段階的進化と成長痛、そして、ユニットエコノミクスの最適化
kakehashi
PRO
1
110
AWS環境のリソース調査を Claude Code で効率化 / aws investigate with cc devio2025
masahirokawahara
2
850
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Six Lessons from altMBA
skipperchong
28
4k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
It's Worth the Effort
3n
187
28k
The Invisible Side of Design
smashingmag
301
51k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
11
1.1k
How GitHub (no longer) Works
holman
315
140k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
910
Site-Speed That Sticks
csswizardry
10
800
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.