スムーズで安定した、バッテリー効率の高いアプリ エクスペリエンスを実現するには、安定性、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 のサイズを縮小し、ランタイム パフォーマンスを向上させます。