起動プロファイルを作成する

起動プロファイルはベースライン プロファイルのサブセットです。起動プロファイルは、ビルドシステムによって使用され、APK の DEX ファイル内のコードのレイアウトを改善することで、そこに含まれるクラスとメソッドをさらに最適化します。起動プロファイルを使用すると、アプリの起動は通常、ベースライン プロファイルのみを使用する場合よりも 15 ~ 30% 高速になります。

図 1. DEX レイアウトの最適化によるコードの局所性の改善

要件

次のツールでスタートアップ プロファイルを使用することをおすすめします。

  • Jetpack Macrobenchmark 1.2.0 以降
  • Android Gradle プラグイン 8.2 以降
  • Android Studio Iguana 以降

また、アプリには次の設定が必要です。

  • R8 が有効になっています。リリースビルドでは、isMinifyEnabled = true を設定します。
  • DEX レイアウトの最適化が有効になっています。アプリ モジュールのビルドファイルの baselineProfile {} ブロックで、dexLayoutOptimization = true を設定します。

起動プロファイルを作成する

デフォルトのベースライン プロファイル ジェネレータ テンプレートを使用すると、Android Studio はベースライン プロファイルとともにスタートアップ プロファイルを作成します。

起動プロファイルを作成して生成する一般的な手順は、ベースライン プロファイルを作成する手順と同じです。

起動プロファイルを作成するデフォルトの方法は、Android Studio 内のベースライン プロファイル ジェネレータ モジュール テンプレートを使用することです。これには、基本的な起動プロファイルを形成する起動インタラクションが含まれます。この起動プロファイルにクリティカル ユーザー ジャーニー(CUJ)を追加するには、アプリの起動 CUJ を includeInStartupProfiletrue に設定された rule ブロックに追加します。シンプルなアプリの場合は、アプリの MainActivity を起動するだけで十分です。複雑なアプリの場合は、ホーム画面からアプリを起動する、ディープリンクに移動するなど、アプリの最も一般的なエントリ ポイントを追加することを検討してください。

次のコード スニペットは、ホーム画面からアプリを起動してディープリンクに移動する処理を含むベースライン プロファイル ジェネレータ(デフォルトでは BaselineProfileGenerator.kt ファイル)を示しています。ディープリンクは、アプリのホーム画面ではなく、アプリのニュース フィードに直接移動します。

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val rule = BaselineProfileRule()

    @Test
    fun generate() {
        rule.collect(
            packageName = "com.example.app",
            includeInStartupProfile = true
        ) {
            // Launch directly into the NEWS_FEED.
            startActivityAndWait(Intent().apply {
                setPackage(packageName)
                setAction("com.example.app.NEWS_FEED")
            })
        }
    }
}

アプリのベースライン プロファイルを生成する構成を実行し、src/<variant>/generated/baselineProfiles/startup-prof.txt でスタートアップ プロファイル ルールを見つけます。

起動プロファイルを作成する際の考慮事項

起動プロファイルを作成する際にどのユーザー ジャーニーをカバーするかを決めるには、ほとんどのユーザーがアプリを起動する場所を検討します。通常、ランチャーからログインした後に起動されます。これは最も基本的なベースライン プロファイル ジャーニーでもあります。

最初のユースケースが完了したら、アプリの起動に関するユーザー ファネルに沿って進めます。多くの場合、アプリの起動ファネルは次のリストに沿って進みます。

  1. メイン ランチャー アクティビティ
  2. アプリの起動をトリガーする通知
  3. オプションのランチャー アクティビティ

このリストの上から順に処理し、classes.dex がいっぱいになる前に停止します。後で他のジャーニーをカバーするには、スタートアップ パスからコードを移動して、ジャーニーを追加します。コードを起動パスから移動するには、アプリの起動中に Perfetto トレースを検査し、実行時間の長いオペレーションを探します。また、メソッド トレースを有効にしたマクロベンチマークを使用して、アプリの起動時のメソッド呼び出しの自動化された完全なビューを取得することもできます。