AndroidのDozeモードによる通知の遅延についてまとめ

Other
Created by modifying "Android robot 2014.svg" (© Google (Licensed under CC BY 3.0))

Android6以降のスマートフォンでは、メールの着信通知などの遅延が起こることがあります。これは多くの場合、Android6から追加された「Dozeモード」によるものです。

私自身もこの現象に悩まされていたので、Dozeモードの実際の挙動について調べてみました。ですが一般ユーザーの間ではDozeモードについて、あまり正しい理解がされていないように感じました。

そういうわけで、自分なりにわかったことをまとめておくことにします。

なお私自身もAndroidアプリの開発に関わったことは殆どありませんので、ここに書かれていることは一般ユーザーとしての視点からわかったことです。よって断定できないところが多くあります。また誤っている部分もあるかもしれませんので、ご理解ください。より詳しい情報をお持ちの方は、ぜひとも情報をお寄せください。

まとめ

Dozeモードによる遅延ついてのポイントをまとめました。

  • DozeモードにおけるGCMを使った通知は、GCMの「優先度」により通知のタイミングが変わる
  • GCMではない通信に依存したアプリの通知は、Dozeモード中は一定の制限がかかる
  • アラームなど通信が不要なアプリの通知は、アプリの仕様などにより通知のタイミングが変わる
  • 「電池の最適化」を無効にすることにより、GCMを用いていないアプリのネットワーク接続がDozeモード中でも可能になる(らしい)。ただし実際には上手く通信できないアプリもある
  • アプリ単位のDozeである「App Standby」によって遅延が引き起こされることもある?
  • DozeモードはOSの設定では無効化することができない。アプリを用いることにより実質可能

Dozeモードとは

一定の条件が満たされると、電力消費を抑えるためにDozeモードに入ります。

Dozeモードでは、主に次のような制限がかかります。

  • アプリの実行が制限される
  • アプリのネットワーク接続が制限される

ただし、Dozeモードの合間に挟まれる「メンテナンスウィンドウ」ではそれらの制限が解除され、アプリの実行や通信がまとめて処理されます。メンテナンスウィンドウが挟まれる間隔は、Dozeモードがどのくらい続いているかによって変わり、1時間→2時間→4時間→6時間と間隔が延びていきます。

Dozeモードについて詳しくは → Doze と App Standby 用に最適化する | Android Developers

GCMとそれ以外の通信・通知について

Androidの通信にはGCM(Google Cloud Messaging)を使ったものと、それ以外のものがあります。Dozeモード中はアプリのネットワーク接続が制限されますが、GCMを使ったものはDozeモード中でも可能です。

GoogleはAndroidの省電力化を進めるために、通知が必要な通信には可能な限りGCMを使うように促しています。しかしながら、アプリ制作者が手を入れることができないサーバーとの通信(汎用メールアプリとメールサーバーの関係など)には、GCMは現実的に使えません。よって全ての通信や通知をGCMに置き換えることはできず、GCMではない通信・通知を利用するアプリも少なくありません。

GCMについて詳しくは → Google Cloud Messaging: Overview | Cloud Messaging | Google Developers

GCMの通知

GCMには通知のプライオリティ(優先度)が定められており、このプライオリティによりDozeモード中の通知タイミングが変わります。

プライオリティが「高」である場合は、Dozeモード中でも即時に通知がなされます。プライオリティが「通常」である場合は、Dozeモード中には即時通知がされず、メンテナンスウィンドウで通知がされることになります。

例えばSkypeやLineはプライオリティが高なので即時通知されますが、Gmail(純正アプリを使ったGCM通知の場合)はプライオリティが通常なので、Dozeモード中には通知遅延が発生することになります。

プライオリティは、アプリケーションサーバーからGCMサーバーへ投げられるJSONで定められるため、サーバーに手を入れずしてスマホのアプリ側で優先度を変更することはできません。

GCMではない通知

