Android Marshmallow で追加された「Doze mode」について
Androidアプリのテストケースにて「Doze mode」時の動作を調べて欲しいと言われたので「Doze mode」について調べた事をまとめました。
「Doze mode」とは?
Android M から追加された機能で「システム全体の省電力モード」の事です。
一定期間のスクリーンオフが続くとシステムはDoze(居眠り)モードに入りバッテリー喰いを抑えてくれます。
Dozeモードは以下のような制限があります
- 優先度の高いGCM(Google Cloud Messaging)を受信しない限り、ネットワークアクセスは無効
- WakeLockは無視される
- setAlarmClock()とAlarmManager.setAndAllowWhileIdle()以外のAlarmManagerによるアラームスケジュールは無効
- Wi-Fiスキャンは実行されない
- 同期アダプターとJobSchedulerによる同期とジョブの実行は許可されない
「Doze」のテストについて公式のサイトでこう書かれていました
You can test Doze mode by following these steps:
1.Configure a hardware device or virtual device with an Android 6.0 (API level 23) or higher system image.
2.Connect the device to your development machine and install your app.
3.Run your app and leave it active.
4.Shut off the device screen. (The app remains active.)
5.Force the system to cycle through Doze modes by running the following
commands:
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
要約すると以下の通り
1. Android 6.0(APIレベル23)以上のAndroid端末または仮想装置で使えます
2. デバイスに接続してアプリをインストールしてください
3. アプリを起動して動作させたままにしてください
4. デバイスの画面をスリープ状態にしてください(アプリは動作中のままです)
5. システムに以下のコマンドを打つことでDozeモードになります
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
システムのステータスがIDLEに変わるまで deviceidle step を繰り返してください
6. スリープ画面から復活させた後のアプリが問題なく復帰する事を確認してください
実際に内部電源状態をシミュレートする
USBとAndroid端末を接続した直後のステータスを見てみます。
$ adb shell dumpsys battery
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
....
USBに繋がっているので USB powered が true になっている事が分かります。
adb shell dumpsys battery unplug コマンドを実行してみます。
$ adb shell dumpsys battery unplug
内部電源状態を見てみると・・・・・。
$ adb shell dumpsys battery
Current Battery Service state:
AC powered: false
USB powered: false
Wireless powered: false
....
USB powered が false になりました。これでエミュレートできるようになりました。
ステータス状態を確認します。
$ adb shell dumpsys deviceidle step
Stepped to: ACTIVE
何度打ち込んでもACTIVEのまま変わりません...。
ステータスが ACTIVE からまったく変わらずに困っていたら良記事を見つけました。
Google 様の言う Doze のテスト方法がよく分からない件
どうやら battery unplug を行った後にデバイスのIdleを有効化する必要があるみたいです。
$ adb shell dumpsys deviceidle enable
もしくは
$ adb shell dumpsys deviceidle force-idle
おかげで状態をIDLEに遷移する事が出来ました。
$ adb shell dumpsys deviceidle step
Stepped to: IDLE
$ adb shell dumpsys deviceidle step
Stepped to: IDLE_MAINTENANCE
やっぱり IDLE と IDLE_MAINTENANCE の違いはよく分かりませんが
この状態こそが「Doze mode」です。
この状態でアプリが仕様どおりの動きをする事を確認しましょう。
元に戻す
$ adb shell dumpsys deviceidle disable
$ adb shell dumpsys battery reset
バッテリーのステートがIDLE → ACTIVEになり元に戻った事を確認しました。