原创

iOS 电量测试实践

作者:张锦铭团队:腾讯移动品质中心TMQ

iOS电量相关问题一直是测试人员头疼的事情,电量测试怎么开展、问题怎么复现和跟进定位、用户反馈电量相关的问题我们如果获取更多的信息等等,一直都没有一个好的解决方案,以至于我们面对电量相关的问题时,总是束手无策。整个项目组经常收到这样的一种反馈:你看,你们开发的APP,我还没怎么用呢,耗电量就排第一了。对于这样的反馈,我们能做些什么呢?之前我们是迷茫的,但经过一段时间的尝试和努力之后,事情有了一些改观。

一、电量测试之农业时代

在之前很长一段时间,我们都是用这种可怜的方式进行电量测试的:

1、选定测试场景以及时长;

2、给手机充放电,让手机剩余电量在我们预设的值,比如90%,每个场景测试开始时,保证手机都是这一电量;

3、手机系统设置,一般要关注屏幕亮度、蓝牙、定位、通知消息、音量、后台应用等等,为保证简单,通常是全部关闭或调到最小即可;

4、记录开始时的剩余电量,并执行测试,在测试结束后再记录一次剩余电量,两个电量差,就为该场景在一定时长内的耗电量;剩余电量嘛,直接读手机上展示的值或是通过接口获取(后面会介绍)均可以,几乎没有区别;

真是够简陋,但并非完全没有用,明显的电量消耗问题,还是可以发现,只要选得场景对了就可以。要是发现不了问题也不会一直用这个方法了不是。嘿嘿。

后面我们还将这种方案做了优化,流程不变,但是全自动化,人工只参与数据出来后的整理即可。具体的方法是,在手机和mac之前,加了一块Arduino开发板,通过mac端的指令,可以智得控制开发板通电或是断电,以达到手机充电或是放电的效果。

但不管怎么全自动化都好,终归还是最粗放的方式,没有具体的数据,没法帮助定位,如果还是个偶现的问题,那就更加束手无策,只能作罢。

二、电量测试之工业时代

慢慢得,我们开始去做一些新的尝试,能不能获取到更多更详细的电量数据,是我们的主要目标。

我们想得也比较简单,执着得认为,肯定是有一些我们没有发现的接口,可以获取到一些详细的数据,要不然系统是怎么计算每个APP的耗电量的呢?其实在某一段时间之内,确实如我们所想,但并非一直如此。

最初我们用到的是UIDevice类batteryLevel接口。这个接口只能获取到剩余电量百分比,目前世面上能见到的所有iOS系统版本都可用,如上文所提到的,他和系统界面上展示的值几乎没有区别,唯一不同的是,他是以mAh为单位计的,以这个值计算的剩余电量百分比,就是系统上显示的那个值。这样看来,这个接口也没有什么多大的意义。还得继续尝试。

接着我们使用到的是IOKit中的IOPMPowerSource接口,私有接口,调用方式如下:

在iOS 10及以上的系统上,能获取到的信息如下:

看看关键信息:

第三行CurrentCapacity是当前的剩余电量;

第六行FullyCharged是否满电量;

第八行IsCharging是否正在充电;

第九行MaxCapacity最大电池容量;

第十行Voltage当前电压。

信息是多了一些,有当前电压值,有剩余电量。这个有什么用呢?我们先科普一点点小知识。

首先,某一设备的电压,基本是在一定范围之内变动的,相对稳定的一个值。就像iPhone 6P的电压,基本是在4V上下。当电池剩余电量越少时,电压值会变得越小,但波动不大。电压过小时,可能会引起手机直接关机,这也是为什么有时还有20%电量,但手机却开不了机了。新的电池,电压波动会小一些,越是老化,电压波动可能越大。所以电压这个值能用来判断当前电池的健康度。

然后是剩余电量2548,他的单位是mAh。手机电池常用类似1000mAh这样的标识,这不是具体的电量,光看这个值,能解理到的含义是,以1000mA的电流来放电,能放1小时。或者说,以200mA的稳定电流放电,能放5小时。但明显这样意义并不大。因为我们还不知道电池在工作时,会以多少mA的电流工作,所以也就不知道能用多久,我们想知道的是,电池到底还有多少电,这个才是一个具体的值。上面提过,电压是相对固定的,我们可以算出具体剩余多少电,以1000mAh,粗略计电压稳定为4V,根据公式计算得出W=UIt=4v*1000mAh=4000mWh。这个就是当前电池剩余的电量。当计算剩余电量的百分比的时候,用哪个值去算都一样了。

以上是IOPMPowerSource接口在iOS10及以上系统上获取的信息。但事实上,在iOS 9及以前的系统上,能获取到更多更详细的信息,大部分是一些硬件的固定信息,对我们测试没有帮助。但也有一些其他有用的信息,比如说当前的温度,电流,都是很有用的信息,如下图:

温度能用来直接判断当前的发热情况,电流能直接判断当前的电池发电功率,都可以有效判断当前电池的使用状态。

但是这个接口拿到的数据,仍然是不够具体,全是整机的电池情况,没有具体到某一个应用或是其他维度的电量统计。所以,还得继续摸索。

这一次我们应用到的是BatteryUsageUI.bundle中PLBatteryUsageUIQuery,也是个私有接口。这里卖个关子,实现就不帖了,有心的同学可以根据我的关键字找到具体的东西。这个接口就厉害了,具体得说,他能拿到每一个APP的CPU\GPU\显示\网络\存储等前后台所有详细信息,一个巨大的表。

当我们探索到这一步时,激动不已,以为光明就在眼前了。可是事实却是,这个接口早在iOS9的第一个版本,就完全被封了,只能在iOS 8上的机子上拿到数据。而且经过多次确认后,我们发现,这个数据是每个小时才会更新一次,并不是实时的。

但尽管如此,还是大大得增强了我们继续探索的信心,我们第一次获取到了每一个App的电量消耗情况,而且我们很确信,苹果iOS的电量排行榜,就是根据这些数据计算出来的。因为,我们在这之前,已经发现在越狱环境下有个工具,叫DetailedBatteryUsage,这个插件只做了一件事情,就是把系统设置里,电池的显示方式设置成了“2”,而默认的显示方式是“0”。设置为“2”以后,就可以在电池设置里看到很详细的信息,如下图:

跟我们用接口拿到的数据是一致的,所以我们确认电量排行榜数据来至于这个接口,而且,系统一直在调用这个接口在统计电量相关的信息,只是对用户而言不可见,而且接口也不可见。在越狱环境下能拿到这些数据,对我们定位问题已经有很大的帮助了,但是一方面这些数据是系统显示出来的,我们处理很不方便,效率也低,另一方面,这些数据只能在越狱的机器上拿到,而目前主流的系统都还是不能越狱的。我们不得不再进一步。

三、电量测试之大数据时代

经过长时间的探索,我们的目标越来越清晰,但是路却越来越窄,因为能用的接口都被官方给屏蔽了,很长一段时间内,我们都没有任何进展。直到无意中发现了官方的工具sysdiagnose。这是苹果日志系统的统称,苹果经常会询问是否要官方帮忙诊断和定位问题时,上传的就是sysdiagnose的各种日志。

Sysdiagnose很庞大,每天上几百M的日志,记录电池、第三方APP、各种系统功能和应用的所有运行情况。

Sysdiagnose怎么使用呢?简单得说,就是需要一个开发者账号,然后到苹果开发者网下载对应的证书。不需要越狱,没有系统限制,这个特别关键。关于怎么使用,有明确的说明:

当然每一类不同的日志,都对应不同的证书,以上说明是针对电池电量的。

电量日志是sysdiagnose系统中最庞大的一块。电量日志每天有几十到一百M,他是一个庞大的数据库,里面有267张表,记录了电池电量的各维度信息。看来要弄懂电量的数据来源,必须要弄明白这些表之前的联系以及各自的意思。

经过几周的折腾,我们弄明白了几个关键的顶部的表格,下面列出来分享给大家:

通过这些表格数据,我们能明白,系统记录了哪一些数据,他们之前的关系,哪些是对我们有用的。数据非常全面,我只能说苹果威武。

有了这样全面的官方数据,我们的测试怎么做呢?

