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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
napplecomputer
August 09, 2024
Technology
1.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlin2.0対応などでビルド時間を45%削減したぞ!
napplecomputer
August 09, 2024
More Decks by napplecomputer
See All by napplecomputer
EmojiPicker触ってみた
napplecomputer
0
780
compileSdkVersion33でgetSerializable/getParcelableがつらい話
napplecomputer
13
6k
式年遷Target SDK Version
napplecomputer
0
480
Target SDK Versionを上げない Notification runtime permission対応
napplecomputer
0
520
通知がOFFだとToastは表示されな… されてる!?
napplecomputer
0
1.2k
Photo Pickerを触って比較してみた
napplecomputer
0
2.3k
Android Qのストレージの話
napplecomputer
3
1.2k
Wi-Fi RTTによる屋内測位アプリを作ろう
napplecomputer
5
18k
Other Decks in Technology
See All in Technology
平文パスワードはログに“残り” ── 肝心の侵入は“痕跡すら残らない”
kuroneko13
0
130
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
12
85k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
77k
8bit CPU 2026
koba789
7
2.9k
1000⼈規模のClaude Enterprise運⽤を「Oktaのグループ」と「Slack」に集約する
sansantech
PRO
0
390
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.5k
OAuth SPIFFE Client Authentication(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
270
Introduction to Bill One Development Engineer
sansan33
PRO
0
470
Kiro WebとCloud Sessions
nagisa53
2
200
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3.2k
Windows の互換機能 - 古いプログラムはなぜ動作できるのか
murachiakira
PRO
0
100
巨大気象データと戦う ― サロゲートモデル学習を高速化する圧縮技術
gpuunite_official
0
270
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
550
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
The Language of Interfaces
destraynor
162
27k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
エンジニアに許された特別な時間の終わり
watany
108
250k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
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.