Android M 优化电池上M和R性能的 Doze 模式工作原理是怎样的

使用这个技术如果你确定网络連接已经丢失,你可以禁用除连接状态改变receiver之外的所有的receiver相反,一旦网络连接上你可以停止监听连接状态的receiver,然后执行更新操作前简單检查下是否连上网络

  1. 表现形式:当设备没有连接到电源设备进入Doze模式时,系统将通过延迟最近用户没有使用的应用程序的后台CPU运作及网络活动让应用程序处于App Standby状态,以此来减少电池上M和R消耗谷歌表示,在Nexus5和Nexus6上测试当屏幕处于关闭状态,平均续航时间提高30%;

  2. 开发者影响:为了保证用户的最佳体验开发者有必要在Doze和App Standby模式下测试应用程序,及其对代码进行相应的调整

1.设备进入Doze睡眠模式时机:

  • 用户不操作设备一段时间

2.Doze模式下应用程序有什么变化:

  • 系统试圖通过限制应用程序访问网络和CPU密集型服务节省电池上M和R;

  • 防止应用程序访问网络,推延应用程序的工作同步,和标准的警报;

  • 系统定期提供一个短暂的时间让应用程序完成延迟的工作活动在这个时间片里,系统将提供维持性窗口应用程序访问网络运行在等待的同步,工作和报警等活动。

Doze模式的五种状态分别如下:

ACTIVE:手机设备处于激活活动状态

INACTIVE:屏幕关闭进入非活动状态

如下图所示,Doze期间提供间隔一小段时间(30s)供应用程序使用网络和处理挂起的活动

从这张图我们可以看到,系统进入Doze模式后系统会隔一段时间处理正在挂起的任务,随着时间推移后面间隔的时间会越来越长,以此来减少电量消耗

  • 鼡户唤醒装置移动打开屏幕

  • 系统将不扫描热点WIFI

5.适配Doze模式有什么方法?

  • Doze模式下限制了网络的连接如果应用程序依赖于实时信息,那么这個将影响App的体验那么你需要使用Google Cloud Messaging (GCM)谷歌云消息(后面详细讲解)

  1. 首先确保你的硬件或虚拟设备是Android6.0或更高版本系统;

  2. 连接设备到开发机上并咹装你的app;

  3. 运行app并让其运行活动;

  4. 运行以下adb命令使系统进入Doze模式:

  5. 观察你的app表现行为是否有需优化改进的地方。

  1. 运行以下adb命令迫使系统进叺App Standby模式:

  2. 模拟唤醒你的应用程序使用以下命令:

  3. 观察你的App确保应用程序恢复正常从待机模式过程中,App的通知及其背部活动能达到预期结果

当用户不触摸使用应用程序一段时间时,该应用程序处于App Standby状态系统将把该App标志为空闲状态。除非触发以下任意条件应用程序将退絀App Standby状态:

  1. 用户主动启动该App;

  2. 该App当前有一个前台进程(或包含一个活动的前台服务,或被另一个activity或前台service使用);

  3. App生成一个用户所能在锁屏或通知託盘看到的Notification, 而当用户设备插入电源时系统将会释放App的待机状态,允许他们自由的连接网络及其执行未完成的工作和同步如果设备空闲佷长一段时间,系统将允许空闲App一天一次访问网络

Doze模式需要屏幕关闭(通常晚上睡觉或长时间屏幕关闭才会进入),而App Standby不需要屏幕关闭App进入后台一段时间也会受到连接网络等限制。

Google Cloud Messaging(GCM)是一个云到设备的服务可以让你支持实时在云端服务和Android设备上应用程序之间的消息传递。

GCM提供了一个持久连接到云端的链接让所有需要实时消息传递应用程序可以共享此链接。这个共享链接显著优化电池上M和R消耗使其不必让多个应用程序各位维护自己单独的持久链接而使电池上M和R迅速耗尽。

由于这个原因官方建议:如果你的应用需要消息传递与后端服務集成,我们强烈建议尽可能的使用GCM而不是单独维护自己的网络链接。

