iOSとAndroidのプロセスとバックグラウンドタスク
こんにちは。iOSとAndroidのプロセスやバックグラウンドタスクの違いを解説します。
① プロセス管理の基本
iOSの場合
- 1アプリ=1プロセスが原則。
- アプリがバックグラウンドに入った後、一定の短い猶予期間(通常約5秒)後には自動的にSuspend(中断)状態になります。また、メモリ圧迫時には即座にプロセスがTerminate(終了)されます。
- プロセスはlaunchdという仕組みで管理されます。
launchdとは
launchdはAppleが開発したプロセス管理用デーモンで、macOSやiOSで使われています。起動時から常駐し、システム全体のプロセスの起動、監視、管理を担当します。launchdがプロセスのライフサイクルを統一的に管理することで、プロセスの起動や再起動を迅速かつ効率的に行うことが可能です。アプリがクラッシュした場合やシステムリソースが限界に達した場合には、launchdがプロセスを適切に終了させ、システム全体の安定性を維持します。
Androidの場合
- Linuxベースのため、アプリはZygoteプロセスからforkされ、複数プロセス化も可能。
- メモリ圧迫時には優先度(OOM adj)が低い順にkillされます。
- 状態管理はForeground、Visible、Service、Cachedなど細分化されています。
② バックグラウンド実行モデル
iOSのバックグラウンドタスク
- BGAppRefreshTask: 数十秒で完了するタスク(例: ニュースの取得)。
- BGProcessingTask: 長時間処理(数分以上)に対応。充電中でWi-Fi接続が基本(例: DBのメンテナンス、機械学習処理)。
- Push通知(content-available): 30秒程度の短いバックグラウンド処理。
- Background URLSession: 大容量データのバックグラウンド転送。
Androidのバックグラウンドタスク
- Foreground Service: 通知が必須で、長時間実行可能(例: 音楽再生、フィットネスアプリ)。
- WorkManager: 一定の条件(充電中、アイドル状態など)での定期的処理(例: 定期的なデータ同期)。
- JobScheduler: OSが最適なタイミングで実行を管理するジョブ。
- AlarmManager: 正確な時刻での実行が必要なタスク(例: アラーム、リマインダー通知)。
③ 生存時間とOSの介入条件
iOSの生存時間
- バックグラウンド移行後、約5秒間の猶予期間の後にSuspendされる。
- メモリが不足すると即座にSuspend状態のプロセスがTerminateされる。
Androidの生存時間
- Foreground Service以外は基本的に数分以内にkillされることが多い。
- バッテリー節約モード(Doze)になると、ネットワークやWake Lockが制限され、バックグラウンド処理は大きく制限される。
④ ユースケース別の推奨実装
音楽再生
- iOS推奨: BG Audio (
AVAudioSession) - Android推奨: Foreground Service (MediaPlayback)
定期的なデータ同期
- iOS推奨: BGAppRefreshTask
- Android推奨: WorkManager
長時間の計算処理
- iOS推奨: BGProcessingTask
- Android推奨: WorkManagerまたはForeground Service
正確な時間通知
- iOS推奨: Push通知またはCalendar通知
- Android推奨: AlarmManager
ファイルアップロード
- iOS推奨: Background URLSession
- Android推奨: WorkManager(setExpedited推奨)
⑤ クロスプラットフォーム設計のコツ
-
再試行可能なサーバ設計
- OSがいつタスクを実行するか予測不可能なため、冪等性と再試行トークンを必ず実装する。
-
ユーザ可視性
- Androidは通知表示が必要で制限が多く、iOSは通知不要だが制限時間が短いことを考慮。
-
バッテリー効率の実測
- 各OSの公式ツール(iOS: energy log、Android: Battery Historian)でバッテリー消費を確認。
-
SDK抽象化層の導入
- FlutterやReact Nativeなどのクロスプラットフォームの場合、プラットフォーム固有APIはネイティブ層でラップし、安定化を図る。
🔑 まとめ:押さえておきたいポイント
- プロセス管理: iOSは即時Suspend、Androidは優先度管理で段階的kill。
- バックグラウンド処理: 長期タスクは両OSとも特定条件下のみ。短期的な処理が基本。
- APIの正しい選定がアプリ品質を左右するため、ユースケースに応じたベストプラクティスを守る。
これを押さえるだけで、モバイルアプリ開発でありがちなトラブル(突然killされる、動作が不安定など)を回避できます。ぜひプロジェクトで活用してみてください!