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
0
170
大規模Androidアプリ開発を支えるデリバリー - ビルド時間長期化への立ち向かい方
GREE Tech Conference 2025で発表された資料です。
https://techcon.gree.jp/2025/session/TrackC-4
gree_tech
PRO
October 17, 2025
Tweet
Share
More Decks by gree_tech
See All by gree_tech
変わるもの、変わらないもの :OSSアーキテクチャで実現する持続可能なシステム
gree_tech
PRO
0
2.6k
マネジメントに役立つ Google Cloud
gree_tech
PRO
0
28
今この時代に技術とどう向き合うべきか
gree_tech
PRO
3
2.4k
生成AIを開発組織にインストールするために: REALITYにおけるガバナンス・技術・文化へのアプローチ
gree_tech
PRO
0
180
安く・手軽に・現場発 既存資産を生かすSlack×AI検索Botの作り方
gree_tech
PRO
0
170
生成AIを安心して活用するために──「情報セキュリティガイドライン」策定とポイント
gree_tech
PRO
1
1.5k
あうもんと学ぶGenAIOps
gree_tech
PRO
0
280
MVP開発における生成AIの活用と導入事例
gree_tech
PRO
0
310
機械学習・生成AIが拓く事業価値創出の最前線
gree_tech
PRO
0
230
Other Decks in Technology
See All in Technology
Introduction to Bill One Development Engineer
sansan33
PRO
0
340
ルネサンス開発者を育てる 1on1支援AIエージェント
yusukeshimizu
0
130
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.5k
1万人を変え日本を変える!!多層構造型ふりかえりの大規模組織変革 / 20260108 Kazuki Mori
shift_evolve
PRO
5
620
SES向け、生成AI時代におけるエンジニアリングとセキュリティ
longbowxxx
0
290
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
59k
Claude Codeを使った情報整理術
knishioka
18
11k
#22 CA × atmaCup 3rd 1st Place Solution
yumizu
1
120
モノタロウ x クリエーションラインで実現する チームトポロジーにおける プラットフォームチーム・ ストリームアラインドチームの 効果的なコラボレーション
creationline
0
300
AIエージェントを5分で一気におさらい!AIエージェント「構築」元年に備えよう
yakumo
1
130
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
21k
AI時代のアジャイルチームを目指して ー スクラムというコンフォートゾーンからの脱却 ー / Toward Agile Teams in the Age of AI
takaking22
9
2.5k
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.4k
Believing is Seeing
oripsolob
0
19
So, you think you're a good person
axbom
PRO
0
1.9k
Being A Developer After 40
akosma
91
590k
How Software Deployment tools have changed in the past 20 years
geshan
0
31k
Documentation Writing (for coders)
carmenintech
77
5.2k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
360
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
590
Statistics for Hackers
jakevdp
799
230k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
77
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
180
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