この記事は 食べログアドベントカレンダー2024 の8日目の記事です🎅🎄
こんにちは。
食べログシステム本部 アプリ開発部 基盤チームのtomotakasgです。
Androidアプリのリファクタリングや開発環境の整備、ライブラリ選定等の業務を担当しています。
今回は表題の通り、2つのツールについての概要と使用例の紹介とさせていただきます。
ビルド速度と起動時間の改善を行う
ビルド速度の改善(GradleProfiler)と、アプリ起動時間の改善(BaselineProifile)を業務で実施しました。
基本通りの使い方をしただけですが、改善効果が出たため紹介します。
Gradle Proflierとは
Gradleのビルド時間を調べるコトができます。
Gradleビルドのパフォーマンスを検証して、ベンチマークを測定するためのツールです。
目的
ビルド実行時間を少しでも改善させる。
利用方法
- gradle-profiler導入
- シナリオファイル作成
- 実行
gradle-profiler導入
READMEに書いてありますが、他のinstall方法はあります。
ここではbrewで実行します。
brew install gradle-profiler
シナリオファイルを準備
プロダクト配下<root-project>
のgradle
フォルダの下にscenarios.txt
を作ります。
以下、scenarios.txtの例です。
現在使用しているPCスペックや設定したい内容に応じて適宜項目をカスタマイズできる形になっています。
clean_build { tasks = [":android_tabelog_app:assembleDebug"] cleanup-tasks = ["clean"] } clean_build_2gb_2workers { tasks = [":android_tabelog_app:assembleDebug"] gradle-args = ["--max-workers=2"] jvm-args = ["-Xmx2048m"] cleanup-tasks = ["clean"] } clean_build_parallelGC { tasks = [":app:assembleDebug"] jvm-args = ["-XX:+UseParallelGC"] cleanup-tasks = ["clean"] }
自分のPCのスペックを把握
自分のPC(Apple M2 Pro)は32G,12コア(ワーカー)でした。
PCのスペックを基準にシナリオを考えるといいと思います。
$ sysctl -n hw.memsize | awk '{print $1/1024/1024/1024 " GB"}' 32 GB $ sysctl -n hw.ncpu 12
実行
gradle-profiler --benchmark --project-dir . --scenario-file ./gradle/scenarios.txt
htmlファイルが生成されるので、そちらを確認してパフォーマンスが良くなりそうなシナリオの設定をgradle.properies
に加えると良いと思います。
以上です。出力は基本統計量が利用されているため、見方には注意してください。
BaselineProfileとは?
公式サイト内ベースライン プロファイルの概要の通り、ベースラインプロファイルは、アプリインストール時に行われるプリコンパイルを最適化するためのファイルです。
これを利用することで初回起動時などのパフォーマンスが改善されます。
少し小難しいので引用します。
ベースライン プロファイルとともにアプリやライブラリをリリースすることで、Android ランタイム(ART)は、事前(AOT)コンパイルによって、指定されるコードパスを最適化し、すべての新規ユーザー、すべてのアプリ アップデートでパフォーマンスを改善できます。このプロファイルに基づく最適化(PGO)を行うと、起動の最適化、インタラクション ジャンクの削減、エンドユーザーの全体的なランタイム パフォーマンスの向上がアプリの初回起動時から可能になります。
目的
アプリ起動時間のパフォーマンスを改善する(スプラッシュからトップ画面表示までの時間)
利用方法
- 公式サイト内「ベースライン プロファイル モジュールをセットアップする」を実施し
baselineprofile
モジュールを作成します。※詳細は省きます。 - 生成されたクラス(StartupBenchmarks)を適宜修正する。
環境構築(公式セットアップ)補足
弊社は以下の環境で実施しています。
- Android Studio Koala | 2024.1.1 Patch 1
- Android Gradle Plugin 8.4.2
KalaではBaselineProfileモジュールの生成を
File->NewModule->Baseline Profile Generator
から生成します。
Koala以前のAndroid Studioのバージョンによって、UIが違ったり、そもそも生成できなかったりする可能性がありますのでお気をつけください。
baselineモジュールに自動生成されたクラスに修正を加える
StartupBenchmarks
を修正します。
テストはCompilationModeで区分しており、基本的にはPartial
とBaselineProfileModeを適用したPartial
を比較すれば良いと思います。
必要に応じてテストケースを追加してください。
StartupBenchmarks
のテストクラスを実行することで、それぞれのアプリ起動速度の計測にも利用することが出来ます。
@Test fun startupCompilationPartial() = benchmark(CompilationMode.Partial()) @Test fun startupCompilationFull() = benchmark(CompilationMode.Full()) @Test fun startupCompilationBaselineProfiles() = benchmark(CompilationMode.Partial(BaselineProfileMode.Require))
baselineProfileの自動で適用する
automaticGenerationDuringBuild = true
を指定することで、ベースラインプロファイルを自動生成できるようになります。
単純に導入した場合、毎回テスト実行するようになるため実行時間がかかるようになります。
日々の開発に支障が出るため、variantやflavorを使って指定すると良いです
debugビルド等も、本番同様のビルドで確認した方がいいと思うため迷いますが、
ビルド時間を早くしたい時に以下のようにbaselineProfileをrelease
ビルドのみに指定することもできます。
こちらを参考に以下のような記述を入れるといいと思います。
mainモジュール/build.gradle
baselineProfile { variants { release { automaticGenerationDuringBuild = true saveInSrc = false } } }
以上です。
弊社は20%程度のアプリ起動速度の改善ができました。
baselineProfileの確認方法
baselineProfileが適応されているかの確認方法は以下のようになります。
Android StudioのBuild->Analyze Apks..->
を実行し、assets
のdexopt
配下にファイルが生成されています。
注意点
releaseビルド時の時間が伸びる
弊社は10分前後のビルド時間が伸びました。
baselineProfile作成のためのテストがGMD(Gradle Managed Devices)で実行されるためです。
BuildVariantが増えている
各variantの先頭にはnonMinified
とbenchmark
が付いたものが生成されます。
また、~/src/nonMinifiedRelease
と~/src/benchmarkRelease
が加えられています。
基本的に触ることはないですが、突然フォルダが増えているので認識しておきましょう。
原因はこちらが関係していると思われます。
まとめ
以上が、GradleProfilerとBaselineProfileの概要と導入方法です。
至ってシンプルな実装と作業で起動時間は改善しました。
まだ導入していない、導入検討しているプロダクトは、とりあえずやってみるで実施してみても良いと思います。
明日は 齋野さんの「食べログのデータ基盤にdbtを導入している話」ですー
採用情報ページ
食べログではエンジニアを募集しています!
もし、食べログにご興味を持っていただけた方は是非下記の採用情報ページをチェックしてみて下さい!