Tabelog Tech Blog

食べログの開発者による技術ブログです

GradleProfilerとBaselineProfileを導入した話

この記事は 食べログアドベントカレンダー2024 の8日目の記事です🎅🎄

こんにちは。
食べログシステム本部 アプリ開発部 基盤チームのtomotakasgです。
Androidアプリのリファクタリングや開発環境の整備、ライブラリ選定等の業務を担当しています。

今回は表題の通り、2つのツールについての概要と使用例の紹介とさせていただきます。

ビルド速度と起動時間の改善を行う

ビルド速度の改善(GradleProfiler)と、アプリ起動時間の改善(BaselineProifile)を業務で実施しました。
基本通りの使い方をしただけですが、改善効果が出たため紹介します。

Gradle Proflierとは

Gradleのビルド時間を調べるコトができます。
Gradleビルドのパフォーマンスを検証して、ベンチマークを測定するためのツールです。

目的

ビルド実行時間を少しでも改善させる。

利用方法

  1. gradle-profiler導入
  2. シナリオファイル作成
  3. 実行

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)を行うと、起動の最適化、インタラクション ジャンクの削減、エンドユーザーの全体的なランタイム パフォーマンスの向上がアプリの初回起動時から可能になります。

目的

アプリ起動時間のパフォーマンスを改善する(スプラッシュからトップ画面表示までの時間)

利用方法

  1. 公式サイト内「ベースライン プロファイル モジュールをセットアップする」を実施しbaselineprofileモジュールを作成します。※詳細は省きます。
  2. 生成されたクラス(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..->を実行し、assetsdexopt配下にファイルが生成されています。

注意点

releaseビルド時の時間が伸びる

弊社は10分前後のビルド時間が伸びました。
baselineProfile作成のためのテストがGMD(Gradle Managed Devices)で実行されるためです。

BuildVariantが増えている

各variantの先頭にはnonMinifiedbenchmarkが付いたものが生成されます。
また、~/src/nonMinifiedRelease~/src/benchmarkReleaseが加えられています。
基本的に触ることはないですが、突然フォルダが増えているので認識しておきましょう。

原因はこちらが関係していると思われます。

まとめ

以上が、GradleProfilerとBaselineProfileの概要と導入方法です。
至ってシンプルな実装と作業で起動時間は改善しました。

まだ導入していない、導入検討しているプロダクトは、とりあえずやってみるで実施してみても良いと思います。

明日は 齋野さんの「食べログのデータ基盤にdbtを導入している話」ですー

採用情報ページ

食べログではエンジニアを募集しています!
もし、食べログにご興味を持っていただけた方は是非下記の採用情報ページをチェックしてみて下さい!