HW的なspecではなく、アプリの動作を制限するタイプの、Androidの省電力機能について。
Androidスマホの省電力機能は、大きく分けて2つ
- low-battery時の緊急用
- 常時動くもの
low-battery用
- メーカ独自のもの
- 二段階あったりする
- 閾値(15%など)を切った時に発動
- アプリのBG通信、バイブレーション、描画速度、GSP等を制限
- 数%時/災害時の待ち受け
- 使えるアプリが限定的
- 待ち受け(ホーム画面)自体が変わる
- 閾値(15%など)を切った時に発動
常時動くもの
- スリープする
- Screen Offする、WiFiを切る、CPUが眠るなど
- wake lock により誰でも起こすことが出来る
- メーカ独自のものも、あった
- アプリを選択してBG通信を制限するなど
- Android M (6.0) から、2つの新機能を搭載
- 使っていないアプリを動作させない (App Standby)
- 使っていない時に動作させない (Doze)
App Standby
- ユーザが使っていない
- 他アプリも使っていない
- 通知を出していない
いずれかに該当すれば、BGでのnetwork accessができなくなる。
Doze
- 画面消灯、バッテリー駆動で、端末を動かさないと、一定時間でIDLE状態
- App Standbyと違い、network accessだけでなく動作自体が制限される
Doze (Android M)
stationary とは?
Significant Motion Sensor
- ユーザの動きを検出する、ワンショットのセンサー
- 加速度センサーを使用
- or another as long as low power
- repeatedly でない false negative を許容
- 実際は動いているけど検知しないのは OK
- 実際に動いていないのに検知するのは NG
- 省電力繋がらない
Significant Motion Sensor
- triggerとなる例
- ウォーキング、サイクリング
- 自動車や列車に乗っている
- triggerとならない例
- ポケットに中に入れていて、人は動いていない
- テーブルに置いてあって、テーブルが道路や洗濯機の振動で少し揺れる
DozeでのSensorの使われ方
Androidのソースコード より解析。
画像は Android MのDozeにおける状態遷移 より。
IDLE中の動作制限
- network access
- 全て不可
- alarm による起床
- alarm clock(目覚まし時計など)は動く
- すぐに ACTIVE 状態に戻る
- それ以外は無視
- alarm clock(目覚まし時計など)は動く
- wake lock
- 全て無視
- Could Messaging (GCM/FCM) 受信
- high-priorityでないメッセージは受信できない
- GPSとWiFiのスキャン
- 動作しない
whitelist
ユーザによる設定で、アプリを動作制限の対象外リストに入れることが出来る
- network access が可能となる
- CPUのみを起こすwake lockが可能となる
注: Google Play ポリシーでは、アプリの主要機能が悪影響を受けない限り、アプリを直接的に Android 6.0 以降の電力管理機能(Doze とアプリ スタンバイ)の対象外とするよう要求することを禁止しています。
Android N (7.0) で更に改善
IDLEを2段階(LightとDeep)に分け、段階的に制限をかける
- まずは network access と Sync/Job を制限
- つぎに alarm や wake lock などを制限
Light IDLE へは、端末が静止していなくても突入する