一般的なパフォーマンスの問題に対処する

スムーズで安定した、バッテリー効率の高いアプリ エクスペリエンスを実現するには、安定性、UI レンダリング、メモリ消費量、バックグラウンド処理、起動レイテンシ、ビルド最適化における一般的なパフォーマンスのボトルネックを特定して解決する必要があります。

このセクションのガイドでは、各タイプの問題の基盤となる Android プラットフォームの動作について説明し、Android Studio Profiler、Perfetto、Logcat、ApplicationExitInfo などのツールを使用して問題を診断、プロファイリング、修正する方法について説明します。

安定性

  • ANR: ブロックされた UI スレッド、メインスレッドの I/O、ロック競合、ブロードキャスト レシーバの遅延によって発生する ANR(アプリケーション応答なし)エラーを診断して修正します。
  • クラッシュ: スタック トレースを読み取り、Logcat の出力を検査し、未処理の例外とネイティブ シグナルを防ぎます。

レンダリングとスタートアップ

  • 遅いレンダリング: 高コストのレイアウト、バインドパス、メインスレッドの停止が原因で発生する、UI フレームのドロップまたはフリーズ(>16ms>700ms)を特定して修正します。
  • スロー セッション(ゲームのみ): SurfaceFlinger でフレーム ペーシングを測定し、Android Frame Pacing(Swappy)、Vulkan、Android Dynamic Performance Framework(ADPF)を使用してゲームのフレームレートを最適化します。
  • アプリの起動時間: コールド スタート、ウォーム スタート、ホットスタートの内部処理を理解し、初期表示までの時間(TTID)と完全表示までの時間(TTFD)を測定して、起動処理を最適化します。

メモリ管理

  • ローメモリ キラー(LMK): Android ローメモリ キラー デーモン(lmkd)が oom_adj_score を介してプロセスを優先順位付けし、Android Studio、Unity、Unreal Engine でメモリ使用量をプロファイリングする方法について説明します。
  • メモリ使用量(匿名 RSS + スワップ): フォアグラウンド、サービス、バックグラウンドの状態におけるアプリの匿名 Resident Set Size(RSS)とスワップ メモリ フットプリントを測定して削減します。
  • ビットマップ メモリ使用量: サイズが大きすぎるビットマップ割り当てやリークしたビットマップ割り当てを診断し、UI コンポーネントがバックグラウンドに移動したときにグラフィック バッファを解放します。

バッテリーとバックグラウンド処理

  • 過度の wake lock: 部分的な wake lock を長時間保持することを避け、バックグラウンド タスクを WorkManager または JobScheduler に移行します。
  • 停止した部分的な wake lock: 取得したすべての部分的な wake lock が、すべての実行パスとエラーパスで適切に解放されるようにします。
  • 過剰なウェイクアップ: 正確なアラーム ウェイクアップを減らし、スケジュールされたバックグラウンド作業をバッチ処理または延期します。
  • バックグラウンドでの過度の Wi-Fi スキャン: バックグラウンドでの Wi-Fi スキャンの頻度を最小限に抑え、パッシブまたはバッチ処理された位置情報と接続の API を使用します。
  • バックグラウンドでの過度のネットワーク使用量: WorkManager 制約を使用して、バックグラウンドでのモバイル ネットワーク転送をバッチ処理して遅延させます。
  • バッテリー使用量が多すぎる: CPU、センサー、無線アクティビティをプロファイリングして、モバイル デバイスと Wear OS デバイスのバッテリー消費量の多さを診断します。

権限とビルドの最適化

  • 権限の拒否: コンテキストに沿って実行時の権限をリクエストし、権限の根拠をユーザーに明確に説明します。
  • DEX コードの最適化: R8 の圧縮、難読化、最適化のルールを構成して、DEX のサイズを縮小し、ランタイム パフォーマンスを向上させます。