Doze とアプリ スタンバイ用に最適化する

Android には、デバイスが電源に接続されていないときのアプリの動作を管理することでバッテリーを長持ちさせる、Doze とアプリ スタンバイの 2 つの省電力機能があります。「Doze」は、デバイスが長時間にわたって使用されない場合、アプリのバックグラウンド CPU とネットワーク アクティビティを保留にして電池消費を削減します。アプリ スタンバイは、ユーザーの最近のアクティビティがないアプリのバックグラウンド ネットワーク アクティビティを保留します。

デバイスが Doze モードの間、バッテリー使用量の多い特定のリソースへのアプリのアクセスはメンテナンスの時間枠まで延期されます。具体的な制限は電源管理に関する制限に記載されています。

Doze とアプリ スタンバイは、API レベル 23 を明示的にターゲットとしているかどうかに関係なく、Android 6.0 以降で実行されるすべてのアプリの動作を管理します。最適なユーザー エクスペリエンスを実現するには、Doze モードとアプリ スタンバイ モードでアプリをテストし、必要に応じてコードを調整します。以降のセクションでは、詳細を説明します。

Doze を理解する

ユーザーがデバイスを電源から外してしばらくの間動かないままにしておくと、画面がオフの状態で Doze モードになります。Doze モードでは、ネットワークや CPU を大量に消費するサービスへのアプリのアクセスを制限することで、バッテリーの節約を試みます。また、アプリはネットワークにアクセスできないため、ジョブ、同期、標準アラームを延期します。

定期的にシステムが短時間の Doze モードを終了し、アプリが遅延アクティビティを完了できるようにします。このメンテナンスの時間枠には、システムは保留中のすべての同期、ジョブ、アラームを実行し、アプリがネットワークにアクセスできるようにします。

図 1. Doze モードは、アプリがネットワークを使用して保留中のアクティビティを処理するための定期的なメンテナンスの時間枠を設定します。

メンテナンスの時間枠が終了すると、システムは再び Doze モードに入り、ネットワーク アクセスが一時停止され、ジョブ、同期、アラームが保留されます。時間の経過とともに、システムによってメンテナンスの時間枠がスケジュールされる頻度が下がっていきます。これにより、デバイスが充電されていないときに操作が行われない時間が長い場合に、バッテリーの消費量を抑えることができます。

ユーザーがデバイスを移動したり、画面をオンにしたり、充電器を接続したりしてデバイスを復帰させると、システムは Doze モードを終了し、すべてのアプリは通常のアクティビティを再開します。

Doze の制限事項

Doze モード中は、アプリに次の制限が適用されます。

  • ネットワーク アクセスを一時停止します。
  • wake lock は無視されます。
  • 標準の AlarmManager アラーム(setExact()setWindow() など)を次のメンテナンスの時間枠に延期します。
    • Doze モード中に動作するアラームを設定する必要がある場合は、setAndAllowWhileIdle() または setExactAndAllowWhileIdle() を使用します。
    • setAlarmClock() で設定されたアラームは引き続き通常どおり発生します。これらのアラームが発生する直前に、システムは Doze モードを終了します。
  • Wi-Fi スキャンを実行しない。
  • 同期アダプターを実行できません。
  • JobScheduler を実行しません。

Doze チェックリスト

Doze 向けにアプリを調整する

Doze モードの影響は、アプリの機能や使用するサービスによって異なります。多くのアプリは、変更を行わなくても Doze サイクル全体で正常に機能します。場合によっては、アプリがネットワーク、アラーム、ジョブ、同期を管理する方法を最適化する必要があります。アプリは、各メンテナンスの時間枠でアクティビティを効率的に管理できる必要があります。

アラームのスケジュールを設定するには、setAndAllowWhileIdle()setExactAndAllowWhileIdle() の 2 つの AlarmManager メソッドを使用します。これらのメソッドを使用すると、デバイスが Doze モードであってもアラームを発生させるように設定できます。

Doze のネットワーク アクセス制限は、特にアプリが通知や通知などのリアルタイム メッセージに依存している場合、アプリに影響する可能性があります。アプリがメッセージを受信するためにネットワークへの永続的な接続を必要とする場合は、可能であれば Firebase Cloud Messaging(FCM)を使用します。

