起動プロファイルはベースライン プロファイルのサブセットです。ビルドシステムは起動プロファイルを使用して、APK の DEX ファイル内のコードのレイアウトを改善することで、含まれるクラスとメソッドをさらに最適化します。起動プロファイルを使用すると、ベースライン プロファイルのみを使用する場合よりも、アプリの起動が最大 15% 速くなります。
要件
起動プロファイルは、次のツールで使用することをおすすめします。
- Jetpack Macrobenchmark 1.2.0 以降
- Android Gradle プラグイン 8.2 以降
- Android Studio Iguana 以降
また、アプリで次の設定を行う必要があります。
- R8 が有効になっている。リリースビルドの場合は、
isMinifyEnabled = true
を設定します。 - DEX レイアウトの最適化が有効になっています。アプリ モジュールのビルドファイルの
baselineProfile {}
ブロックで、dexLayoutOptimization = true
を設定します。
スタートアップ プロファイルを作成する
Android Studio では、デフォルトのベースライン プロファイル ジェネレータ テンプレートを使用すると、ベースライン プロファイルとともに起動プロファイルが作成されます。
起動プロファイルを作成して生成する一般的な手順は、ベースライン プロファイルを作成する場合と同じです。
起動プロファイルを作成するデフォルトの方法は、Android Studio 内からベースライン プロファイル ジェネレータ モジュール テンプレートを使用することです。これには、基本的な起動プロファイルを形成する起動インタラクションが含まれます。このスタートアップ プロファイルにクリティカル ユーザー ジャーニー(CUJ)を追加するには、includeInStartupProfile
を true
に設定した 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 レイアウトの最適化には関与しません。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- ベースライン プロファイルを作成する {:#creating-profile-rules}
- ベースライン プロファイル {:#baseline-profiles}
- Microbenchmark を作成する