【Android场景化性能测试专栏】CPU耗电性能篇

作者:陈帅 团队:腾讯移动品质中心TMQ

一、思路简介

在腾讯内部或者业界,耗电性能测试已有非常多的成熟方案。既有高端深入、带着原理去测试的方案;也有直接读取系统文件、读取手机显示电量百分比的方案。如果你也玩《王者荣耀》,前者可以类比于王者高端局,后者则是青铜匹配局,各有各的乐趣。

读取系统文件或采用工具获取整体手机电流值的方法,受影响的因素多,数据波动大,可信度不高,同时从开发角度说,告诉他一个简单的电流值,对他们定位问题的帮助,也不够。

图一源码中计算APP耗电的逻辑

先简单看下Android源码,无需过于深入理解逻辑。在BatteryStatsHelper类中可以发现,某个App的耗电量值,来源于方法processAppUsage,其中包含CPU、wakeLock、移动网络、WiFi、蓝牙、传感器、摄像头、闪光灯等细分耗电量。通过以上分析:

“这个版本,我们APP耗电量高。”

就可以变成:

“这个版本,我们APP占用CPU时间片过高。”

“这个版本,我们APP单位时间收发网络流量过高。”

“……”

与此同时,CPU、wakeLock、移动网络耗电量等细分指标,则都可以成为测试人员关注的专项测试项。同时测试人员也可以根据自己业务团队重点关注的方向,设计对应的专项测试。

二、数据源

在linux中,使用cat /proc/pid/stat获取数据,其中第13、14位数据代表utime、stime。如下,这两个值代表pid进程从进程存活以来,在用户态运行的时间为:1587 jiffies,在内核态运行的时间10 jiffies。

utime=1587 该任务在用户态运行的时间,单位为jiffies。

stime=10 该任务在核心态运行的时间,单位为jiffies。

本方案,主要以这两个值为依托,输出APP耗电各场景下的耗电性能。

三、数据采集

首先设计一个基类,用于各类性能测试,包括本篇的CPU耗电,以及内存性能、UI流畅度等其他专项。主要用于统一化测试执行逻辑set_up()、tear_down()中的调用逻辑(都为start和stop)。

图二性能测试基类

Jiffs的收集方案,在set_up()调用JiffsCollector实例的start()方法时,创建定时器1s后开始执行self.fun_get_jiffs。同样,在fun_get_jiffs中同样适用定时器每隔5s收集一次/proc/pid/stat中的utime、stime数据,同时计算这5s过程中,进程耗用的CPU时间( =current_utime – last_utime )。同时每收集一次数据,使用__write_line向文本中将本次计算果写入csv文件。

图三JIFFS性能数据收集具体逻辑

四、数据使用

获得单一进程的JIFFS数据后,使用如下表的平均值即可评估出一个特定UI自动化用例场景下,对应的每5秒 utime、stime是否有优化或者达标。

图四平均值评估CPU耗电

但如上,假设获得333.10jiffs/5s这个值,从标准上可以判定其不符合预期,那如何驱动开发去修改问题呢?

开发在得知这个结果之后,需要复现测试的场景,相当于重走了测试同学的执行路径。所以如果测试多走一步,开发就可以少走两步。借助Android Device Monitor工具(Android Studio -> Tools -> Android -> Android Device Monitor),我们可以获取到详细的ThreadJiffs数据。(Tips:DDMS Threads界面可以 ctrl+a全选,ctrl+c复制到excel做排序)。

图五DDMS分析线程CPU占用

在黑盒性能自动化发现有进程有CPU耗电异常之后,使用DDMS分析debug包,一般可以找出几个耗电大头线程。同时使用refresh功能,又可以大致查看到该线程到底是运行在哪些方法上。

通过以上的分析,基本上可以为业务开发找到CPU耗电元凶。其实如果没有前述的黑盒UI自动化框架,测试在黑盒测试中如果感觉到应用总是会导致手机发烫,也可以去用DDMS关注下各个线程的CPU占用时间,找出Thread元凶给开发修改。

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

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逍遥剑客的游戏开发

VR中物理的网络同步

之前做VR游戏时也是尝试了几种物理的同步方案, 最近看到Oculus Blog上也分享了一些, 经验, 做个笔记.。

2926
来自专栏诸葛青云的专栏

C语言学到什么程度可以做项目?

都说编程学习是一个漫长的过程,会的东西越多,感觉懂的越少。要达到可以做项目的状态还是需要下些功夫的。但你非得说没有时间限制,懂一点点你就可以去做项目了。前提是你...

640
来自专栏WeTest质量开放平台团队的专栏

5天2亿活跃用户,2017QQ“LBS+AR”天降红包活动后台揭密

作者王家彬,腾讯后台开发工程师,参与“LBS+AR”天降红包项目,其所在“2016春节红包联合项目团队”获得2016公司级业务突破奖。

1293
来自专栏沈唁志

新人初学Linux的4个必备技巧

1402
来自专栏Jerry的SAP技术分享

使用Recast.AI创建具有人工智能的聊天机器人

很多SAP顾问朋友们对于人工智能/机器学习这个话题非常感兴趣,也在不断思考如何将这种新技术和SAP传统产品相结合。Jerry之前的微信公众号文章C4C和微信集成...

1035
来自专栏编舟记

架构整洁之道导读(三)

上回说到组件聚合,反映的是组件内部的“基本元素”的选择标准。第14章介绍的组件耦合则是指组件和组件之间的关系,这些依赖关系有些是好的,有些是不好的,我们即将看到...

763
来自专栏Java职业技术分享

又出现异常数据?架构师深度剖析分布式系统「事务」

如果说「共识」解决的是「水平」问题,那么「事务」解决的是「垂直」问题。是如何让一条绳上的蚂蚱共同起舞?

923
来自专栏xingoo, 一个梦想做发明家的程序员

IP路由协议简析

RIP 路由信息协议 IGRP 内部网关协议 EIGRP 增强型内部网关路由协议 OSPF 开放最短路径优先 3种动态路由: 距离矢量:RIP/RIPv2  I...

17010
来自专栏SDNLAB

SDN实战团分享(十):SDN控制器性能测试

Hello大家晚上好,昨天刚刚吃完冬至的饺子,现在打嗝还带有淡淡的茴香余韵。明天又正好是平安夜,原本只能靠和美帝开电话会议丰富夜生活的朋友们终于拥有了西体中用的...

3087
来自专栏web前端教室

【从入门到放弃】| 请问,你是在哪个“点”决定放弃的?

今天是15号,再有几天,我的1120期的前端零基础课就讲完一半了,现在已经进入第三部分的内容: 1、html、css、js、jq; 2、nodeJs、 3、电商...

2007

扫码关注云+社区