アプリが Doze で想定どおりに動作することを確認するには、adb コマンドを使用してシステムを強制的に Doze モードに / 終了させ、アプリの動作を監視します。詳しくは、Doze モードとアプリ スタンバイ モードでテストするをご覧ください。

アプリ スタンバイについて

アプリ スタンバイを使用すると、ユーザーがアプリをアクティブに使用していないときに、システムはアプリがアイドル状態であると判断できます。この判断は、ユーザーが一定時間アプリに触れず、かつ、以下のいずれの条件にも当てはまらない場合に行われます。

  • ユーザーがアプリを明示的に起動している。
  • アプリのプロセスが、アクティビティまたはフォアグラウンド サービスとして現在フォアグラウンドにあるか、別のアクティビティもしくはフォアグラウンド サービスで使用されている。
  • アプリが生成する通知は、ロック画面または通知トレイに表示されます。

ユーザーがデバイスを電源に接続すると、アプリはスタンバイ状態から解放され、ネットワークに自由にアクセスして、保留中のジョブと同期を実行できます。デバイスが長時間アイドル状態の場合、システムはアイドル状態のアプリに対して 1 日 1 回程度のネットワーク アクセスを許可します。

デバイスがアイドル状態のときに FCM を使用してアプリを操作する

Firebase Cloud Messaging(FCM)はクラウドからデバイスへのサービスであり、Android デバイス上のバックエンド サービスとアプリ間でのリアルタイムのダウンストリーム メッセージングをサポートします。FCM は、クラウドへの単一の永続的な接続を提供します。リアルタイム メッセージを必要とするすべてのアプリは、この接続を共有できます。この共有接続により、複数のアプリが個別の永続的な接続を独自に維持する必要がなくなり、バッテリー消費が大幅に最適化されます。これによりバッテリーが急速に消耗する可能性があります。そのため、アプリでバックエンド サービスとのメッセージ統合が必要な場合は、永続的なネットワーク接続を独自に維持するのではなく、可能であれば FCM を使用することを強くおすすめします。

FCM は、Doze モードとアプリ スタンバイ アイドルモードで動作するように最適化されています。FCM の優先度の高いメッセージにより、アプリを復帰させてユーザーに働きかけることができます。Doze モードまたはアプリ スタンバイ モードでは、システムによってメッセージが配信され、アプリにネットワーク サービスと部分的なウェイクロックへの一時的なアクセス権が付与され、デバイスまたはアプリがアイドル状態に戻ります。時間的制約があり、ユーザーに表示される通知については、優先度の高いメッセージを使用して Doze モードでの配信を有効にすることを検討してください。優先度の高いメッセージにより通知が届くことがあります。詳細については、優先度の高いメッセージに関する FCM のガイダンスをご覧ください。

バックグラウンドでアプリ コンテンツを最新の状態に維持する、データ同期を開始するなど、通知に至らないメッセージには、標準優先度の FCM メッセージを使用します。デバイスが Doze モードでない場合、通常の優先度のメッセージはすぐに配信されます。デバイスが Doze モードの場合、定期的な Doze メンテナンスの時間枠内、またはユーザーがデバイスを復帰させるとすぐに配信されます。

一般的に、アプリでダウンストリーム メッセージングが必要な場合は、FCM を使用してください。アプリですでに FCM を使用している場合は、ユーザー向けの通知を生成するメッセージにのみ高優先度のメッセージを使用します。

その他のユースケースのサポート

ほぼすべてのアプリで、ネットワーク接続、アラーム、ジョブ、同期を管理し、FCM メッセージを使用することで Doze モードをサポートできます。ユースケースが限定されている場合、だけでは不十分である可能性があります。このようなケースのために、Doze とアプリ スタンバイの最適化から部分的に除外されるアプリのリストがシステムによって提供されます。

部分的に除外されたアプリは、ネットワークを使用して、Doze モードとアプリ スタンバイ中に部分的な wake lock を保持できます。ただし、他のアプリと同様に、他の制限がアプリにも適用されます。たとえば、API レベル 23 以下ではアプリのジョブと同期が延期され、アプリの通常の AlarmManager アラームは発生しません。アプリが現在除外リストに含まれているかどうかを確認するには、isIgnoringBatteryOptimizations() を呼び出します。

