Android カレンダー チームがベースライン プロファイルを使用してアプリの起動とジャンクを改善した方法

ベースライン プロファイルを使用すると、一般的なユーザー ジャーニーの インタープリタとジャストインタイム(JIT)コンパイル の手順を行う必要がなくなるため、コード実行速度が最大 30% 向上します。ベースライン プロファイルでは、最適化するユーザー ジャーニーを選択できます。また、アプリの起動の改善、ジャンクの削減などにも役立ちます。これにより、ユーザーの継続率や評価など、ビジネス指標の改善につながります。詳しくは、ベースライン プロファイルをご覧ください。

Android カレンダー チームはベースライン プロファイルを実装し、アプリの 起動時間が約 20% 改善され、遅延またはフリーズしたフレームが約 50% 削減されました。パフォーマンスの向上を実現するためにチームが行ったエンドツーエンドの取り組みをご紹介します。ベースライン プロファイルの使用を決定した理由から、効果の測定方法まで。

クラウド プロファイルとベースライン プロファイル

Android カレンダー チームは、アプリに対する実際のユーザー操作に基づく別のプロファイルに基づく最適化(PGO)手法であるクラウド プロファイルをすでに使用していました。クラウド プロファイルとベースライン プロファイルの比較は次のとおりです。

プロファイル タイプ 設定 含まれるユーザー ジャーニー ユーザーベースが次の場合に最適 実現した効果 サポートされている Android バージョン

クラウド プロファイル

デフォルトで有効

実際のユーザーデータに基づいて自動的に選択

大

2、3 日以内

Android 9(API レベル 28)以降

ベースライン プロファイル

自分で構成

自分で選択

すべてのサイズ

即時

Android 7(API レベル 24)以降

Android カレンダー チームがベースライン プロファイルをコードベースに追加した主な理由の 1 つは、リリース サイクルを週単位に短縮したことです。 クラウド プロファイルはパフォーマンスを大幅に向上させますが、実際のユーザーデータの集計に依存するため、アプリのリリースから効果が最大になるまで 1 ~ 2 日 かかります。クラウド プロファイルにベースライン プロファイルを補完することで、次のアプリ バージョンがロールアウトされる前に、ユーザーが最高のパフォーマンス改善を体験できる時間を増やすことができます。

また、Android カレンダー チームは、プロファイルに含めるクリティカル ユーザー ジャーニー(CUJ)を具体的に選択できることが重要でした。これは、ベースライン プロファイルを使用して行うことができます。

通常、最高のパフォーマンスを得るには、デフォルトで有効になっているクラウド プロファイルに加えて、ベースライン プロファイルを使用することをおすすめします。

含まれるユーザー ジャーニー

Android カレンダー チームは、ベースライン プロファイルに次の 2 つの CUJ を含めることにしました。

  • スケジュール ビューでアプリを開く: 最初はデフォルトのビューであるため、アプリを初めて使用するユーザーやデフォルト設定を変更しないユーザー向けに 最適化することが重要です。
  • 月表示でアプリを開く: ユーザー データに基づいて、多くのユーザーが選択したビューです。ユーザーがアプリをどのように使用しているかをトラッキングするには、 Firebaseなどのツールを使用できます。

通常、ビジネスに収益をもたらす CUJ(該当する 場合)と、最も一般的な CUJ を追加する必要があります。最適化する CUJ の選択方法について詳しくは、含めるものをご覧ください。

実装

Android カレンダー チームは、 Jetpack Macrobenchmark ライブラリ の内部ラッパーを使用してベースライン プロファイルを生成し、内部ツールとの統合を容易にし、 一般的なスケーラビリティを実現しています。

スケジュール ビューでアプリを開くための Macrobenchmark テスト構成は次のとおりです。

@Test
fun generateProfile() =
    baselineProfileRule.collect(PACKAGE_NAME, includeInStartupProfile = true) {
        uiAutomator {
            startApp(packageName = PACKAGE_NAME)
            // Verify pre-existing recurring events and tasks are shown.
            // onElement waits for the element by default
            onElement { textAsString() == "Recurring event" }
            onElement { textAsString() == "Recurring task" }

            // Open drawer and verify selected view.
            onElement { contentDescriptionAsString() == "Show Calendar List and Settings drawer" }.click()
            onElement { contentDescriptionAsString() == "Schedule view, Selected" }
        }
    }

以下を置き換えます。

  • PACKAGE_NAME: ベースライン プロファイルを生成するアプリのパッケージ名。

管理されたリリースを使用して効果を測定する

ベースライン プロファイルは、同梱されている APK と密接に結合しており アプリの実行前に組み込まれるため、標準の A/B テストを実行して効果を把握することはできません。ただし、Android カレンダー チームは 管理されたリリースを使用して効果を正確に測定できました。これは、新しいアプリ バージョンをユーザーのサブセットにのみリリースし、以前のリリースと同様のバージョンを使用しているユーザーと比較 する方法です。

ベースライン プロファイルを使用すると、複数の領域で即座に大幅な 改善が見られました。これらの統計は、さまざまなデバイスとすべてのユーザー(スケジュール ビューと月表示で開始するユーザーは最も大きなメリットを得られますが、データベースからカレンダーデータを読み込むなどの共有プロセスの最適化により、他のユーザーもメリットを得られます)で集計されています。

  • インタラクティブなアプリの起動時間の中央値(最も一般的なシナリオ)が 775 ミリ秒から 644 ミリ秒に短縮(17%)
  • コールド スタート時間の中央値が 1,058 ミリ秒から 901 ミリ秒に短縮(15%)
  • ウォーム スタート時間の中央値が 453 ミリ秒から 378 ミリ秒に短縮(17%)
  • スケジュール ビューと月表示で、ジャンク フレームレートの中央値が 42 ~ 60% 減少

ベースライン プロファイルと組み合わせてクラウド プロファイルを使用すると、クラウド プロファイルが生成されるため、 最初の 1 週間で改善が若干低下する可能性があります。ただし、ベースライン プロファイルを使用すると、他の 最適化に加えて、パフォーマンスが大幅に向上します。

ツールと機能について詳しくは、次のリソースをご覧ください。