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

起動プロファイルは、ベースライン プロファイルのサブセットです。起動プロファイルは、ビルドシステムによって使用され、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)で拡張するには、rule ブロックにアプリの起動 CUJ を追加します。includeInStartupProfiletrueシンプルなアプリの場合は、 アプリの 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
        ) {
            uiAutomator {
                // Launch directly into the NEWS_FEED using startActivityIntent
                startIntent(Intent().apply {
                    setPackage(packageName)
                    setAction("com.example.app.NEWS_FEED")
                })
            }
        }
    }
}

[Generate Baseline Profile for app] 構成を実行し、 起動プロファイル ルールを src/<variant>/generated/baselineProfiles/startup-prof.txtで見つけます。

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

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

最初のユースケースをカバーしたら、アプリの起動のユーザー ファネルに従います。多くの場合、アプリの起動ファネルは次のリストに従います。

  1. メイン ランチャー アクティビティ
  2. アプリの起動をトリガーする通知
  3. 省略可能なランチャー アクティビティ

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