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
1.1k
Kotlin2.0対応などでビルド時間を45%削減したぞ!
napplecomputer
August 09, 2024
Tweet
Share
More Decks by napplecomputer
See All by napplecomputer
EmojiPicker触ってみた
napplecomputer
0
720
compileSdkVersion33でgetSerializable/getParcelableがつらい話
napplecomputer
13
5.8k
式年遷Target SDK Version
napplecomputer
0
410
Target SDK Versionを上げない Notification runtime permission対応
napplecomputer
0
490
通知がOFFだとToastは表示されな… されてる!?
napplecomputer
0
1.1k
Photo Pickerを触って比較してみた
napplecomputer
0
2.2k
Android Qのストレージの話
napplecomputer
3
1.2k
Wi-Fi RTTによる屋内測位アプリを作ろう
napplecomputer
5
18k
Other Decks in Technology
See All in Technology
Eight Engineering Unit 紹介資料
sansan33
PRO
0
6.2k
たかがボタン、されどボタン ~button要素から深ぼるボタンUIの定義について~ / BuriKaigi 2026
yamanoku
1
270
Qiita Bash アドカレ LT #1
okaru
0
190
旬のブリと旬の技術で楽しむ AI エージェント設計開発レシピ
chack411
1
250
業務の煩悩を祓うAI活用術108選 / AI 108 Usages
smartbank
9
22k
次世代AIコーディング:OpenAI Codex の最新動向 進行スライド/nikkei-tech-talk-40
nikkei_engineer_recruiting
0
150
Scrum Guide Expansion Pack が示す現代プロダクト開発への補完的視点
sonjin
0
640
製造業から学んだ「本質を守り現場に合わせるアジャイル実践」
kamitokusari
0
650
チームで安全にClaude Codeを利用するためのプラクティス / team-claude-code-practices
tomoki10
7
3.3k
戰略轉變:從建構 AI 代理人到發展可擴展的技能生態系統
appleboy
0
190
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
1
910
田舎で20年スクラム(後編):一個人が企業で長期戦アジャイルに挑む意味
chinmo
1
1.5k
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
81
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
150
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
2.8k
Designing for Timeless Needs
cassininazir
0
120
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
0
440
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
41
Discover your Explorer Soul
emna__ayadi
2
1k
For a Future-Friendly Web
brad_frost
180
10k
GraphQLの誤解/rethinking-graphql
sonatard
74
11k
KATA
mclloyd
PRO
33
15k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
120
The agentic SEO stack - context over prompts
schlessera
0
590
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.