はじめに
Android 6.0(API23)以降では、端末のバッテリー寿命を延ばすための省電力機能として「Doze」「App Standby」があります。
端末をずっと放置したり、アプリをずっと操作しなかったりした場合に、システムが「端末が使用されていない」「アプリが使用されていない」と判断し、アプリに対してネットワークアクセスの制限などを適用することで、電池の持ちを少しでも良くする機能です。
- どういう条件で「端末が使用されていない」(Doze)「アプリが使用されていない」(App Standby)と判断されるか
- 「端末が使用されていない」(Doze)「アプリが使用されていない」(App Standby)とシステムに判断された場合の、アプリの制限はどのようなものか
- アプリがこれらの省電力機能の制限を受けないようにするには、どうすればよいか
については、下記公式サイトに書かれています。
[Android Developers] Doze と App Standby 用に最適化する機能
上記サイトには、Doze や App Standby によってアプリに制限がかけられる状態をエミュレートする方法についても記載されているのですが、
エミュレータでこれらの動作確認を行う場合、若干手順が不足していたり、環境によっては状態をエミュレートすることができなかったりしたので、メモ代わりにまとめておきます。
Dozeの動作確認手順
-
以下コマンドを実行
> adb shell dumpsys battery unplug
-
以下コマンドを実行
> adb shell dumpsys deviceidle enable
-
端末のスクリーンをOFFにする
-
以下コマンドを実行
> adb shell dumpsys deviceidle enable
-
以降、4を繰り返すと、端末の状態がACTIVE -> IDLE_PENDING -> SENSING -> LOGCATING -> IDLE -> IDLE_MAINTENANCEと遷移する。
(IDLE以降は、IDLE -> IDLE_MAINTENANCE -> IDLE -> IDLE_MAINTENANCE と繰り返される)
IDLEとなっているときが「端末が使用されていない」と判断されている状態なので、この状態のときにアプリが意図通り動作していることを確認する。
App Standbyの動作確認手順
-
以下コマンドを実行
> adb shell dumpsys battery unplug
-
以下コマンドを実行
> adb shell am set-inactive <パッケージ名> true
-
以下コマンドでIdle=trueと表示されることを確認
> adb shell am get-inactive <パッケージ名> Idle=true
Idle=trueと表示されている場合、「アプリが使用されていない」と判断されている状態。
Idle=falseと表示されている場合は「アプリが使用されていない」と判断されていない。
- アプリの画面が前面に表示されている場合は、ホームキーを押してアプリをバックグラウンドへ移動する
- (「アプリが使用されていない」と判断されている状態なので)アプリの動作が意図通りであることを確認する
OSバージョンによるエミュレータでの動作状況
上記の動作確認手順を、各OSバージョンのAndroidエミュレータで試してみた結果です。
Dozeの動作確認はAndroid6.0以降のエミュレータで行うことが出来るようです。
App Standbyの動作確認は、Android8.0未満のエミュレータでは、手順3で常にIdle=false
となり、「アプリが使用されていない」と判断されている状態をエミュレートすることが出来ませんでした。
エミュレータの システムイメージ |
Doze 動作確認 |
App Standby 動作確認 |
---|---|---|
Android8.1 | 動作確認できた | 動作確認できた |
Android8.0 | 動作確認できた | 動作確認できた |
Android7.1 | 動作確認できた | 動作確認できなかった |
Android7.0 | 動作確認できた | 動作確認できなかった |
Android6.0 | 動作確認できた | 動作確認できなかった |