也是偶然之间听到这个词的 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
如果用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式。 在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。 这还可以阻止应用访问网络并推迟其作业、同步和标准闹铃。
系统会定期退出低电耗模式一会儿,好让应用完成其已推迟的 Activity。在此维护时段内,系统会运行所有待定同步、作业和闹铃并允许应用访问网络。
而 Android 7.0 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了低电耗模式。
7.0进入Doze模式分两个阶段: 对App行为的限制分为light idle(浅度doze)和deep idle(深度doze) .当设备处于非充电状态且屏幕已关闭一定时间后,设备会进入低电耗模式并应用第一部分限制(light idle):关闭应用网络访问、推迟作业和同步。如果进入低电耗模式后设备处于静止状态达到一定时间,系统则会对 PowerManager.WakeLock、AlarmManager 闹铃、GPS 和 WLAN 扫描应用余下的低电耗模式限制(deep idle)。无论是应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供简短的维护时间窗口,在此窗口期间,应用程序可以访问网络并执行任何被推迟的作业/同步。
在每个维护时段结束后,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹铃。 随着时间的推移,系统安排维护时段的次数越来越少,这有助于在设备未连接至充电器的情况下长期处于不活动状态时降低电池消耗。
图中,横轴表示随着时间的推移,橙色表示设备处于唤醒运行状态,绿色表示低电耗(Doze)休眠状态当设备处于on battery(利用电池供电,也就是未插接电源),screen off(关闭屏幕),stationary(静止状态,7.0以后非静止状态亦可)保持以上条件一段时间之后,设备就会进入Doze模式.
maintenance window (低电耗(Doze)模式提供了定期维护时段,可供应用使用网络并处理待定Activity),Doze模式下会定期的进入maintenance window,但进入的间隔越来越长
一旦用户通过移动设备、打开屏幕或连接到充电器唤醒设备,系统就会立即退出低电耗模式,并且所有应用都将返回到正常 Activity。
在低电耗模式下,您的应用会受到以下限制:
应用待机模式: 允许系统判定 应用在用户未主动使用它时,将应用置为空闲状态通俗的说是指用户在一段时间内没有使用某个app,系统就会让这个app处于空闲状态,空闲状态会限制app访问网络,推迟app的作业和同步任务
当用户有一段时间未触摸应用,且除以下条件外,都将被标记为空闲状态
当用户将设备插入电源时,系统将从待机状态释放应用,从而让它们可以自由访问网络并执行任何待定作业和同步。 如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲应用访问网络。
低电耗模式
您可按以下步骤测试低电耗模式:
您可能需要多次运行第二个命令。不断地重复,直到设备变为空闲状态。
应用待机模式
要在应用待机模式下测试您的应用,请执行以下 *** 作:
亲测MIUI 9.5执行 adb shell am set-inactive com.tencent.mobileqq true 结果始终为: Idle=false 而测试其他包名则没有异样,也就是小米针对QQ这种用户量大的即时通讯软件做了针对性处理
通过妥善管理网络连接、闹铃、作业和同步并使用 GCM 高优先级消息,几乎所有应用都应该能够支持低电耗模式。对于一小部分用例,这可能还不够。 对于此类用例,系统为部分免除低电耗模式和应用待机模式优化的应用提供了一份可配置的白名单。
在低电耗模式和应用待机模式期间,加入白名单的应用可以使用网络并保留部分 wake locks。 不过,正如其他应用一样,其他限制仍然适用于加入白名单的应用。 例如,加入白名单的应用的作业和同步将推迟(在 API 级别 23 及更低级别中),并且其常规 AlarmManager 闹铃不会触发。通过调用 isIgnoringBatteryOptimizations(),应用可以检查自身当前是否位于豁免白名单中。
用户可以在 Settings >Battery >Battery Optimization 中手动配置该白名单。或者,系统会为应用提供请求用户将应用加入白名单的方式。
如何将非系统app预置到Doze的白名单中
在请求用户将应用添加到白名单之前,请确保应用符合加入白名单的可接受用例。
Doze模式的实现主要在/frameworks/base/services/core/java/com/android/server/DeviceIdleController.java
以上主要内容参考自Google官方文档.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)