More Related Content
Similar to Background execution limits Android Oreo jag201711 (20)
Background execution limits Android Oreo jag201711
- 2. Background Execution Limits
バックグラウンド実⾏制限
課題(Android Nまでの)
– Androidアプリやサービスは同時に実⾏が可能
– 多くアプリやサービスが同時にバックグラウンドで実⾏されると、シ
ステム負荷が増⼤
– ⾳楽アプリなどユーザが利⽤中のアプリが突然シャットダウンされる
など、UX低下
Android Oの解決策
– ユーザーがアプリを直接操作していないときにアプリで実⾏できる動
作を制限
– 制限事項
• バックグラウンド サービスの制限
• ブロードキャストの制限
- 3. Background Service Limitations
バックグラウンドサービスの制限
概要
– バックグラウンドで実⾏されているサービスが端末のリソースを浪
費して、ユーザーエクスペリエンス低下の可能性
– システムでは、この問題を軽減するために、サービスに対して制限
を適⽤
foreground と background のアプリ区別基準
– visible activityが存在(Activityがstartされているかpauseされて
いるかに関係なく)
– foreground serviceが存在(⾳楽再⽣など想定)
– 該当アプリが、別のforegroundアプリに対して、サービスもしく
は、Content Providerを利⽤するということで接続されているいる
場合
– 例:別のアプリが次のいずれかのサービスにバインドされるとフォ
アグラウンド判定
• IME
• 壁紙サービス
• 通知リスナー
• ⾳声またはテキスト サービス
- 4. Background Service Limitations
バックグラウンドサービスの制限
影響
– アプリがforegroundにいるときは問題ないが、backgoundに移
⾏すると数分間の猶予(タイマー)が残されて、サービス作成
可能だが、タイムアウトするとアイドル状態と判定されて、OS
がサービスを停⽌(Service.stopSelf()呼び出しと同等)
– 例外:ホワイトリスト⼊条件(勝⼿終了を免れるサービス)
• ⾼い優先度の Firebase Cloud Messaging(FCM)メッセージの処理
• SMS/MMS メッセージなどのブロードキャストの受信。
• 通知からの PendingIntent(タイミング指定で発⾏可能なIntent)の実⾏
- 5. Background Service Limitations
バックグラウンドサービスの制限
解決策
– backgroundサービスを JobScheduler ジョブに置き換え
• 定期的にサーバ確認したいならbackgroundサービスではなく、
JobSchedulerで定期クエリを発⾏
注意事項
– Android Oでは、BackgroundアプリによるBackgroundサービ
スの作成は不可
– Backgroundからサービス開始したい場合は
Context.startForegroundServiceメソッドを呼び出して, 5
秒以内にforegroundサービスに昇格させる必要がある
– アプリが startForeground() を制限時間内に呼び出さない場合、
サービスが停⽌し、ANRへ…
- 6. Broadcast Limitations
ブロードキャストの制限
課題
– アプリがブロードキャストを受信するように登録されている場合、ブ
ロードキャストが送信されるたびにアプリのレシーバーがリソースを
浪費
– 多数アプリがシステムイベントに基づくブロードキャストの受信を登
録している場合、UX低下
– Android Nでもブロードキャストに制限を課していたが、Android Oで
もさらに制限強化
Android Oの解決策(制限強化策)
– Manifestに対して、implicit broadcastsのレシーバ登録不可
• ACTION_PACKAGE_REPLACED(暗黙的なブロードキャスト)なので×
• ACTION_MY_PACKAGE_REPLACEDは○
影響(例外)
– 明⽰的なブロードキャストをマニフェスト内で登録可能
– 実⾏時に Context.registerReceiver() を使って、暗黙的、明⽰的を問
わず任意のブロードキャストに対するレシーバーを登録可能
– 署名パーミッションが必要なブロードキャストは、同じ証明書で署名
されたアプリのみに送信されるため、これらのブロードキャストには
この制限は適⽤外
- 8. Background Location Limits
バックグラウンド位置情報の制限
概要
– Android 8.0 は電⼒消費を抑えるため、アプリが対象とする
SDK バージョンに関係なく、バックグラウンド アプリがユー
ザーの現在地を取得する回数を制限
– Android 8.0 を実⾏している端末でアプリがフォアグラウンド
になっていると、位置情報のアップデートの動作は、Android
7.1.1(API レベル 25)以下での動作と同じ
アプリにおける位置情報取得の調整
– 頻繁に位置情報を取得したい場合
• アプリをフォアグラウンドで動作
• startForegroundService()を呼んでアプリ内でforegroundサービスを起動
• GeofensingAPIの要素を利⽤
- 9. Background Location Limits
バックグラウンド位置情報の制限
影響を受けるAPI①
– FusedLocationProvider(FusedLocationProviderClient)
• アプリがバックグラウンドで実⾏されていると、位置検出システムサービスは、
Android 8.0 での動作変更点で定義した間隔に従い、アプリの新しい位置を 1
時間に数回だけ計算
• アプリがフォアグラウンドで実⾏されている場合は、Android 7.1.1(API レベ
ル 25)との⽐較においても、位置情報のサンプリングレートに変更なし
– Geofencing(GeofencingClient)
• バックグラウンドアプリは、FusedLocationProviderからのアップデートよりも
さらに頻繁にジオフェンシング遷移イベントを受信可能
• ジオフェンシング イベントに対する平均的な応答性は 2〜3 分毎
– GNSS Measurements と GNSS Navigation Message
• アプリがバックグラウンドで実⾏されていると、GnssMeasurement と
GnssNavigationMessage からの出⼒を受信するために登録されているコール
バックは実⾏を停⽌
- 10. Background Location Limits
バックグラウンド位置情報の制限
影響を受けるAPI②
– Location Manager
• 位置情報のアップデートは、Android 8.0 での動作変更点で定義した間隔
に従い、1 時間に数回だけバックグラウンド アプリに提供
– Wi-Fi Manager
• startScan() メソッドは、バックグラウンド アプリのフルスキャンを 1 時
間に 2〜3 回だけ実⾏
• バックグラウンド アプリがフルスキャンの直後にこのメソッドを再度呼び
出した場合は、WifiManager クラスにより、前のスキャンのキャッシュさ
れた結果が提供
- 11. まとめ:バックグラウンド実⾏制限
移⾏策
– バックグラウンドサービスの制限
• startService()ではなく、
NotificationManager.startServiceInForeground() を
使ってService作成
• JobSchedulerを駆使して定期呼び出し
• Firebase Cloud Messagingを使ってネットワーク側か
ら呼び出し
– ブロードキャスト制限
• Manifestでレシーバーを宣⾔するのではなく、
Context.registerReceiver() を呼び出して実⾏時にレ
シーバーを作成
• JobSchedulerで暗黙的なブロードキャストがトリガー
された状況があったかどうかを確認