ネットワーク接続に依存する通知

Dozeモード中はアプリの実行および、GCM以外のネットワーク接続が遮断されます。よってPOPの同期のように定期的な通信が必要なアプリは、メンテナンスウィンドウでしか処理されなくなるため遅延が発生します。

ただし後述の「電池の最適化」を無効にすることにより、アプリの仕様次第で遅延を緩和できるかもしれません。またIMAP IDLEなどを利用したプッシュ通知は、電池の最適化を無効にすることにより、セッションが維持されている間において即時通知が可能なようです。
例外として、ロックスクリーンに表示されるようなアプリ(Radikoなど)はDozeモード中でも通信が許されているようで、これらのアプリであればおそらく即時通知は可能かと思われます。

アラームなどの通知

通知トレイに常駐するアプリによる通知は、おそらくDozeモード中でも即時になされます。ロックスクリーンに表示されているアプリも同様の処理だと考えられます。

その他のアプリについては、基本的にメンテナンスウィンドウまで通知が遅延されることになります。ただし、Dozeモード中の動作を考慮した作りになっているアプリであれば、即時通知が可能なようです(アプリをDozeに適応させる – DozeとApp Standby用に最適化する)。

電池の最適化

Android Developerに拠れば「電池の最適化」を無効にすることにより、Dozeモード中でもアプリによるネットワークの利用が可能になるとされています。

しかしアプリの実行制限などとの兼ね合いからなのか、最適化を無効にしてもネットワーク接続に問題が起こるアプリが見受けられます。

例えばメールアプリである「K-9 Mail」では、電池の最適化を無効にしても、同期通信はメンテナンスウィンドウを除いて行われません。IMAP IDLEについても、既に確立しているセッションは維持されますが、セッション維持のための通信はメンテナンスウィンドウにしかなされません。よってDozeが長時間に及ぶとセッションが切れ、プッシュが効かなくなってしまいます。

Dozeモード中の実行制限を考慮した仕様になっているアプリであれば、このような問題は緩和されるのかもしれません。

電池の最適化について詳しくは → 他のユースケースのサポート – DozeとApp Standby用に最適化する

追記

上述の検証環境においてK-9 Mailのバージョンを5.2以降に更新し、電池の最適化を無効にすることでIMAP IDLEの維持およびPOPの同期が正常に行われることを確認しました。

またLineageOS 14(android7.1.2)では、5.2より前のK-9 Mailでも、電池の最適化を無効にすると通信および通知ができました。

つまり、アプリのDozeモードへの対応状況や、OSとの組み合わせによってDozeモード時の振る舞いが変わることがあります。

App Standby

検証ができていないので、詳しいことはわからないのですが、おまけで触れておきます。

Dozeモードによる影響はシステム全体に及びますが、このApp Standbyは、アプリ単位でDozeに近い処理がされる仕組みのようです。

電源に接続されると解除されるようなので、神経質になる必要はないかとないかと思いますが、知らぬ間にこの状態に嵌ってしまわないよう、頭の片隅に入れて置いたほうが良さそうです。

App Standbyについて詳しくは → アプリ スタンバイを理解する – DozeとApp Standby用に最適化する

Dozeモードを無効化するには

OSの設定としてDozeモードを完全に無効化することはできないようです。Googleの姿勢を見ても、無効化設定が今後追加されることは、あまり期待できそうにありません。

ですがDozeモード入りを防ぐアプリがGoogle Playなどで公開されています。

※これらアプリの具体的な挙動についてはつかめていませんので、使用の際は自己責任でお願いします。

また、TaskerやMacrodroidなどのアプリを用いて、Dozeモード入りを防ぐような処理を定期的に行えば、実質的にDozeを無効化することができます。

最後に

この記事は2016年12月時点でわかっていることをまとめたものです。今後AndroidやGCMの仕様などが変わることにより相違が生じることもあるかと思いますのでご注意ください。

コメント