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 週間で改善が若干低下する可能性があります。ただし、ベースライン プロファイルを使用すると、他の 最適化に加えて、パフォーマンスが大幅に向上します。

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