LASSIC Media らしくメディア
モバイルアプリのパフォーマンス改善を外注する進め方【起動時間/ANR】
LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託
この記事のポイント
- Android Vitalsでは起動時間(コールドスタート5秒・ウォームスタート2秒・ホットスタート1.5秒超)をパフォーマンス低下の目安として示しており、数値で外注スコープを定義できます
- ANR(Application Not Responding)の主因はメインスレッドのブロックにあり、非同期化・処理最適化のボトルネック特定には専門のプロファイリング知識が必要です
- 改善サイクルは「計測→ボトルネック特定→改善実装→再計測」の反復で、計測基盤の整備から委託するパターンが実務上の成果につながります
目次
モバイルアプリのパフォーマンスが事業に与える影響
モバイルアプリのパフォーマンス改善外注とは、起動時間の遅延・ANR(Application Not Responding、アプリ応答不可)・フレームレート低下などの速度・応答性に関わる課題を、専門のIT企業に委託して計測・特定・最適化する取り組みを指します。クラッシュ(アプリの強制終了)とは異なり、アプリが起動しているにもかかわらず遅い・固まるという体験品質の問題に特化した領域です。
起動遅延・ANR が離脱・ストア評価・ASO に及ぼす影響
アプリの起動が遅いと、ユーザーはアプリを開いて数秒以内に離脱します。Google Play のアプリ品質ガイドラインは、コアアプリの品質基準としてパフォーマンスの安定性を要件に挙げており*1、ANR やクラッシュの多いアプリはストアでの露出(ASO)にも影響する旨が示されています。
iOS においても、起動に時間がかかりすぎるとシステムのウォッチドッグタイマーによってアプリが強制終了されることがあります*2。この場合、ユーザー側にはクラッシュと同様の体験として映り、レビュー評価の低下につながります。
アプリストアの評価は検索順位と紐付いているため、ANR 率や起動時間の悪化がそのまま新規流入の減少へと連鎖します。パフォーマンス改善は UI のリニューアルや機能追加よりも、事業の継続性に直結する優先課題といえます。
計測の指標 — Android Vitals・iOS ウォッチドッグで何を見るか
パフォーマンス改善を外注で進める前提として、まず「現状がどの程度悪いか」を定量化する必要があります。Android と iOS それぞれに公式の計測手段があり、閾値が明示されています。
Android Vitals の起動時間閾値と ANR 率
Google Play Console の Android Vitals では、アプリの技術品質を継続的に監視できます*1。起動時間については次の目安が示されています。
| 起動タイプ | 概要 | 「過剰」と見なされる閾値 |
|---|---|---|
| コールドスタート | プロセスがない状態からの起動。 アプリを初めて開く・完全終了後の起動 |
5秒以上 |
| ウォームスタート | プロセスは残っているがアクティビティが 再生成される状態からの起動 |
2秒以上 |
| ホットスタート | プロセスもアクティビティも残っている 状態でのフォアグラウンド復帰 |
1.5秒以上 |
Android Developers の公式ガイドでは、コールドスタートで 5 秒以上、ウォームスタートで 2 秒以上、ホットスタートで 1.5 秒以上の起動時間を「過剰な起動時間(excessive startup time)」として定義しています*3。この閾値を超えると Android Vitals 上でフラグが立ち、パフォーマンスに問題があるアプリとして記録されます。
ANR(Application Not Responding)については、Android Developers の公式ガイドがその定義を示しています*4。メインスレッドで I/O 処理や重い計算が行われるなどしてアプリが一定時間応答しない状態になると、システムが ANR ダイアログを表示します。Android Vitals はアプリの ANR 率を記録し、ユーザー体験に影響するレベルの率を継続的にモニタリングできます*1。
iOS における起動計測 — MetricKit と Xcode Organizer
iOS では、Apple が MetricKit(メトリックキット)というフレームワークを提供しており、アプリの起動時間をデバイス上で計測してレポートする仕組みがあります*2。Xcode Organizer でも集計されたパフォーマンスデータを確認でき、ヒストグラム形式で起動時間の分布を把握できます。
iOS ではウォッチドッグタイマーが稼働しており、起動処理が一定時間内に完了しない場合にシステムがアプリを強制終了します。この終了は crash として記録されますが、実態はパフォーマンス起因の問題です。MetricKit や Xcode Organizer による計測基盤がないと、クラッシュ率の数字だけでは起動性能の問題を判別できない点に注意が必要です。
よくあるボトルネックと対策 — 起動・ANR・メモリ・通信
パフォーマンス問題の原因を正確に特定するには、プロファイリングツールを使った計測が前提となります。ここでは代表的なボトルネックのパターンと、それぞれの改善アプローチをまとめます。
起動時の重い初期化処理 — 遅延初期化・非同期化が基本
コールドスタートが遅い場合、多くの原因は起動直後に実行される初期化処理の過重にあります。アナリティクス SDK の初期化・データベースの準備・大量の設定ファイルの読み込みなどが、メインスレッド上で同期的に実行されていると起動完了まで時間がかかります。
Android Developers の公式ガイドでは、起動を遅らせる原因として重い初期化処理・大きなビュー階層・ビットマップ処理などを挙げており、遅延初期化(必要になるまで処理を後回しにする)や非同期化(別スレッドで処理する)が改善の基本方針です*3。不要な処理の削除や依存ライブラリの起動タイミング見直しも有効な対策です。
ANR の主因 — メインスレッドのブロックを防ぐ
ANR の主な原因は、アプリのメインスレッド(UI スレッド)が長時間ブロックされることにあります。Android Developers の公式ガイドは、ANR を引き起こす典型パターンとして次のものを挙げています*4。
- メインスレッドでのファイル I/O やネットワーク通信(同期呼び出し)
- メインスレッドでの重い計算処理(画像処理・暗号化・JSON パースなど)
- 同期 Binder 呼び出しによる他プロセスとの通信待ち
- ロック競合・デッドロックによるスレッドの長時間待機
対策の基本は、重い処理をメインスレッドから切り離すことです。Android であれば Kotlin Coroutines(コルーチン)や WorkManager を使った非同期処理、iOS であれば Grand Central Dispatch(GCD)や async/await による非同期化が有効です。
実装の修正は比較的明確ですが、「どのスレッドでどの処理が動いているか」をプロファイリングツールで正確に可視化する工程が先に必要です。Android では Android Studio の CPU Profiler、iOS では Xcode Instruments が代表的なツールです。この計測フェーズに専門知識が求められるため、外注を検討する場面の一つになります。
画像・通信処理 — キャッシュ戦略と遅延ロード
画面遷移時のカクつき(フレームレート低下)は、スクロール中の重い画像ロードや、通信結果を待機する UI 処理が原因になります。画像は適切なサイズへのリサイズとキャッシュ利用が基本対策です。ネットワーク通信はバックグラウンドスレッドで行い、ローディング表示を入れることでユーザーへの体感待ち時間を軽減できます。
メモリ使用量 — リークとガベージコレクション
メモリリーク(使い終わったオブジェクトが解放されず、参照が残り続ける状態)が積み重なると、ガベージコレクションの頻度が増し、アプリ全体がカクつきます。Android の LeakCanary(リークカナリー)や Xcode の Memory Graph Debugger を使ってメモリの保持状況を可視化し、解放漏れを特定します。
改善を外注で進めるサイクル — 計測→特定→実装→再計測
パフォーマンス改善を外注で進める場合、「計測基盤の整備→ボトルネックの特定→改善実装→再計測による効果確認」という反復サイクルが基本です。各ステップで外注とインソースの役割を整理すると、委託スコープが明確になります。
ステップ1:計測基盤を整える — Android Vitals・MetricKit の有効化
改善の前提は現状データの取得です。Android Vitals は Google Play Console から確認できますが、アプリのバージョンやデバイス属性ごとのフィルタリングや、カスタムトレース(任意のコードブロックの処理時間を計測する仕組み)の埋め込みには追加の設定が必要です。
iOS の MetricKit はアプリに数行の実装を加えるだけで起動時間・メモリ・エネルギー使用量のレポートをデバイスから収集できます*2。計測基盤が整っていない場合は、この段階から外注に委託すると後の工程が精度よく進みます。
ステップ2:プロファイリングでボトルネックを特定する
計測データでフラグが立った箇所に対して、Android Studio の CPU Profiler・Memory Profiler、または Xcode の Instruments(Time Profiler・Allocations テンプレートなど)を使ってプロファイリングを行います。
プロファイリングはツールの操作スキルだけでなく、コールスタック(関数の呼び出し階層)を読み解いてボトルネックの根本原因まで辿る分析力が必要です。内製チームにこの知識がない場合は、ボトルネック特定フェーズから外注する判断が合理的です。
ステップ3:改善を実装し、コードレビューで品質を担保する
ボトルネックが特定できれば、非同期化・遅延初期化・キャッシュ実装・ビュー階層の見直しといった具体的な修正に入ります。修正は既存コードへの変更を伴うため、テストカバレッジの確認とコードレビューのプロセスが品質担保の鍵になります。
外注の場合は、変更箇所に対する単体テストや UI テストを納品物の要件として明示しておくと、改善後のリグレッション(他の機能への影響)リスクを抑えられます。
ステップ4:再計測で効果を確認し、継続監視体制を構築する
改善実装後は Android Vitals や MetricKit を使って再計測し、閾値との比較で改善効果を確認します。一度の改善で完結させるのではなく、次のリリースサイクルでもパフォーマンス指標をモニタリングし続ける体制があると、性能の退行を早期に検知できます。継続監視の設計や自動アラートの整備も外注スコープとして組み込むと、長期的な品質維持につながります。
外注の使いどころと委託判断軸
パフォーマンス改善のどの工程を外注すべきかは、内製チームのスキルと課題の緊急度によって変わります。以下の判断軸を参考に検討できます。
計測基盤の整備 — 「指標が取れていない」状態からの委託
Android Vitals や MetricKit の計測基盤が整っておらず、現状のパフォーマンスを数値で把握できていない場合は、計測基盤の設計・実装から外注するパターンが適しています。この段階での委託は、後続の改善工程を精度よく進めるための投資として機能します。
ボトルネック特定・改善実装 — 専門プロファイリング知識の補完
計測データは取得できているが、プロファイリングの読み解きや改善実装の優先順位付けに知識が不足している場合は、ボトルネック特定と改善実装を一括して委託するパターンが効率的です。外注先には、Android Profiler・Xcode Instruments の実務経験と、Kotlin Coroutines・Swift async/await を使った非同期実装の実績を要件として確認します。
継続監視体制の構築 — リリースごとの性能維持
一度の改善で終わらせず、CI/CD(継続的インテグレーション・継続的デリバリー)パイプラインへのパフォーマンス計測の組み込みや、Macrobenchmark(マクロベンチマーク)などのベンチマークテストの自動化を委託するパターンもあります。リリース頻度が高いアプリほど、自動的に性能を検出するテスト基盤の価値が高まります。
内製向きの工程と外注向きの工程
| 工程 | 内製向き(知識・ツールがある場合) | 外注向き(専門知識を補いたい場合) |
|---|---|---|
| Android Vitals 確認 | Google Play Console にアクセスできれば確認可能 | 指標の読み方・優先度判断が不明確な場合 |
| プロファイリング | CPU Profiler・Instruments の操作に慣れている場合 | コールスタックの分析経験がない・根本原因に辿り着けない場合 |
| 非同期化・遅延初期化 | Kotlin Coroutines・Swift async/await を使った実装経験がある場合 | メインスレッドの設計を変更するリファクタリングが大規模な場合 |
| ベンチマーク自動化 | CI/CD 環境が整備されており、テスト追加の工数を確保できる場合 | Macrobenchmark・JMH 等の設定・運用経験がない場合 |
外注先を選定する際は、修正実績の提示(類似アプリのボトルネック改善経験)・使用ツールの明示・納品物の定義(改善前後の計測レポート・修正コード・テストコード)を要件に加えると、比較検討がしやすくなります。
内製でパフォーマンス改善を継続するには、Android Profiler・Xcode Instruments の操作スキル・Kotlin/Swift の非同期処理実装経験・Macrobenchmark などのベンチマーク設計の知識が必要です。これらすべてを内製チームが保有するケースは限られるため、一部工程を外注しながら知識移転を受けるラボ型の委託形態も選択肢になります。
まとめ — 起動時間・ANR改善を外注で成果につなげる3つの判断軸
本稿では、モバイルアプリのパフォーマンス改善(起動時間・ANR・応答性)を外注で進める際の要点を整理しました。要点を3つに集約すると次の通りです。
第一に、Android Vitals の起動時間閾値(コールドスタート 5 秒・ウォームスタート 2 秒・ホットスタート 1.5 秒)と ANR の公式定義を把握し、現状を数値で把握することが出発点です。iOS では MetricKit による計測基盤の整備がウォッチドッグ終了の原因特定にも有効です。
第二に、改善の基本サイクルは「計測→ボトルネック特定→改善実装(非同期化・遅延初期化)→再計測」の反復です。このサイクルのどの工程にスキルギャップがあるかを明確にすることが、外注スコープを適切に定義する鍵になります。
第三に、外注の使いどころは「計測基盤の整備」「専門プロファイリングによるボトルネック特定」「継続監視の自動化」の3段階に分けられます。一度の改善で終わらせず、リリースごとに性能を検出できる体制を整備することが、長期的なアプリ品質の維持につながります。
よくある質問
Android Vitals の ANR 率は何パーセントを超えると問題になりますか?
Google Play Console の Android Vitals では、ANR 率や起動時間などの指標を継続的にモニタリングし、アプリの技術品質に影響するレベルの値をフラグとして記録します*1。具体的な ANR 率の閾値はアプリのカテゴリや対象デバイスの分布によって変わるため、Google Play Console 上の自アプリの Android Vitals ページで現状の値を確認し、同カテゴリの比較値と照らし合わせるのが実務上の判断方法です。
ANR とクラッシュはどう違いますか?
クラッシュはアプリのプロセスが予期せず終了する現象で、NullPointerException などの例外がハンドルされない場合に発生します。ANR(Application Not Responding)はアプリが起動したまま応答しなくなる現象で、メインスレッドが長時間ブロックされることが主因です*4。ユーザー側にはどちらも「アプリが使えなくなった」体験として映りますが、原因と対策が異なるため、計測時に分けて管理することが大切です。
iOS のウォッチドッグタイマーによる強制終了はどう確認できますか?
ウォッチドッグタイマーによる強制終了は、Xcode の Organizer や MetricKit のレポートで確認できます*2。MetricKit を実装したアプリであれば、デバイスからパフォーマンスデータが定期的に収集され、起動時間の分布と強制終了の発生状況を把握できます。クラッシュレポートと合わせて確認し、起動処理の過重が原因かどうかを切り分けることが調査の第一歩です。
パフォーマンス改善を外注する場合、どのような情報を準備すればよいですか?
外注先への提供が効果的な情報は、Android Vitals または MetricKit の現状データ(起動時間・ANR 率のスクリーンショットや数値)、アプリのプラットフォーム・言語・アーキテクチャの概要、改善したい指標の目標値、そして対応できる期間・予算の概算です。計測データがない場合は「計測基盤の整備から依頼する」と伝えると、外注先がスコープを設計しやすくなります。
パフォーマンス改善後にリグレッションを防ぐにはどうすればよいですか?
リグレッション(改善後に再び性能が劣化する現象)を防ぐには、CI/CD パイプラインにベンチマークテストを組み込む方法が有効です。Android の Macrobenchmark ライブラリや iOS の XCTest Performance テストを使うと、リリースごとに起動時間や処理速度の変化を自動的に検出できます。外注時に「ベンチマークテストの整備を納品物に含める」よう要件に明記しておくと、継続的な品質維持に役立ちます。
著者:テレリモ総研編集部 鈴木 亮佑
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:Google「Android Vitals — Google Play Console Help」(Android Developers)
- *2 出典:Apple「MetricKit — Apple Developer Documentation」(Apple Developer)
- *3 出典:Android Developers「App startup time — Android Developers」(Google)
- *4 出典:Android Developers「ANRs — Android Developers」(Google)