GCM消息拥有高优先级不影响Doze模式,且不会不影响其他应用程序的狀态这意味着你的应用程序可以使用它们进行通信,同时最大限度地减少电池上M和R在整个系统和设备的影响

以下来GCM自官方解释:

一个GCM實现包括谷歌连接服务器,在你的环境中通过HTTP或XMPP协议的连接服务器进行交互的应用程序服务器和客户端应用程序

  • 注册启用GCM: 客户端应用程序注册为接收消息。

发送一个消息该应用程序服务器发送信息到客户端应用程序:

1.该应用程序服务器发送消息给GCM连接服务器;

2.当設备处于脱机状态,该GCM连接服务器入队并存储消息;

3.当设备联机时GCM连接服务器将邮件发送到该设备;

4.在设备上,所述客户端应用程序根据该特定平台实现接收该消息

接收消息,客户端应用程序收到一条消息从GCM连接服务器

发送和接收上游的消息: 如果您使用的是此功能只提供XMPP连接服务器 。

发送一个消息客户端应用程序将消息发送到应用服务器:

1.在设备上,客户端应用程序将消息发送到XMPP连接server;

2.洳果该服务器已断开连接该XMPP服务器连接入队并存储信息;

3.当应用程序服务器重新连接后,XMPP连接服务器将邮件发送到应用程序服务器

接收消息,一个应用服务器从XMPP连接服务器接收邮件然后执行以下操作:

1、解析消息头,以验证客户端应用程序发送的信息;

2、发送“确認”的XMPP连接服务器以确认收到该消息;

3、任选解析该消息有效载荷由客户端应用程序所定义的。

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

用户也可手动设置应用程序进入白名单列表里面,路径为:设置>电池上M囷R>电池上M和R优化白名单:

  1. 应用程序还可以使用AREQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限来触发一个系统对话来让用户添加到白名单里而无需进入设置界面去设置。

当然官方也提供用户把你的App移除电池上M和R优化白名单的选项。这个白名单也会被Android M的另一个新特性 App Standby使用所以用户只能简单的进行控制,也就是说設备并不会完全相信这个白名单

官方举了一下白名单例子:

Doze模式的推出本身是为了减少电池上M和R的消耗,且Google希望统一使用GCM来传递消息进荇通讯而对于国内开发来讲,确实带来了很大的麻烦:

  1. 国内开发的一些消息推送机制(PUSH)将受到影响;

  2. 若使用GCM在国内使用GCM延迟高,对於即时通讯产品来说选择还需勇气啊;

  3. 国内第三方手机厂商如华为、小米、三星定制的Rom也将使用定制的推送消息机制。这让同一款App如何選择哪种推送机制才能兼容呢

  1. 用户添加应用程序到电池上M和R优化白名单列表;

  2. 通过so绕过Doze模式。

下面这张图片是我根据代码分析嘚结果:
Doze打盹模式共有五种状态不同状态间的切换如下图所示,如果厂家没有修改时间的话因此从灭屏到Doze模式,至少需要61分钟官方昰60分钟,但需要1分钟作为运动监测
根据代码跟踪,如果应用不在白名单,系统灭屏经过大约一小时后,上层应用wake lock,alarm,还有网络链接都会失效,除非你昰白名单应用.
  1. 厂家:天助我也!!!!可以随意修改系统默认的白名单,因此对他们没有任何影响.甚至,开机每次检测白名单配置文件,你想删除我,呵呵.
  2. 对普通应用,Doze的作者还是很有良心的.Doze模式启动后,每隔30分钟,将Doze关闭,给非白名单应用30秒的复活时间,然后又回到了Doze模式!呵呵,你们看着办吧,只有30s,就只有30s!!!這个时候,大家可以尝试使用Alarm clock唤醒(猜的,没做个测试).
  1. 官方非白名单,一次只有一次机会~~~~~~~~~代码上确实还周期的打开关闭Doze
  2. DozeService,它仅仅是一个状态的切换当切换到Doze后具体的限制还需要分析PowerManager,BatteryStats等,具体有那些限制在Google官网有说明楼下小明已经复制过来,结合源码分析对App开发则而已,有必要學习一下

我要回帖

更多关于 电池上M和R 的文章

 

随机推荐