1、首先,上线前的电量测试,只要装上对应的证书,便可开始执行测试,只要记下哪个时间段对应的是哪个场景,然后测试完后,取下系统的数据库,便可以对当次的电量做较全面的评价,例如,某个APP在某场景下,20分钟运行时间,显示耗电100mWh,CPU耗电20mWh,运行温度是32度,平均电流是110mA,是不是很酷?这样的数据,一旦异常,对于问题的定位帮助也比较大,点个赞。

2、用户反馈的问题,不再没有头绪,只需要装证书发送给他,让他装上,半小时后便可以获取到最近几天的所有电量信息,用于跟进和定位问题。酷不酷?想不想学?

不仅如此,这些关键数据,还让我们弄清了两个关键问题,一个是剩余电量是怎么计算的,另一个是电量排行榜是怎么计算的,我一一列举。

四、剩余电量是怎么计算的

iOS系统每20秒会读取一次系统电量相关数据记录入整机电量数据库,主要内容有当前电流,电压,剩余电量,最大电量,温度,是否在充电,充放电次数。

1、电流以mA计,直接通过硬件测得,是计算其他数据的基础,iPhone工作时,电流一般在1mA到700mA之间。超过500mA电池很容易发热。

2、电压以mV计,通过硬件测得,是计算其他数据的基础,iPhone工作时,电压几乎一直恒定在4V左右。测试过程中出现过的最高电压是4.3V。

3、剩余电量是以mAh计,他和最大电量是相对值,我们看到的电量百分比是这两个值的比值。电量最大值是一个理论值,1000mAh的意义是,以1000mA的恒定电流放电时,能放1小时。他最大值并不固定,他会随着电压而发生一些波动。

4、温度也通过硬件接口获得,可以作为一个参考值,测试过程中出现的最高温度是37度,能明显感觉到发热了。

5、是否在充电,如果是在充电过程中,使用的任何应用,具体电量都不作统计,不入数据库,而只统计整机的电量。

6、充放电次数,以充放一次最大电池容量记为一次,充放电次数可以作为电池老化程度的一个根据。

下面再来说说到底是怎么计算的。

假如充满电是1000mAh,系统会每20秒读一次电流值,以及判断是在充电还是放电,记算这段时间的功耗,逐步累加。如半小时后还有800mAh,剩余电量就是80%。

五、电量排行榜是怎么计算出来的

1、首先要说明的是,电量排行榜显示的不是实时的数据,他有1小时内的延迟。同时他与系统显示的剩余电量百分比也不是同一套计算体系。

2、iPhone用来记录电量相关数据的数据库极为庞大,有在概265张表,每天超10M的数据。

3、每一个安装到iPhone的应用,在系统级都会有一个ID标注,称作结点ID。

4、系统电量的消耗分为主要以下大类,每一种都作为电量消耗的根结点。isp\apsocbase \display\wifi data\GPU venc\venc\CPU\restofsoc\GPS\DRAM。

5、系统中每个应用都有几种状态,分别是不运行、前台活跃、前台不活跃(一般应用间切换时出现)、后台、暂停(在后台但没有运行,程序还在内存中)。

6、系统每小时记录了每一个根结点被哪些应用占用,应用的状态是怎么样的,每应用消耗了多少能量,总共消耗了多少,比如某一小时内,某个APPCPU\GPU\GPS\DRAM\显示各耗电20mAh,共100mAh,这小时内所有APP耗电200mAh,那么该APP耗电占比50%。

六、总结

总结一下,电量测试从农业时代,到工业时代,再进大数据时代,是量变到质量的过程。我们做了长时间的探索,最终还是站在巨人的肩膀上,实现了最初预想的目标,走了很多弯路,由于研究的人很少,经常一些关键词,google出来的信息就两三条,很容易走进死胡同里,但也正因为这样,也没有在一条错的路上一直走,总算是有点收获,很是感慨。

