读者可能会有这种体会和感受,昨晚的睡眠时间和平时相当,但是为何早上起来特别困,如下来自健康手环的睡眠监测数据或许可以给你答案。
可知整个夜间睡眠时间段,睡眠质量通过深睡、浅睡、清醒三种等级来表征,你记忆中的夜间睡眠,实际情况可能是翻来覆去整个人都处于清醒的状态,这种情况越多,睡眠质量也就越差。该监测数据,可为作息规划与改善提供数据支撑。
对于手机而言,灭屏状态下的表现其实与人的睡眠大体类似,当系统处于深度睡眠模式时,功耗会低很多;相反,当系统处于唤醒状态时,功耗会大很多,此时手机自然也就耗电快。本文,我们来介绍下手机灭屏耗电这回事。
当按下电源键时,系统就会触发熄屏与休眠流程,概述如下:
在该流程中,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官方网站中有阐述,效果示例如下: