アプリの最適化に関するベスト プラクティス

以下では、品質を損なうことなくアプリを最適化するためのベスト プラクティスを紹介します。

ベースライン プロファイルを使用する

ベースライン プロファイルにより、コードの実行速度が初回起動から 30% 短縮され、すべてのユーザー操作(アプリの起動、画面間の移動、コンテンツのスクロールなど)が初回実行よりも滑らかになります。アプリの速度と応答性を高めると、1 日あたりのアクティブ ユーザー数が増加し、平均リピーター率が高まります。

起動プロファイルを使用する

起動プロファイルはベースライン プロファイルに似ていますが、DEX レイアウトを最適化してアプリの起動を高速化するために、コンパイル時に実行されます。

App Startup ライブラリを使用する

App Startup ライブラリを使用すると、初期化の必要があるコンポーネントごとに個別のコンテンツ プロバイダを定義する代わりに、単一のコンテンツ プロバイダを共有するコンポーネント初期化子を定義できます。これにより、アプリの起動時間が大幅に短縮されます。

ライブラリを遅延読み込みする、または自動初期化を無効にする

アプリでは多数のライブラリを使用します。起動に不可欠なライブラリがある一方で、大半のライブラリは、最初のフレームが描画されるまで初期化を遅延しても構わない場合があります。一部のライブラリは、起動時の自動初期化を無効にするオプションや、オンデマンド初期化を備えています。こうしたオプションを使用すると、必要になるまで初期化を延期してパフォーマンスを向上させることができます。たとえば、オンデマンド初期化を使用し、必要なときにのみ WorkManager を呼び出すことができます。

ViewStub を使用する

ViewStub は、目に見えないゼロサイズの View であり、これを使用するとレイアウト リソースのインフレートを実行時に遅延できます。そうすることで、起動時に不要なビューのインフレートを遅らせることができます。

Jetpack Compose を使用している場合は、ステータス情報に基づいて一部のコンポーネントの読み込みを遅らせることで、ViewStub と同様の効果が得られます。

var shouldLoad by remember {mutableStateOf(false)}

if (shouldLoad) {
   MyComposable()
}

shouldLoad を変更して、条件ブロック内のコンポーザブルを読み込みます。

LaunchedEffect(Unit) {
   shouldLoad = true
}

これにより、最初のスニペットの条件ブロック内にあるコードを含む再コンポーズがトリガーされます。

スプラッシュ画面を最適化する

スプラッシュ画面はアプリ起動の大部分を占めます。適切に設計されたスプラッシュ画面を使用すれば、アプリ起動のエクスペリエンスを全体的に改善できます。Android 12(API レベル 31)以降には、パフォーマンスを向上させるために設計されたスプラッシュ画面があります。詳細については、スプラッシュ画面をご覧ください。

スケーラブルな画像を使用する

画像にはベクター型ドローアブルを使用することをおすすめします。それが不可能な場合は、WebP 画像を使用します。WebP は、ウェブ上の画像に対する高品質な可逆圧縮と非可逆圧縮が可能な画像形式です。既存の BMP、JPG、PNG、静的 GIF 画像は、Android Studio を使用して WebP 形式に変換できます。詳しくは、WebP 画像を作成するをご覧ください。

起動時に読み込む画像の数とサイズを最小限にするのも重要です。

Performance API を使用する

メディア再生用のパフォーマンス API は、Android 12(API レベル 31)以降で使用できます。この API を利用することで、デバイスの能力を把握して、それに応じたオペレーションを実行できるようになります。

コールド スタートアップのトレースを優先する

コールド スタートとは、アプリをゼロから起動することです。つまり、その時点ではシステムのプロセスがアプリのプロセスをまだ作成していません。デバイスが起動してから初めてアプリを起動する場合や、システムがアプリを強制停止した場合、通常、アプリはコールド スタートします。コールド スタートは非常に低速です。これは、他の起動タイプ(ウォーム スタートやホットスタートなど)では不要な処理がアプリとシステムで多数実行されるためです。コールド スタートアップのシステム トレースを行うことで、アプリのパフォーマンスをより正確に監視できます。