我的手机灭屏了为什么还在耗电呢,为什么手机息屏也会耗电

读者可能会有这种体会和感受 , 昨晚的睡眠时间和平时相当,但是为何早上起来特别困,如下来自健康手环的睡眠监测数据或许可以给你答案 。

我的手机灭屏了为什么还在耗电呢,为什么手机息屏也会耗电

文章插图
可知整个夜间睡眠时间段,睡眠质量通过深睡、浅睡、清醒三种等级来表征,你记忆中的夜间睡眠,实际情况可能是翻来覆去整个人都处于清醒的状态,这种情况越多,睡眠质量也就越差 。该监测数据,可为作息规划与改善提供数据支撑 。
【我的手机灭屏了为什么还在耗电呢,为什么手机息屏也会耗电】对于手机而言,灭屏状态下的表现其实与人的睡眠大体类似,当系统处于深度睡眠模式时,功耗会低很多;相反,当系统处于唤醒状态时,功耗会大很多,此时手机自然也就耗电快 。本文,我们来介绍下手机灭屏耗电这回事 。
当按下电源键时,系统就会触发熄屏与休眠流程,概述如下:
我的手机灭屏了为什么还在耗电呢,为什么手机息屏也会耗电

文章插图
在该流程中,PhoneWindowManager负责对电源键作出响应,然后通过goToSleepFromPowerButton->goToSleep调用向PowerManger传递休眠动作,作为PowerManger中goToSleep的实现者PowerManagerService,则透过setHalAutoSuspendModeLocked -> mNativeWrapper.nativeSetAutoSuspend间接调用native suspend_control(android.system.suspend@1.0-service) 中的enableAutoSuspend关键函数 。而suspend_control(android.system.suspend@1.0-service)则通过kernel pm core提供的各类sysfs节点对系统休眠条件与流程进行检查和控制 。在linux kernel pm core中 , main这一部分与suspend相关的模块有autosleep、wakeup count、task freeze、wakelock等 , 主要负责提供相应的用户态接口以及处理与硬件无关的核心逻辑 。之后pm driver则负责处理硬件相关的休眠工作 , 分device driver抽象层的逻辑控制 , 以及具体的平台休眠实现与设备休眠实现 。
再次转到灭屏耗电这个维度,通过如上的信息,可知影响耗电的几个主要关键维度:是否有触发休眠动作、触发休眠后是否执行成功、是否频繁退出休眠状态、平台级的休眠状态、外围设备的耗电状态等 。
Android框架batterystats模块对系统的耗电表现有相对完整的理解和阐述,其对硬件耗电表现(eg:cpu、wifi、gps、bluetooth)以及软件行为(eg:休眠、持锁、冻结、唤醒、Job)都有丰富的数据统计 。以应用软件在cpu上的耗电表现为例,其统计该应用在每个cluster上的cpu执行时间,结合cpu每个频点的功耗数据,加权累计后即可算出该应用的cpu耗电情况 , 关键代码段以及配置文件摘录如下:
我的手机灭屏了为什么还在耗电呢,为什么手机息屏也会耗电

文章插图
为了便于开发人员调试分析,Batterystats的数据可以通过dumpsys batterystats命令输出,且谷歌开发了battery-historian工具以图形界面的方式展示batterystats统计的关键信息 。源代码以及搭建方法在https://github.com/google/battery-historian官方网站中有阐述,效果示例如下:
我的手机灭屏了为什么还在耗电呢,为什么手机息屏也会耗电

文章插图
对于手机灭屏下的表现,我们可以从图中得到很多耗电相关的信息,关键信息摘录如下:
CPU running:用于表征系统是否有进入休眠状态,并记录唤醒源信息 。休眠时间占比越短,耗电会越差 。Userspace wakelock:用于表征当前是否存在用户空间申请的wakelock,并且这里会展示系统被唤醒后首次申请的wakelock 。值得注意的是,用户空间申请的wakelock的总时长和首次申请的wakelock并不存在必然的联系,如果要进一步确认总时长分别是哪些wakelock引起的,可以执行dumpsys batterystats --enable full-history命令后得到所有wakelock的过程记录功能,从而找到答案 。Long wakelocks:表征是否存在长时间持有的wakelock 。当持有时间超过1分钟时,则会被标记,此类的情况的出现会对灭屏功耗造成较大影响 。Kernel only uptime:当所有用户态的wakelock都释放后,如果kernel未休眠,那么这部分的时间会被记录到这个字段 。Screen:表征当前的亮灭屏状态 。Doze:表征android doze省电模式的状态 。值可为off foze、light doze、full doze这几种,当用户一段时间内没有使用手机且满足进入Doze的条件时,会限制应用的后台活动,以达到减少功耗的目的 。具体限制的动作比如暂停网络访问、忽略应用持有的WakeLock、不再进行wifi扫描、不允许sync adapters和JobScheduler运行等 。不过为了保证基础功能与用户体验,系统进程、核心应用、前台服务进程并不会受到限制 。其它:gps状态、通话状态、联网状态与类型、wifi状态等,都与灭屏表现息息相关,篇幅有限,不详细阐述 。上文batterystats模块中”cpu running“指标阐述的是休眠与否这个状态 。然而,linux系统可分为三种状态:工作态、空闲态、休眠态 。系统工作态与空闲态这两种状态下的运行表现 , 对灭屏功耗同样起着至关重要的影响 。