一、背景
功耗管理是由软件、处理器、外设、电源等一起构成的系统问题。
App中很小的低效行为在整个系统中累加后,会对电池寿命、性能、响应速度和温度产生明显的影响。作为app开发人员,我们有责任确保我们的app尽可能高效地运行。使用苹果推荐的API,以确保系统可以正确地判断如何更好地管理我们的app和app使用的各种资源。分批、减少网络操作。尽可能避免不需要的UI刷新。功耗大的操作应该在用户的控制之中。比如,如果用户正在玩一个视图非常复杂的大型游戏,电量消耗很快用户是可以理解的。不响应用户操作时,app尽量不要执行任何操作。
通俗的讲,电源管理就是:“想让马儿跑,不想马吃草”。不过,从能量守恒的角度,想让马儿跑多快、跑多久,就一定要让它吃相应数量的草。那么我们就退而求其次:“只在需要马儿跑时,才让它吃草”。这就是电源管理的核心思想。
在计算机世界中,上面的方法是再平常不过的了,而且控制的远比这些精细。因为计算机是人类设计出来的,而马儿却是经上帝之手。不过通过马儿的例子,我们可以总结出电源管理的基本行为:
a, 实时的关闭暂时不使用的部分(可称作“工作状态到非工作状态的转移”)。例如手机在口袋时,屏幕没必要亮。
b, 当需要重新使用那些已关闭部分时(可称作“非工作状态到工作状态的转移”),不能有太长时间的等待,且转移过程不能消耗太多的能量。上面的方法1就是一个反面教材,但在计算机的世界里,情况会好很多。
二、不同系统的功耗管理
2.1、Linux
电源管理(Power Management)在Linux Kernel中,是一个比较庞大的子系统,涉及到供电(Power Supply)、充电(Charger)、时钟(Clock)、频率(Frequency)、电压(Voltage)、睡眠/唤醒(Suspend/Resume)等方方面面(如下图)
注2:Framework是一个中间层的软件,提供软件开发的框架。其目有三:一是屏蔽具体的实现细节,固定对上的接口,这样可以方便上层软件的开发和维护;二是尽可能抽象公共逻辑,并在Framework内实现,以提高重用性、减少开发量;三是向下层提供一系列的回调函数(callback function),下层软件可能面对差别较大的现实,但只要填充这些回调函数,即可完成所有逻辑,减小了开发的难度。
2.2、Android
第一类是Camera、FlashLight、MediaPlayer等一般传感器或设备的模块的模块。其工作功率基本和额定功率保持一致,所以模块电量的计算只需要统计模块的使用时长再乘以额定功率即可。
第二类是Wifi、Mobile、BlueTooth这类数据模块。其工作功率可以分为不同的档位,比如,当手机的 Wifi 信号比较弱的时候,Wifi 模块就必须工作在比较高的功率档位以维持数据链路,所以这类模块的电量计算有点类似于我们日常的电费计算,需要 “阶梯计费”。
第三类是屏幕,CPU模块。CPU 模块除了每一个CPU Core 需要像数据模块那样阶梯计算电量之外,CPU 的每一个集群(Cluster,一般一个集群包含一个或多个规格相同的 Core)也有额外的耗电,此外整个 CPU 处理器芯片也有功耗。简单计算的话,CPU 电量 = SUM (各核心功耗) + 各集群(Cluster)功耗 + 芯片功耗 。屏幕模块的电量计算就更麻烦了,很难把屏幕功耗合理地分配给各个 App, 因此 Android 系统只是简单地计算 App 屏幕锁(WakeLock)的持有时长,按固定系数增加 App CPU 的统计时长,粗略地把屏幕功耗算进 CPU 里面。
每个模块的功耗大小位于framework的power_profile.xml文件中,由厂商自己提供,里面规定了每个模块的功耗,下面是一台一加9的测试机的power_profile文件
2.3、IOS
三、工具
PowerTOP 是一款开源的命令行工具,用于诊断的功耗问题,查看系统中软件应用的活跃程度。此外,它提供了用于试验的各种电源管理设置的交互方式。
可用的最新版本 PowerTOP 2.6.1,带来了一堆修正。
四、参考
iOS进阶--App功耗优化看这篇就够了 - 简书
linux查看软件的功耗,用于诊断功耗的软件 PowerTOP-CSDN博客
Linux功耗管理(1)_整体架构_linux usb端口功耗-CSDN博客
Android耗电原理及飞书耗电治理 - 知乎