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
970
Kotlin2.0対応などでビルド時間を45%削減したぞ!
napplecomputer
August 09, 2024
Tweet
Share
More Decks by napplecomputer
See All by napplecomputer
EmojiPicker触ってみた
napplecomputer
0
680
compileSdkVersion33でgetSerializable/getParcelableがつらい話
napplecomputer
13
5.6k
式年遷Target SDK Version
napplecomputer
0
350
Target SDK Versionを上げない Notification runtime permission対応
napplecomputer
0
450
通知がOFFだとToastは表示されな… されてる!?
napplecomputer
0
1k
Photo Pickerを触って比較してみた
napplecomputer
0
2k
Android Qのストレージの話
napplecomputer
3
1.2k
Wi-Fi RTTによる屋内測位アプリを作ろう
napplecomputer
5
17k
Other Decks in Technology
See All in Technology
PHPからはじめるコンピュータアーキテクチャ / From Scripts to Silicon: A Journey Through the Layers of Computing
tomzoh
2
380
株式会社島津製作所_研究開発(集団協業と知的生産)の現場を支える、OSS知識基盤システムの導入
akahane92
1
1.1k
そもそも AWS FIS について。なぜ今 FIS のハンズオンなのか?などなど
kazzpapa3
2
120
SREを知らずに SREマネージャーになった話 / How I Became an SRE Manager Without Knowing What SRE Is
moneyforward
0
290
分散トレーシングによる コネクティッドカーのデータ処理見える化の試み
thatsdone
0
190
Semantic Machine Intelligence for Vision, Language, and Actions
keio_smilab
PRO
2
390
AIコードアシスタントとiOS開発
jollyjoester
1
230
(HackFes)米国国防総省のDevSecOpsライフサイクルをAWSのセキュリティサービスとOSSで実現
syoshie
5
660
なぜAI時代に 「イベント」を中心に考えるのか? / Why focus on "events" in the age of AI?
ytake
2
450
PHPでResult型やってみよう
higaki_program
0
190
BEYOND THE RAG🚀 ~とりあえずRAG?を超えていけ! 本当に使えるAIエージェント&生成AIプロダクトを目指して~ / BEYOND-THE-RAG-Toward Practical-GenerativeAI-Products-AOAI-DevDay-2025
jnymyk
4
230
AI駆動開発 with MixLeap Study【大阪支部 #3】
lycorptech_jp
PRO
0
180
Featured
See All Featured
For a Future-Friendly Web
brad_frost
179
9.8k
A Modern Web Designer's Workflow
chriscoyier
695
190k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Being A Developer After 40
akosma
90
590k
Rails Girls Zürich Keynote
gr2m
95
14k
Code Review Best Practice
trishagee
69
19k
Gamification - CAS2011
davidbonilla
81
5.4k
4 Signs Your Business is Dying
shpigford
184
22k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Statistics for Hackers
jakevdp
799
220k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
710
Faster Mobile Websites
deanohume
308
31k
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.