Android耗电量测试

本文介绍移动设备应用耗电测试的两种方法:使用硬件测试仪和BatteryHistorian工具。硬件测试仪能精确测量电量消耗,但需拆机并投资硬件。BatteryHistorian则通过可视化分析,展示系统级和应用级事件,适用于Android5.0及以上版本,帮助开发者理解应用对电池的影响。

背 / 景 / 介 / 绍

目前对于移动设备而言,电量是很重要的一个方面。现在大家使用手机基本每天都需要充电,所以用户也非常关注耗电的问题,如果应用设计不合理导致电量大量消耗,那么对于关注耗电的用户而言,这款应用将会是首要卸载目标。因此,作为测试人员,我们也应该对应用的耗电做一些针对性测试。

Android电量测试

1

使用硬件测试仪

如安捷伦N6705B,这种的硬件功耗测试仪可以比较精确的测试手机的电量消耗。

使用方法:

这个方法需要拆卸手机,将手机电池拿掉,将电量表串接在手机和外部电源之间,这样手机的供电就会经过电量表,可以获取比较准确的电量数据。

优点:获取的电流数据比较精确

缺点:需要硬件投入,需要拆卸手机,只能获得手机整体的电流值,无法判断某一个app在哪些方面消耗电流多少。

2

基于Battery Historian查看电量消耗

Battery-Historian是谷歌推出的一款专门分析Bugreport的工具,是谷歌2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具,是一款对于分析手机状态,历史运行情况很好的可视化分析工具,当设备在使用电池的时候,它可以使开发者们看到系统级和应用级事件图表,在图表时间轴上可以缩放和平移,能够直观的看到自上一次充满电到现在设备电池的统计汇总信息,它可以选中一个应用程序来检查该应用影响电池电量的一些参数。

目前Battery historian有两个版本,Battery Historian 1.0 通过python脚本转换成html文件,而新版本 Battery Historian 2.0 发布了,新版本带来了很多的改进:更清晰的报告,每个应用程序的摘要,更快的执行等等。

一、安装

因为2.0版本的一些优势,建议大家安装2.0版本,安装上可能需要花费一些时间。目前网上安装教程较多,这里不做详细介绍。

二、使用方法

1、先使用adb kill-server断开服务,再使用adb start-server开启adb服务。这一步很重要,因为我们开发时做电量记录会打开很多可能造成冲突的东西。

2、重置电池数据收集数据,我们在开始的时候需要通过以下命令来打开电池数据的获取以及重置:

adb shell dumpsys batterystats --enable full-wake-history

adb shell dumpsys batterystats --reset

执行的效果如下:

以上即为一些初始化操作,避免了干扰数据,之后拔掉数据线。

1)执行一些想要测试的场景。

2)重新连接手机,导出bugreport文件(adb bugreport > bugreport.txt)

3)打开battery historian(localhost:9999),将bugreport导入

4)结果如下

各参数意义

battery_level: 电量,可以看出电量的变化

plugged: 充电状态,这一栏显示是否进行了充电,以及充电的时间范围。

Screen: 屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息。

Top: 该栏显示当前时刻哪个app处于最上层,就是当前手机运行的app,用来判断某个app对手机电量的影响,这样也能判断出该app的耗电量信息。该栏记录了应用在某一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助。

wake_lock*: wake_lock该属性是记录wake_lock模块的工作时间。是否有停止的时候等。

running: 界面的状态,主要判断是否处于idle的状态。用来判断无操作状态下电量的消耗。

wake_lock_in: wake_lock有不同的组件,这个地方记录在某一个时刻,有哪些部件开始工作,以及工作的时间。

Gps: gps是否开启。

phone_in_call: 是否进行通话。

Sync: 是否跟后台同步。可以把鼠标停在某一项上面。可以看到何时sync同步启动的,持续时间Duration多久。电池容量不会显示单一行为消耗的具体电量,这里只能显示使用电池的频率和时长,你可以看分时段的剩余电量来了解具体消耗了多少电量。

Job: 后台的工作,比如服务service的运行。

data_conn: 数据连接方式的改变,上面的edge是说明采用的gprs的方式连接网络的。此数据可以看出手机是使用2g,3g,4g还是wifi进行数据交换的。这一栏可以看出不同的连接方式对电量使用的影响。

Status: 电池状态信息,有充电,放电,未充电,已充满,未知等不同状态。这一栏记录了电池状态的改变信息。

