29
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android M で追加された「Doze mode」について

Posted at

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を有効化する必要があるみたいです。

画面をスリープさせた上で状態をIdleに移行
$ adb shell dumpsys deviceidle enable

もしくは

画面をスリープさせずに強制的にIdleに移行
$ 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」です。
この状態でアプリが仕様どおりの動きをする事を確認しましょう。


元に戻す

unplug,idle状態から元に戻す
$ adb shell dumpsys deviceidle disable
$ adb shell dumpsys battery reset

バッテリーのステートがIDLE → ACTIVEになり元に戻った事を確認しました。

29
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?