Android的Doze模式

Android的Doze模式,第1张

也是偶然之间听到这个词的 Doze模式Doze模式

Doze 翻译为打盹, 那么Android的Doze模式呢 , 就是让手机进入了类似打盹的一个状态 , 在这个半梦半醒的状态下 , 手机的后台、服务、广播等都会发生相应的延迟。

Doze模式在Android M(6.0)时引入,定义了一种新的低功耗状态。

若判断用户在连续的一段时间内没有使用手机,就延缓终端中APP后台的CPU和网络活动,以达到减少电量消耗的目的。 注意,这里只是延缓并没有杀死进程。

上一张图来解释一下这个状态吧(这张图是偷的)

横轴为时间轴,纵轴代表运行的状态,红色为活跃,绿色为休眠

从(0,0)点开始,我们可以看到一直是红色的运行状态,这时候手机的状态保持一段时间后就进入了Doze状态:

这样, 手机就可以在保留了活动的情况下,达到了省电的目的.

一旦不满足上述的三种条件时,立即退出Doze模式

Doze并没有杀死进程

1、暂停网络访问。

2、系统忽略所有的WakeLock。

3、标准的AlarmManager alarms被延缓到下一个maintenance window。

但使用AlarmManager的 setAndAllowWhileIdle、setExactAndAllowWhileIdle和setAlarmClock时,alarms定义事件仍会启动。

在这些alarms启动前,系统会短暂地退出Doze模式。

4、系统不再进行WiFi扫描。

5、系统不允许sync adapters运行。

6、系统不允许JobScheduler运行

Android6.0及更高版本还提供了Doze模式白名单列表,通过设置应用程序进入白名单列表, 引导用户设置白名单, 可逃脱Doze模式的各种限制。

在DeviceIdle中有三中类型的白名单列表:

Android 6.0引入的Doze机制在于节省系统耗电量,保护电池,延长电池的使用时间。当设备未连接至电源,且长时间处于闲置状态时,系统会将应用进入Doze,置于 App Standby 模式。而最终的效果,能提升30%的电量续航能力。

该状态与API版本无关,未适配API23以上的应用只要运行在6.0以上的系统上就会受到Doze模式的影响。

当系统处于Doze模式下,系统和白名单之外的应用将受到以下限制:

而位于白名单中的应用可以:

App可以通过 PowerManager.isIgnoringBatteryOptimizations 检查本App是否在系统的白名单列表中。

如果不在,则可以通过在 AndroidManifest.xml 中添加 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限,并且通过发送 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS 的Intent来向用户申请该权限

Doze的原理是在框架层对资源加入了一层资源的调度。在监听系统硬件或者屏幕亮暗的中断信号所发出来的广播,然后对于 JobScheduler 以及 AlarmManager 中任务进行统一调度。

而Doze的源码在于 链接 :

/frameworks/base/services/core/java/com/android/server/DeviceIdleController.java

在 DeviceIdleController 中存在一个 mState 变量来保存当前设备的状态,状态值如下:

DeviceIdleController 继承自 SystemService ,在SystemServer初始化的时候,会初始化该对象,并且将它添加到 ServiceManager 中

而在 onBootPhase ,即设备Boot初始化阶段,也就是所有的SystemService都初始化完毕后, DeviceIdleController 会初始化需要用到的AlarmManager、LocationManager等,并且会调用 updateDisplayLoced

而在 updateDisplayLocked 与 updateChargingLocked 函数中会判断当前屏幕是否亮着,或者是否在充电,如果屏幕熄灭或者没在充电的话,则会调用 becomeInactiveIfAppropriateLocked 开始准备进入Doze状态。

PS:后者是在收到 ACTION_BATTERY_CHANGED 的时候调用的,代表充电的变化

在 becomeInactiveIfAppropriateLocked 函数中:

在接收到 ACTION_STEP_IDLE_STATE 的广播后,会调用 stepIdleStateLocked ,在该函数中,处理所有的状态变化,而在状态处理的过程中还会有几个Alarm被设置。在该函数中,主要涉及一些状态变化,以及闹钟的设置,借图说明:

最终,在进入Doze模式后,会通过 mHandler 发送一个 MSG_REPORT_IDLE_ON 的消息,在该消息中,通过 mNetworkPolicyManager.setDeviceIdleMode 禁止网络连接,通过 PowerManager 来限制WakeLock

默认打开,doze是指待机的时候优化程序的耗电,所以你可以留意一下电池曲线(在设置-电池那里看)。待机的时候耗电的曲线几乎是水平的,那就是doze在起作用了,没什么意外的话在DOZE下,一小时待机时间大概也就耗1%甚至更少的电量哦


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6092510.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存