phone_signal_strength: 手机信号状态的改变。这一栏记录手机信号的强弱变化图,依次来判断手机信号对电量的影响。

Health: 电池健康状态的信息,这个信息一定程度上反映了这块电池使用了多长时间。这一栏记录电池状态在何时发生改变,上面的图中电池状态一直处于good状态。

Plug: 充电方式,usb或者插座,以及显示连接的时间。这一栏显示了不同的充电方式对电量使用的影响。

优点:结果直观,有详细的耗电数据

缺点:不支持5.0以下的android系统

耗电模块总结:

获取数据注意事项:

获取测试结果时我们也要注意数据的有效性,避免数据误差,让数据更有效的说明问题,下面提供两种方法,来提高获取数据的有效性。

一、横向对比法:分两步测试,第一步测量手机硬件运行消耗的电量;第二步测试手机硬件和软件运行综合的耗电量。最后将两次的耗电进行对比,得出软件消耗的电量大小;

二、纵向对比法:同时进行两台手机,其中一台手机不运行软件,另一台手机运行软件;分别获得两台手机的耗电量,对比两台手机耗电量差异,得出软件消耗的电量大小。

这两种方法在测试上有一定的差异,很多应用软件都是需要移动网络的支持,而手机接收的网络信号是会随时间变化的。

因此,第一种方法的误差主要来源于手机在不同的基站网络下工作状态的变化。

第二种方法的差异则体现在两台手机本身硬件消耗的电量可能存在差异,所以需要尽可能使用同一型号,同一批次的手机。

关注我们

界世的你当不

只做你的肩膀

 360官方技术公众号 

技术干货|一手资讯|精彩活动

空·

### 应用程序耗电量测试的方法、工具和框架 #### 方法概述 应用程序的耗电量测试通常涉及多个维度的数据采集与分析。这些数据可能来自设备硬件层面(如电池电流)、操作系统内部统计(如 Android 的 `batterystats`),或者第三方工具提供的报告。具体来说,可以通过以下几种方式实现: - **基于操作系统的内置功能**:Android 提供了详细的电源使用统计数据,开发者可以利用 `dumpsys battery` 和 `batterystats` 命令获取应用级别的功耗详情[^2]。 - **外部测量仪器**:对于更精确的结果,可采用专业的能耗监测仪(如 Monsoon Power Monitor 或者 Keysight E7515B)来实时记录设备运行期间的实际功率变化。 - **模拟环境下的压力测试**:构建特定场景重现日常高频使用的业务流程,在此过程中监控各项资源占用情况并评估其对整体续航时间的影响程度。 #### 使用的主要工具 针对不同需求层次和技术背景的人群而言,存在多种适合的选择用于执行此类任务: - **命令行工具**: 如前所述,借助ADB shell访问系统服务接口能够快速定位问题所在;另外还有专门设计用来解析battery stats文件内容的应用程序Battery Historian可以帮助可视化展示一段时间内的能量消耗趋势图谱[^4]. - **IDE插件支持**: 如果主要工作平台为Android Studio,则可以直接安装相应扩展组件完成初步诊断作业而无需额外配置复杂依赖关系。例如,“Energy Profiler”就是这样一个集成了上述提到的一些核心能力于一体的解决方案之一. - **独立型商业产品/开源项目**: 对于追求极致精准度又愿意投入更多成本的企业级客户来讲,可以选择购买像Perfetto这样的综合性追踪框架或者是开放源码社区贡献出来的同类替代品来进行全方位剖析研究。 #### 测试框架推荐 为了提高效率降低重复劳动量同时保证结果一致性水平达到预期目标要求,建议考虑引入成熟的单元测试库配合脚本驱动机制共同搭建专属定制版连续集成流水线结构模型如下所示: ```python import unittest from appium import webdriver class TestPowerConsumption(unittest.TestCase): def setUp(self): desired_caps = { 'platformName': 'Android', 'deviceName': 'emulator-5554', 'appPackage': '<your_package>', 'appActivity': '.MainActivity' } self.driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps) @classmethod def tearDownClass(cls): cls().driver.quit() if __name__ == '__main__': suite = unittest.TestLoader().loadTestsFromTestCase(TestPowerConsumption) runner=unittest.TextTestRunner(verbosity=2).run(suite) ``` 该示例展示了如何运用 Appium 实现远程控制真实物理机或虚拟仿真器上的待测对象实例,并按照预定计划依次调用各个关键页面交互动作序列直至结束整个周期为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值