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

起動プロファイルはベースライン プロファイルのサブセットです。起動プロファイルを使用 クラスとメソッドをさらに最適化するために、 APK の DEX ファイル内のコードのレイアウトを改善します。起動プロファイルを使用すると ベースラインと比べてアプリの起動が通常 15% ~ 30% 速くなる プロフィールのみ。

<ph type="x-smartling-placeholder">
</ph>
図 1.DEX レイアウトの最適化によるコードの局所性の改善

要件

起動プロファイルは次のツールで使用することをおすすめします。

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

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

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

スタートアップ プロファイルを作成する

ベースライン プロファイルとともに起動プロファイルも作成される: デフォルトのベースライン プロファイル ジェネレータ テンプレートを使用してください。

スタートアップ プロファイルを作成して生成する一般的な手順は、 ベースライン プロファイルを作成します。

起動プロファイルを作成するデフォルトの方法は、ベースライン プロファイルを使用することです。 Android Studio 内からジェネレータ モジュール テンプレートを開きます。これには起動や 基本的な起動プロファイルを形成するインタラクションです。この起動プロファイルを補強するため クリティカル ユーザー ジャーニー(CUJ)が多い場合は、アプリ起動の CUJ を rule に追加します。 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
        ) {
            // 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 が以下であることを確認してください。 表示されます。アプリが単一の DEX ファイルで構成されている場合は、 起動プロファイルを有効にした後、アプリに 2 つの DEX ファイルが含まれているかどうか。

起動クラスが 1 つの DEX ファイルに収まらない場合、Android Studio は警告を表示します。 診断情報(起動以外の方法の数を含む)を取得するには、 場合、R8 コンパイラがバージョン 2.0 以降のバージョンに 8.3.36-dev バージョンの settings.gradle ファイルを 起動プロファイルを適用します。

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"
        }
    }
}

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

./gradlew assembleRelease --info

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

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

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

起動プロファイルのクラスとメソッドの出力は、 最初の classes.dex ファイルですつまり、すべてのベースライン プロファイル ジャーニーが起動プロファイル ジャーニーである必要はありません。

起動プロファイルの作成時にカバーするユーザー ジャーニーを決定する際は、以下を考慮してください。 ほとんどのユーザーがアプリケーションを開始する場所です。通常はランチャーから行います 表示されなくなります。これは最も基本的なベースライン プロファイルでもあります。 取り組みます。

最初のユースケースをカバーしたら、アプリのユーザー ファネルをたどる 表示されます。多くの場合、アプリの起動ファネルは次のようになります。

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

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