功耗
功耗,通俗的理解即电流通过导体使设备运行,导体本身的电阻将电能转换为热能的过程,因此,通常功耗测试也叫电量测试。
耗电量测试是指测试App在运行过程中消耗的能量。设备运行期间消耗能量公式:W = w * t = U * I * t
w
表示单位时间耗电量U
为电池供电电压I
为电流值t
为测试时间 通常来说U
可以认为不变,对于平稳的测试过程,耗电量与测试时间成正比。
移动设备功耗
由于移动设备的电池容量限制,所以对于App的功耗也是需要考虑的一个方面。Android的很多特性都比较耗电(如屏幕、GPS
、sensor
传感器、唤醒机制wakelock
、CPU
、连网等等),我们必须要慎重检查APP的电量使用,以免导致用户手机过度耗电发热,带来不良体验。
主要的耗电场景有:
screen
:屏幕显示画面会耗电。cpu
:复杂的运算逻辑、死循环等会直接导致CPU负载过高,会导致耗电;wakelock
:唤醒锁,只要有应用拿到wakelock
这个锁,系统就无法进入睡眠状态。频繁wakelock
或者申请了wakelock
没有释放,会导致耗电;wifiscan
和wifilock
:wifiscan
和wifilock
也会导致手机的wifi
模块处于激活状态,频繁的wifiscan
或者wifilock
不释放,会导致耗电;sensor
:传感器打开后会导致系统持续监听设备外围环境的数据变化,使用后不及时关闭,会导致耗电;network
:大量的数据传输,或者长时间的移动网络数据传输会导致耗电;gps
:gps
也是一种传感器,定位中完成后没有及时关闭,会导致耗电。
Android功耗
目前很多定制Android 系统支持查看App耗电量查看,如下图所示是魅族Flyme
系统的应用电量消耗图。
Android 电量测试
API
按照Android 系统规则,设备制造商必须在/frameworks/base/core/res/res/xml/power_profile.xml
中提供组件的电源配置文件,该配置文件定义了每个耗电项的具体计算单位,内容样例可以点击查看 power_profile.xml
但是从Android 4.4开始系统电量权限做了严格的限制,随着现在系统版本越来越高,使用API获取电量不太现实。
硬件工具
基于基于硬件的测试方案,使用用电量表来测试手机耗电量。该方法优点是测试比较精准,同样缺点也很明显缺点:采购成本高,测试的是整个手机,不是被测APP,测试时要减少系统本身和其他app的干扰。得到数值无法直接参考,不知道合理还是偏高。不能给出进一步参考,比如具体哪个app方面消耗电量比较多。
batterystats
使用dumpsys batterystats
命令可用来生成关于设备电池使用情况的统计数据,这些数据按唯一用户 ID (UID)
进行整理。统计信息包括以下内容:
- 电池相关事件的历史记录
- 设备的全局统计信息
- 每个
UID
和系统组件的大致用电量 - 单个应用的每个数据包占用的移动网络毫秒数
- 系统
UID
汇总统计信息 - 应用
UID
汇总统计信息
bugreport
Android为了方便开发人员分析整个系统平台和某个App在运行一段时间之内的所有信息,专门开发了bugreport
工具。输入命令adb bugreport [filepath]/
即可执行信息采集,并生成zip
或者txt
文件格式的数据文件。
Battery Historian
Batterystats
是包含在 Android
框架中的一种工具,用于收集设备上的电池数据。您可以使用 adb
将收集的电池数据转储到PC,并创建一份可使用分析的报告。Battery Historian
会将报告从 Batterystats
转换为可在浏览器中查看的 HTML
报告。
注意:要使用
Batterystats
和Battery Historian
,您需要一台搭载 Android 5.0 或更高版本且启用了 USB 调试功能的移动设备。
电量数据收集
- 收集电池的历史数据
λ adb shell dumpsys batterystats --enable full-wake-history
Enabled: full-wake-history
- 重置电池数据
adb shell dumpsys batterystats --reset
Battery stats reset.
- 断开设备与电脑的连接,以便只从设备的电池中消耗电流,然后执行指定的App进行相关操作。
- 使用命令
adb bugreport
导出电量信息结果,这里需要注意的是Android 7.0
以上系统版本和Android 7.0
以下命令不同。
- Android 7.0以上系统版本:
adb bugreport C:UsersShuqingDesktopbugreport.zip
/data/user_de/0/com.android.shell/files/bugreports/bugreport-meizu_M1822_...-01-44.zip: 1 file pulled, 0 skipped. 15.4 MB/s (3393069 bytes in 0.210s)
- Android 7.0以下系统版本
获取bugreport信息(记录了从开机之后详细的dumpsys,dumpstate
和logcat
信息)
adb bugreport > [path]bugreport.txt
获取dumpsys信息(获取系统信息:比如内存CPU,accounts,activities,wifi
等信息)
adb shell dumpsys batterystats > 存放的电脑地址/batterystats.txt
或者获取指定的应用程序的dumpsys信息:
代码语言:javascript复制adb shell dumpsys batterystats > 包名 > 存放的电脑地址/batterystats.txt
电量数据解析
Battery Historian
一款由Google提供的Android系统电量分析工具,从手机中导出bugreport
文件上传至页面,在网页中生成详细的图表数据来展示手机上各模块电量消耗过程,最后通过App数据的分析制定出相关的电量优化的方法。
- 使用
Battery Historian
需要在本地安装,最简单的方法使用docker
安装,然后执行如下命令。
docker run -d -p 9999:9999 bhaavan/battery-historian
执行完成后使用浏览器打开链接:http://localhost(IP):9999
即可看到Battery Historian
界面。
注意
上传生成的报告文件然后点击submit
提交即可。原因是因为web
某些资源没有加载出来,其中的一些资源需要访问Google
服务器,但是这些资源被墙了,无法访问。只要解决了墙的问题,submit
的问题也就迎刃而解了。
如果不想在本地搭建环境,那么可以访问在线的解析平台:https://bathist.ef.lc/ (网站可能打不开,原因你懂的)
查看整体电量数据
上传数据解析之后如下图所示,可以查看到详细数据展示。
- 横坐标是一个时间范围。以重置为起点,获取
bugreport
内容时刻为终点。坐标的间隔,会随着时间的长度发生改变。 - 纵坐标是消耗电量的具体内属性。
- 黑色曲线是测试过程中整体的电量信息。将
Show bars
的勾选去掉可以只展示该曲线。
重点参数说明:
battery_level
:剩余电量,可以看出电量的变化。plugged
:充电状态,这一栏显示是否进行充电,以及充电的时间范围。Longwakelock
:该属性记录了长时间使设备保持唤醒的进程。screen
:屏幕是否点亮。可以用于考虑睡眠状态和点亮状态下电量的使用信息。top app
:该栏显示当前时刻哪个app处于最上层,就是当前手机运行的app。用来判断某个app对手机电量的影响。Coulomb charge
电量消耗值,单位毫安时mAh
。Temperature
电池温度。discharge rate
放电率,是表示电池放电快慢的一种度量。
查看单个进程电量消耗数据
在App Selection中选择指定的App进程,即可查看该进程的耗电数据。
iOS功耗测试
Energy Log
启动Instruments,选择你的设备和要检测的app,打开Energy Log
,如下图所示:(充电然后进行电量测试不合理)
选择设备和应用进行执行之后可以查看到电量消耗情况
iOS电量测试
1.打开设置-开发者-Logging
- 打开Energy,然后点击开始录制。
- 执行应用操作
- 完成后,返回“设置”>“开发者”>“Logging”,然后点击“stop recording”。
- 连接设备,打开
instrument
,启动Energy Log
,从设备导入数据。
- 导入完成后即可查看数据信息。