ユーザーは、除外対象のアプリのリストを [設定] > [バッテリー] > [バッテリーの最適化] で手動で設定できます。または、システムによって除外するようにアプリがユーザーに求める方法も用意されています。

アプリが現在除外リストに含まれているかどうかを確認するには、isIgnoringBatteryOptimizations() を呼び出します。

Doze とアプリ スタンバイを使用してテストする

優れたユーザー エクスペリエンスを実現するため、Doze モードとアプリ スタンバイ モードでアプリを十分にテストしてください。

Doze でアプリをテストする

次の手順で Doze モードをテストできます。

  1. Android 6.0(API レベル 23)以降のシステム イメージを搭載したハードウェア デバイスまたは仮想デバイスを設定します。
  2. デバイスを開発用 PC に接続してアプリをインストールします。
  3. アプリを実行してアクティブ状態のままにします。
  4. 次のコマンドを実行して、システムを強制的にアイドルモードにします。
        $ adb shell dumpsys deviceidle force-idle
        
  5. 準備ができたら、次のコマンドを実行してアイドルモードを終了します。
        $ adb shell dumpsys deviceidle unforce
        
  6. 次のコマンドを実行して、デバイスを再度有効にします。
        $ adb shell dumpsys battery reset
        
  7. デバイスを再びアクティブ状態にした後のアプリの動作を監視します。デバイスが Doze モードを終了したときに、アプリが正常に復旧することを確認します。

アプリ スタンバイでアプリをテストする

アプリでアプリ スタンバイ モードをテストする手順は次のとおりです。

  1. Android 6.0(API レベル 23)以降のシステム イメージを搭載したハードウェア デバイスまたは仮想デバイスを設定します。
  2. デバイスを開発用 PC に接続してアプリをインストールします。
  3. アプリを実行してアクティブ状態のままにします。
  4. 次のコマンドを実行して、アプリを強制的にアプリ スタンバイ モードにします。
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. 次のコマンドを使用して、アプリの復帰をシミュレートします。
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. 復帰後のアプリの動作を監視します。アプリがスタンバイ モードから正常に復帰していることを確認してください。特に、アプリの通知とバックグラウンド ジョブが想定どおりに機能しているかどうかを確認します。

免除できるユースケース

次の表では、いくつかのユースケースと、そのような状況でアプリが ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS インテントのアクションを使用できるかどうかを示しています。通常、Doze またはアプリ スタンバイによってアプリのコア機能に障害が生じる場合や、技術的な理由によって優先度の高い FCM メッセージを使用できない場合を除き、アプリはこうした例外に該当しません。

詳細については、他のユースケースのサポートをご覧ください。

タイプ ユースケース FCM 使用の可否 免除は許可されますか? Notes
インスタント メッセージ、チャット、通話アプリ デバイスが Doze モードまたはアプリ スタンバイ状態のときに、ユーザーにリアルタイム メッセージを配信する必要があります。 FCM を使用できます。 登録不可 優先度の高い FCM メッセージを使用して、アプリを復帰させ、ネットワークにアクセスします。
はい。ただし、FCM の優先度の高いメッセージを使用していません。
インスタント メッセージ、チャット、通話アプリ、エンタープライズ VOIP アプリ。 いいえ。別のメッセージ サービスへの技術的な依存関係があるか、Doze とアプリ スタンバイによってアプリのコア機能が妨げられるため、FCM を使用できません。 許容できる
緊急情報サービスアプリ。 ユーザーと家族の安全を守るアプリ。 該当する場合のみ記入 許容できる
タスク自動化アプリ。 アプリのコア機能は、インスタント メッセージ、音声通話、新しい写真の管理などの自動アクションのスケジュール設定です。 該当する場合のみ記入 許容できる
周辺機器デバイスのコンパニオン アプリ。 アプリのコア機能は、周辺機器のインターネット アクセスを可能にするために、周辺機器との永続的な接続を維持します。 該当する場合のみ記入 許容できる
アプリは、同期するために定期的に周辺機器に接続するか、標準の Bluetooth プロファイルで接続されたデバイス(ワイヤレス ヘッドフォンなど)にのみ接続するだけで済みます。 該当する場合のみ記入 登録不可