Android dozeモード。
憎いですね。
バッテリーセーブのためにAndroid Mから導入されましたが、最近の端末(Android Xとか以降)になって、非常に幅を利かせている気がします。
バックグラウンドでアプリを動作させたいアプリ開発者にとっては、もう、本当にやめて頂きたい機能です。
さて、先だって、次の記事を読みました。これ、非常に勉強になりましたね。内部的に、どのようにシステムがDoze(Idle)状態になるのか、ということを説明してくださっています。All英語ですが、読む価値あります。(`・ω・´)
https://www.protechtraining.com/blog/post/diving-into-android-m-doze-875
で、ここでも紹介されている
$ adb shell dumpsys deviceidle
が非常にいろいろなことがわかります。
さて、上記で出力されている内容を解説します。(公式ドキュメントとかないので推測なんですけど。あったら教えて!)
最初のあたりですが
Settings:
light_after_inactive_to=+3m0s0ms
light_pre_idle_to=+3m0s0ms
light_idle_to=+5m0s0ms
light_idle_factor=2.0
light_max_idle_to=+15m0s0ms
light_idle_maintenance_min_budget=+1m0s0ms
light_idle_maintenance_max_budget=+5m0s0ms
min_light_maintenance_time=+5s0ms
min_deep_maintenance_time=+30s0ms
inactive_to=+30m0s0ms… 以下続く
となっていて、おそらく、いつアイドル状態になるのか、という設定が表示されています。モニターの電源をいつ切るかともあるみたいですね。
この端末では、30m にinactive_to なので、30分後にインアクティブという状態になります。
あと、これも役立つ!Idling history というのもあります。
Idling history:
deep-idle: -5h33m20s697ms
normal: -5h15m8s32ms (alarm)
deep-idle: -5h0m2s802ms
deep-maint: -4h0m10s231ms
deep-idle: -3h59m40s8ms
normal: -3h23m45s722ms (notification interaction)
deep-idle: -24m29s944ms
normal: -23m37s96ms (alarm)
いや、これすごくないですか?ここしばらくの、端末がアイドル状態だったのか、Dozeのメンテナンス枠だったのか、などがわかります。
そして、ホワイトリストにあるアプリがなんなのかが続きます。この辺りは、ほかのサイトさんでも詳しいので割愛します。
Whitelist (except idle) system apps:
jp.co.nttdocomo.lcsapp
com.nttdocomo.android.wipe
com.lge.sizechangable.weather.platform
com.nttdocomo.android.anmane2
com.android.providers.calendar
com.android.providers.downloads
最後に、今の端末の状態(たぶん)があります。
mLightEnabled=true mDeepEnabled=true
mForceIdle=false
mUseMotionSensor=true mMotionSensor={Sensor name="LGE Significant Motion Detector Sensor", vendor="qualcomm", version=1, type=17, maxRange=1.0, resolution=1.0, power=0.025, minDelay=-1}
mScreenOn=false
mScreenLocked=true
mNetworkConnected=true
mCharging=true
mMotionActive=false
mNotMoving=true
mLocating=false mHasGps=true mHasNetwork=false mLocated=true
mLastGpsLocation=Location[gps 35.142360,139.631290 hAcc=0 et=+2d4h20m18s373ms alt=0.0 vel=13.89 bear=0.0 vAcc=??? sAcc=??? bAcc=??? mock]
mState=ACTIVE mLightState=ACTIVE
mInactiveTimeout=+30m0s0ms
この時点で、端末の状態はACTIVEということになってますね。端末がスリープになってなくて、画面がONで動作させてます。
強制的にDozeモードにするコマンドは
adb shell dumpsys deviceidle force-idle
ですが、これをやると、さっきの最後のmStateが
mState=IDLE
になります。
開発が、少しはかどりますね!