搜索微信公众号:腾讯移动品质中心TMQ,获取更多测试干货!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS耗电量测试方法-Sysdiagnose

    如果有问题,可以进一步通过快捷入口打开Time Profile,Network Profile,Location Profile做进一步细致排查问题点。 这...

    用户5521279
  • 有赞iOS精准测试实践

    近几年有赞零售业务快速发展,为了满足日益增多的业务需求,2019年起零售客户端发版改成了每周一次,在质量保障方面,技术团队要面对更大的挑战。故此我们团队做了很多...

    有赞coder
  • iOS 逻辑自动化测试实践

    在本文中,以iOS手机管家为例子,逻辑自动化测试的范围选定为 ObjectController 文件夹中的类,此文件夹中的类文件均为与 UI 无关的业务逻辑类。

    腾讯移动品质中心TMQ
  • 腾讯 TMQ 团队10 年巨献: iOS 测试实践

    开始敲这篇“软”文,我觉得颈肩都好硬,转转头抖抖肩,许多事情如开闸水般涌入脑海,整个人顿时放松了下来。也烦请读者朋友耐心读下来,看一看这千千万万测试人的一些共鸣...

    腾讯移动品质中心TMQ
  • GrowingIO 数据采集 iOS SDK 测试实践

    GrowingIO 是基于用户行为数据的增长平台,精准采集用户行为数据是公司业务的基石,只有及时、准确、可靠的采集到数据,才能支撑上层的数据分析,用户画像,运营...

    ios-lan
  • iOS 增量代码覆盖率检测实践

    本文介绍了对iOS覆盖率检测算法的研究,分享一种可以嵌入到现有开发流程中,并对开发透明的增量代码测试覆盖率工具的实现。

    美团技术团队
  • 腾讯TMQ在线沙龙回顾|iOS电量测试

    iOS电量测试 活动时间:2017年11月15日 斗鱼直播 活动介绍 TMQ在线沙龙第三十三期分享 本次分享的主题是:iOS电量测试 共有69位测试小伙伴报名参...

    腾讯移动品质中心TMQ
  • Ant+Jmeter批量接口测试实践

    下载地址:http://ant.apache.org/bindownload.cgi

    DevOps云学堂
  • IOS手机耗电量测试的一个文艺玩法

    在iOS通用设置中打开电池百分比数值显示,然后操作30分钟,60分钟,90分钟,看开始时和结束时电池百分比数值的差值。

    ITester软件测试小栈
  • APP专项测试之耗电量测试

    Hi,大家好。随着应用市场不断推陈出新,用户在使用APP时更加关注电量问题。如果自己的App不小心出现在耗电量排行榜Top10,用户卸载的概率就会很高,针对AP...

    ITester软件测试小栈
  • iOS面试题----实践向

    前言 很多人都说熟悉UIKit,那对于常见的API是否熟悉? 多线程是前端经久不衰的考点。 大家对于Block的weak-strong dance都耳熟能详...

    落影
  • iOS开发专题分类大全(简书iOS学习资源大收录!)

    为了更好地将简书上面的iOS文章分类,以方便我们日后的集中式强化学习,这里整理了二十多个专题以供大家查阅!

    陈满iOS
  • GraphQL测试实践

    我们很熟悉以REST实现的API,可以用任何能够发出http 请求的库或者工具来测试REST API。去年随着GraphQL在全球风靡,它也出现在了最近两期的T...

    ThoughtWorks
  • 『电子书』分享一波码农必备编程开发类书籍[转]

    @坤的
  • ATX自动化测试学习

    之前小编分享了《PyUnit+uiautomator2实现应用自动化回归测试实践》,MTSC听了《ATX在淘宝客户端实践》(ATX作者,ID:codeskyb...

    用户5521279
  • 【阅读清单】有奖内测体验活动

    完成了内测体验的小伙伴,可以填写问卷,活动结束后我们将统一进行审核,审核结束就进行礼品发放。问卷链接:https://wj.qq.com/s2/7433898/...

    云加社区
  • Qzone高性能HTTPS实践

    自从去年QQ空间移动端页面开始切换到HTTPS之后,页面性能遇到了比较大的挑战,HTTPS对页面访问速度带来了比较大的影响,所以我们通过实践总结了一些能够提升H...

    WeTest质量开放平台团队
  • iOS逆向开发常见问题的解决方案

    修改越狱工具(例如yalu),等重新越狱成功之后进行删除有问题的tweak和相关文件

    公众号iOS逆向
  • 精准测试实践

    前段时间接到了一个输入法开关下发的功能,通过精准测试的理念,在测试效率和测试覆盖度上提升较大,在这里分享一下测试过程:

    用户5521279

扫码关注云+社区

领取腾讯云代金券