弊社代表の中西がDroidKaigi 2016にて「Androidの省電力について考える」というタイトルでセッションを担当いたしました。
以下にその際に用いた資料を示します。
また、上記の資料では説明しきれなかったDozeの細かい話について少しだけ補足をします。
Android 6.0 Dozeの状態遷移
Dozeに入るまでの状態の変化については、同イベントでのSmartium株式会社の江川さんによるセッション資料の以下のページが参考になります。
あくまでも簡略的な図であり、正確な状態遷移について知りたい方はコードを追いかけてみてください。
資料には状態を遷移する時間が記されていますが、その情報はDeviceIdleControllerクラスのupdateConstants()メソッドの定義を見るとよいでしょう。状態遷移についてはstepIdleStateLocked()を確認するとわかります。
stepIdleStateLocked()を見ると、状態はACTIVE -> INACTIVE -> IDLE_PENDING -> SENSING -> LOCATINGというように段階を追って遷移していくことが示されています。
LOCATING後すぐにIDLE_MAINTENANCEに遷移し、一定時間後にIDLEへと遷移し、IDLEからもまた時間が経つとIDLE_MAINTENANCEへと遷移するというようなコードとなっています。
Doze突入の判定と継続の条件
DozeServiceクラスを読むことで、どういう条件でDozeに入るのか、またDozeが継続されるのかがわかります。
資料に簡単に記載しましたが、DozeServiceはAPI Level 17で導入されたDaydreamという機能をベースに実現されています。言いかえると「DozeServiceはDreamServceを継承したサービス」です。
Daydreamはスクリーンセーバーを実現する機能であり、画面がOFFになるタイミングで働き始めます。そのタイミングから各種の条件が成立するかの監視を開始し、成立すると先に挙げた状態遷移が行われるというわけです。
資料にも簡単に記載しましたが、面白いところとしてはコードの中でpulseと表現されている事象(たとえば端末が動かされる)が発生することがIDLE状態から抜けるトリガとなるのですが、近接センサ(proximity sensor)で端末が何かの物体と近接している場合には抜け出すトリガは捨てるという処理があります。コードを細かく見ていきコメントなども確認するとわかるのですが、これは端末がポケットやかばんに入っている場合にはDozeで省電力モードのままとするための処理です。
Dozeはディープスリープか?
ディープスリープは端末として最低限の電力消費まで機能を落としている状態であるとするなら、弊社で調べた限りではDoze自体がディープスリープとは言えないのではないかと考えております。
いわゆるACPU(アプリが動作するプロセッサ)は動作しシステムとしてはネットワーク通信もしている状態です。除外設定されたアプリは普通に動いています。そうでなければ高優先度のGCMを受け取って即時に対象のアプリに渡すということもできません。
Dozeによる省電力に対して非協力的なアプリが多いと、省電力効果は限定的になるだろうと考えられます。
そのため、Androidの将来バージョンにおいて更なる強制的な制限が行われることを避けるためにも、アプリ開発者ができるだけ省電力に対して協力的になることは非常に大事なことだと考えております。