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
大規模Androidアプリ開発を支えるデリバリー - ビルド時間長期化への立ち向かい方
Search
gree_tech
PRO
October 17, 2025
Technology
480
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
大規模Androidアプリ開発を支えるデリバリー - ビルド時間長期化への立ち向かい方
GREE Tech Conference 2025で発表された資料です。
https://techcon.gree.jp/2025/session/TrackC-4
gree_tech
PRO
October 17, 2025
More Decks by gree_tech
See All by gree_tech
AI画像認識を活用したゲーム内決済処理検証の自動化
gree_tech
PRO
0
790
長期運営で肥大化したExcelマスターデータの解消に向けた移行事例
gree_tech
PRO
0
810
ゲームにおけるメディアミックス展開との向き合い方 -ヘブンバーンズレッドのメディアミックス企画の立て方-
gree_tech
PRO
0
830
課題発見から始めるプロダクト密着型TA組織立ち上げ 〜小規模TAチームが3Dアセットの生産性を倍にした方法〜
gree_tech
PRO
0
840
属人化を叩き割れ!「制作加速」と「安定化」の矛盾を打破する:8年目プロダクトが辿り着いた「ミスが起こり得ない」アセット制作フローの全貌
gree_tech
PRO
0
790
20年続く長寿タイトルが、15年目にして売上を伸ばせた理由
gree_tech
PRO
0
1.3k
我々はどう生きるか
gree_tech
PRO
2
1k
変わるもの、変わらないもの :OSSアーキテクチャで実現する持続可能なシステム
gree_tech
PRO
0
5.4k
マネジメントに役立つ Google Cloud
gree_tech
PRO
0
110
Other Decks in Technology
See All in Technology
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
2
560
その指示、Bobにしっかり伝わってる?初心者でも即実践できる プロンプト/コンテキスト設計のコツ
muehara
1
160
ペアプロの価値はコードを書くことだけじゃない
codmoninc
PRO
0
110
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
0
180
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
420
生成AIのテナント制御とシャドーMCP対策 | AIを"止めずに"、情報を守る
yukun
0
120
書籍『生成AIの安全性入門』の入門
wataoka
0
220
コスト最適化の「めんどくさい」を AWS FinOps Agent でチョット楽にする
classmethod_kaz
0
240
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
150
Where Is JetBrains AI Heading- — Central CLI, Air Alpha, and the Agentic Development Stack
x5gtrn
PRO
0
130
データエンジニアの困りごとをDevinと一緒に解消する
10xinc
2
830
AI-DLCって実際どう? 〜聞きたいこと全部聞いてみる〜
news_it_enj
0
230
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Un-Boring Meetings
codingconduct
0
410
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
How GitHub (no longer) Works
holman
316
150k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
How STYLIGHT went responsive
nonsquared
100
6.3k
The Pragmatic Product Professional
lauravandoore
37
7.4k
How to Talk to Developers About Accessibility
jct
2
540
Transcript
大規模Androidアプリ開発を支える デリバリー ビルド時間長期化への立ち向かい方 REALITY株式会社 エンジニア 小宮光滋
Komiya Mitsushige 2014年にグリー株式会社(現:グリーホールディ ングス株式会社)へ入社。 株式会社WFSでモバイルゲームのクライアント開 発を経た後、REALITY株式会社にジョイン。 Android開発を中心に携わり現在はテックリードを 務めている。 REALITY株式会社 エンジニア
2 REALITY上の姿 リアルワールド上の姿
目次・アジェンダ • REALITYについて • ビルド処理の様々なプロファイリング方法 • 見えてきたREALITYでの課題 • 一般的な最適化の方法 •
REALITY固有の問題への対応 • 全体のビルド時間推移とまとめ 3
目次・アジェンダ • REALITYについて • ビルド処理の様々なプロファイリング方法 • 見えてきたREALITYでの課題 • 一般的な最適化の方法 •
REALITY固有の問題への対応 • 全体のビルド時間推移とまとめ 4
REALITYについて 5
6 自分好みのアバターで ライブ配信 • 2018年8月リリースの バーチャルライブ配信アプリ • 今年の8月で7周年を 迎えました🎉
実はピュアUnity製ではない作り 7
実はピュアUnity製ではない作り 8
積み重なった7年以上の歴史 • 運用年月により積み重なった数多くの画面・機能が存在する ◦ 配信・視聴 ◦ チャット ◦ フィード投稿などなど…… •
日々膨れ上がるコードベース • モジュール数は89個 • Kotlinの行数は約31万行 • 依存ライブラリは約200個 9
長くなっていくビルド時間 場合によっては 1時間以上かかることも! 10
なんとかしよう 11
⚠ Caution • 一般的な改善手法の紹介も含みますが、一方でREALITYアプリ内での限 定的な内容が含まれる可能性があります • Androidアプリのビルドパイプラインに関わる方を対象とする関係上、 Gradleとは何か?などの一般的なツールの説明については含まれない場合 があります 12
Androidビルド環境について • Gradle 8.14.3 + AGP 8.12.1 • CI/CDはGitHub Actionsで実行
• 開発・QA用アプリはFirebase AppDistributionで配布 13
目次・アジェンダ • REALITYについて • ビルド処理の様々なプロファイリング方法 • 見えてきたREALITYでの課題 • 一般的な最適化の方法 •
REALITY固有の問題への対応 • 全体のビルド時間推移とまとめ 14
ビルド処理の様々なプロファイリング方法 15
CI Analyzerによる GitHub Actions Workflow の情報収集と可視化 • CIサービスからビルドデータを 収集するOSSツール •
GitHub Actionsで稼働 • データはBigQueryに収集 • Looker Studioで可視化 • ビルド時間の推移を可視化出来る 16
Actions Runnerの マシンリソース使用率の 可視化 • catchpoint/workflow-telemetry- action • yamlに数行追加でSummary上に マシンのメトリクスを可視化
• CPU / Memory / IOを グラフで可視化してくれる • ログを入れるよりもラク 17
Gradle Build Scan • Gradleビルドメタデータの収集 • 各タスクレベルに分割して タイムライン可視化 • 各タスクのキャッシュヒット
キャッシュミスなど細かい 分析が可能 • 詳細分析にはこれがおすすめ 18
目次・アジェンダ • REALITYについて • ビルド処理の様々なプロファイリング方法 • 見えてきたREALITYでの課題 • 一般的な最適化の方法 •
REALITY固有の問題への対応 • 全体のビルド時間推移とまとめ 19
見えてきたREALITYの課題 20
以下に時間がかかっている傾向がある • R8によるminify ◦ 充分なヒープがあるにもかかわらず、処理時間が安定していない ◦ ビルドごとによって振れ幅が大きい ◦ R8だけで6m ~
1hも振れ幅がある • Protocol Buffersからのコード生成・コンパイル時間 • 外部ライブラリ関係のDexファイルの処理 21
原因は見えてきた 22
なにはともあれ 一般的な最適化からやってみよう 23
Android公式には ビルド速度最適化ガイド が存在する • おすすめの手法 • ビルド構成最適化のヒント • 速度改善のための一般的な プロセスの紹介
などなど 24
目次・アジェンダ • REALITYについて • ビルド処理の様々なプロファイリング方法 • 見えてきたREALITYでの課題 • 一般的な最適化の方法 •
REALITY固有の問題への対応 • 全体のビルド時間推移とまとめ 25
一般的な最適化の方法 26
Gradle Configuration Cache • Gradleの構成フェーズをキャッシュ化するもの • GitHub Actions上で適切に使うにはコツがいる(後述) • ⇒約32%のビルド時間削減(Releaseビルド,
キャッシュヒット時) 27
setup-gradle actionsでのキャッシュ保存 • Gradle ユーザーホームディレクトリの重要な部分をキャッシュ • setup-gradleを使ったビルドやテスト処理を回しキャッシュを更新 • キャッシュの使用状況の詳細なレポートも出してくれる •
GitHub ActionsのCacheは10GB制限なので注意 • Configuration Cacheも保存出来るが、利用に暗号化キーの設定が必要 28
actions/cacheによるbuild dirキャッシュ • setup-gradleで保存されない部分をキャッシュ • 特にGradleのConvention Pluginを採用している場合、該当モジュールの buildディレクトリが無いとConfiguration Cacheを再利用できないこと がある
29
Gradle Remote Cacheについて • GCSやAWS S3でRemote Cacheを ホスト出来る • 単純に使うだけではビルド時間は
逆に長くなってしまった ◦ キャッシュファイルの ネットワークIOコストが掛かる • うまく運用できている方いたら 是非お話しましょう 30
JVM heap/metaspaceの最適化 • VisualVMを用いてローカル環境での使用量チェック • そこから大まかに見積もってheap/metaspaceサイズを決める 31
Parallel GC利用 • GCはデフォルトのG1GCからParallel GCに変更 (-XX:+UseParallelGC) ◦ G1GCは大規模メモリ向けで低遅延 ◦ Parallel
GCはスループット重視 • REALITYでのアプリビルドではParallel GCの方が速度面で優秀 • ⇒ Debugビルドは約27.2% • ⇒ Releaseビルドは約7.5%のビルド時間削減 32
kaptの廃止(DataBindingの廃止) • kaptはJava スタブを生成するコストがある • 古い機能などはDataBinding実装のものが残っていた • まずViewBinding化、少しずつJetpack Compose化 •
あまり削減は出来なかったが レガシーコードの改善という点でも有用 33
GitHub Actions Larger Runner • 強いマシンは早い • ubuntu-latest-16coreマシンを利用 • マルチコアスケールするようにGradleの並列ビルド設定を忘れずに
• worker数はデフォルトを利用(プロセッサ数と同じworker数) • 強いマシンはRAMも多く、特にGradleビルドでは恩恵が大きい • 特に前述のJVMヒープ調整もやりやすくなる 34
目次・アジェンダ • REALITYについて • ビルド処理の様々なプロファイリング方法 • 見えてきたREALITYでの課題 • 一般的な最適化の方法 •
REALITY固有の問題への対応 • 全体のビルド時間推移とまとめ 35
REALITY固有の問題への対応 36
時間がかかっている処理おさらい • R8 ⇐!!特に時間がかかっている!! ◦ 処理時間が安定しておらず、ビルドによって振れ幅が大きい ◦ R8だけで6m ~ 1hも振れ幅がある
• Protocol Buffersからのコード生成・コンパイル時間 • 外部ライブラリ関係のDexファイルの処理 37
R8に立ち向かう 38
R8は難しい • もともと処理時間がかかる • 公式ではビルド速度やデバッグの観点から 必要なとき以外は実行しないように言及されている • 時折長期化することがGoogle Issue Trackerにも数多く挙げられている
39
せめて処理時間を安定させたい 40
runInSeparateProcess 41 • R8実行プロセスを Gradleデーモンから分離する • ヒープサイズをGradleデーモンと は別で割り当てられる • rootのsettings.gradle.ktsに設定
• ⇒ 処理時間は6~10min程度に安定 ⇒ 90%近い処理時間削減
どうにもならなくなったら • runInSeparateでもダメな場合、ヒープサイズやマシンスペックが 追いついていない可能性がある • コストの兼ね合いで強いRunnerを使えないこともある • Debugビルドを活用し、QAやリリース前検証など、 本当に必要な場合にのみReleaseビルドを利用することを検討しよう 42
Protocol Buffers由来の コード生成やコンパイルについて 43
大量の.protoと生成コード、乗らないキャッシュ • REALITYではWebAPI req/resをProtocol Buffersでシリアライズ • 実装でKotlin DSLを使っているためJava / Kotlin双方生成している
• 生成ファイル数が多く、特にKotlinのコンパイルに時間がかかる • 注意深く見ていくと、キャッシュヒットがほとんどないことがわかった 44
Gradle Cache Keyについて • org.gradle.caching.debug=true指定すると Task毎のキャッシュキーの計算過程をログ出力出来る • キャッシュ生成/利用時のTaskで計算過程がどこでズレるかチェック 45
Gradle Cache Keyについて • 今回はGradle Build Scanの有無でinputArtifactsやcompilerOptionsの 入力が異なっており、結果キャッシュキー計算が変化してヒットしていな いことが分かった ◦
つまり分析時のみキャッシュヒットしにくい状況になってしまっていた…… • Build Scan向けにもキャッシュを作ることで解決 • ⇒ キャッシュヒット時は約93%の処理時間削減 ⇒ ただ分析中のみの劣化であり、あまり実感につながるものではない 46
外部ライブラリ関係のDexファイルの処理 47
Dexファイルとは • Dalvik 実行可能ファイルの略 • 大雑把にまとめるとJava(Kotlin)ファイルをAndroid環境で実行可能な 形式に変換圧縮したもの • 外部ライブラリ関係のdexをまとめる処理に時間がかかる •
=> 外部ライブラリが多い! 48
外部ライブラリが多い! • 色々ライブラリが残ってしまっている状態があった • LiveDataなどの古い実装由来のもの • 画像表示ライブラリ、通信ライブラリなど 複数の選択肢があり混在して投入されそのままになっているもの • Material
Design 2/3 • やむなく複数バージョンを共存させているもの(JUnit4, 5など) 49
ライブラリ移行にAI Code Agentが有効 • 移行事例のサンプルがあると AIに真似させやすい • 定型的であるとより効果的に 機能する •
自立してイテレーションを回すために 単体テスト環境が充実していることが 望ましい 50
コードを減らす取り組み • 改善Week ◦ 先送りされがちな改善項目にフォーカスする一週間 ◦ ライブラリアップデートや移行などもよく行われる • REALITYダイエット計画 ◦
未使用機能・使用率の低い機能を消していく取り組み ◦ 2〜3000行ほどのコード削減 • まだまだ改善の余地はあり、頑張っています • こうした取り組みに興味がある方は是非、 この後のアスクザスピーカーなどでお話出来ればと思います 51
目次・アジェンダ • REALITYについて • ビルド処理の様々なプロファイリング方法 • 見えてきたREALITYでの課題 • 一般的な最適化の方法 •
REALITY固有の問題への対応 • 全体のビルド時間推移とまとめ 52
全体のビルド時間推移とまとめ 53
ビルド時間全体の推移 54
まとめ 1/2 • Gradle Taskレベルのプロファイリングには Gradle Build Scanがおすすめ • 一般的な改善策としてはGC選択、ヒープ調整、スペックアップが
導入しやすい • Gradle Configuration Cacheはクセがあるので注意 • R8で問題があったらrunInSeparateProcessを試す • キャッシュヒットしない場合はデバッグオプションで調査 • 依存するライブラリは可能な限り減らしていく 55
まとめ 2/2 • ビルド速度の最適化手法は多岐に渡り、GradleやCI/CD環境など アプリロジックの実装とは系統の異なる知識を求められる • 一方、可視化の道具や一般的な最適化手法はある程度まとまっており、 出来る範囲から段階的に進めていきやすい側面もある • 迅速に成果が出てこないこともあり、粘り強く改善の取り組みを
続けていくことが重要 56
ご清聴ありがとうございました 57
None