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

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

図 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)を追加するには、includeInStartupProfiletrue に設定した rule ブロックにアプリ起動の CUJ を追加します。単純なアプリでは、アプリの 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")
            })
        }
    }
}

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

起動プロファイルの最適化を確認する

DEX レイアウトが最適化されていることを確認するには、Android Studio を使用して APK を開き、DEX ファイル内のクラスを検証します。プライマリ classes.dex が完全に入力されていないことを確認してください。アプリが 1 つの DEX ファイルで構成されている場合は、起動プロファイルを有効にした後、アプリに 2 つの DEX ファイルが含まれているかどうかを確認できます。

起動クラスが 1 つの DEX ファイルに収まらない場合、Android Studio は警告を表示します。起動クラス内の起動以外のメソッドの数を含む診断情報を取得するには、起動プロファイルを適用するときに settings.gradle ファイルに次の変更を加えて、R8 コンパイラをバージョン 8.3.36-dev 以降に更新してください。

Kotlin

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:8.3.6-dev")
        }
    }
}

Groovy

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url uri('https://storage.googleapis.com/r8-releases/raw')
            }
        }
        dependencies {
            classpath 'com.android.tools:r8:8.3.6-dev"
        }
    }
}

Gradle でビルドする場合は、次のコマンドで assembleRelease の後に --info を追加してください。

./gradlew assembleRelease --info

診断結果がターミナルに出力されます。

アプリまたはライブラリが非推奨 API を参照している場合、これらのクラスのバンドルされた互換性実装は常に、最後の DEX ファイルに含まれます。この脱糖された最後の DEX ファイルは、DEX レイアウトの最適化には関与しません。