大众点评App的短视频耗电量优化实战

前言

美团测试团队负责App的质量保证工作,日常除了App的功能测试以外,还会重点关注App的性能测试。现在大家对手机越来越依赖,而上面各App的耗电量,直接影响了手机的待机时间,是用户非常关心的一点。本文主要通过一个典型案例,介绍App性能测试中的电量测试,并总结了我们由此引发的一些思考。

一、案例分析

短视频作为已被市场验证的新内容传播载体,能有效增加用户停留时长。大众点评App从9.3版本开始推出短视频相关内容,在各页面新增了短视频模块。在短视频功能测试中,我们发现如果在视频列表页中播放视频,手机很快就会发烫。针对这种现象,我们马上拉取数据进行了分析,测试数据表明,视频列表页耗电量竟然是详情页的11倍。这是怎么回事儿呢?

目前行业内有很多电量测试的方法,我们采用的是Battery Historian,这是Google推出的一款Android系统电量分析工具,支持5.0(API 21)及以上系统手机的电量分析。

1. 测试对象

短视频主要包括三个核心页面:视频列表页、视频详情页、作者页,本次的测试对象就是这三个页面。

2. 测试过程

测试机型:华为Mate 9 Android 7.0 电池容量:4000mAh
播放的视频时长:1min15s 测试场景设计:WiFi环境下,打开App,播放视频,通过点击“重新播放”,连续播放10次 对比场景:停在App首页20min,手机不灭屏 注意:测试过程不充电,每次测试环境一致

3. 测试结果

如下是Battery Historian测试结果部分截图:

视频列表页

视频详情页

对测试结果数据进行汇总整理:

消耗电量:系统总电量的占比

从测试结果可以看到,短视频列表页耗电量特别高,是视频详情页的11倍

4. 问题定位

视频列表页消耗电量过高,从测试数据可以很明显的看出来,视频列表页CPU占用时间高很多。从播放器布局来看,列表页和作者页比视频详情页只是多出了动画音符。如下图,红框中圈出的视频左下角的音符。

电量消耗差异这么大,是否跟动画音符有关呢。为了排除这个问题,重新编译了一个去掉动画音符的APK进行测试。测试结果:

从测试结果来看,CPU和耗电量很明显都下降了很多,因此确定是动画音符引起的。打开GPU视图更新的开关,查看三个页面的绘制情况。打开视频列表页,可以看到,动画音符每波动一次,会导致整个页面都在不停的绘制。如下是视频列表页绘制的情况:

从动图可以很明显看出该页面绘制十分异常,动画音符每波动一次,会导致整个页面都重新绘制一遍。

所以,到这里就明白了问题的原因,因为页面上动画音符的实现方式有问题,动画音符波动时,导致整个页面会跟着一起不停的重新绘制。而页面的重复绘制,会使App CPU占用比正常情况下高出很多,进而导致耗电量高。

5. 修复后验证

定位到原因之后,开发针对性的进行了修复。动画音符柱状图的实现,之前设计由多个可变化的单柱形View组成,单个柱形View重写了onMeasure & OnDraw方法,从外部柱状图View中初始化单个柱子的高度,然后自动根据一个函数式来变化高度。因为每次都需要层层调用Measure和对应的Layout,所以造成外层控件的多次layout,进而造成CPU占用率增大。修复之后,使用另一种方式实现,只重写了View的OnDraw方法,每次使用Canvas画出所有柱状图,使用ValueAnimator来计算变化柱状图高度,也不再影响父控件的Layout。如下是修复前后的核心代码:

修复之后动画音符波动时的绘制区域:

修复之后,重新使用Battery Historian进行验证,测试结果:

从上面的测试结果,可以看到,视频列表页和作者页,耗电情况得到明显的优化

总结一下,短视频耗电量的问题,是由于错误的绘制方法,导致CPU占用过高,进而导致耗电量高。那么因为动画音符导致耗电量异常的问题到这里就完美的解决了。CPU负载高,会导致耗电量高是显而易见的。但是还想深入探索一下,在手机系统各App耗电量排行榜中,耗电量是怎么计算的?还有哪些因素会影响耗电量呢?带着这些疑问,我们来看看系统计算耗电量的原理。

二、耗电量计算原理

根据物理学中的知识,功=电压*电流*时间,但是一部手机中,电压值U正常来说是不会变的,所以可以忽略,只通过电流和时间就可以表示电量。模块电量(mAh)=模块电流(mA)*模块耗时(h)。模块耗时比较容易理解,但是模块电流怎样获取呢,不同厂商的手机,硬件不同,是否会影响模块的电流呢。看一下系统提供的接口:./frameworks/base/core/java/com/Android/internal/os/PowerProfile.java

该类提供了public double getAveragePower(String type)接口,type可取PowerProfile中定义的常量值,包括POWER_CPU_IDLE(CPU空闲时),POWER_CPU_ACTIVE(CPU处于活动时),POWER_WIFI_ON(WiFi开启时)等各种状态。并且从接口可以看出来,每个模块的电流值,是从power_profile.xml文件取的值。PowerProfile.java只是用于读取power_profile.xml的接口而已,后者才是存储系统耗电信息的核心文件。power_profile.xml文件的存放路径是/system/framework/framework-res.apk。

以Nexus 6P为例,在该路径获取到framework-res.apk文件。使用apktool,对framework-res.apk进行反解析,获取到手机里面的power_profile.xml文件,内容如下所示:

<?xml version="1.0" encoding="utf-8"?>
<device name="Android"><item name="none">0</item><item name="screen.on">169.4278765</item><item name="screen.full">79.09344216</item><item name="bluetooth.active">25.2</item><item name="bluetooth.on">1.7</item><item name="wifi.on">21.21733311</item><item name="wifi.active">98.04989804</item><item name="wifi.scan">129.8951166</item><item name="dsp.audio">26.5</item><item name="dsp.video">242.0</item><item name="gps.on">5.661105191</item><item name="radio.active">64.8918361</item><item name="radio.scanning">19.13559783</item><array name="radio.on"><value>17.52231575</value><value>5.902211798</value><value>6.454893079</value><value>6.771166916</value><value>6.725541238</value></array><array name="cpu.speeds.cluster0"><value>384000</value><value>460800</value><value>600000</value><value>672000</value><value>768000</value><value>864000</value><value>960000</value><value>1248000</value><value>1344000</value><value>1478400</value><value>1555200</value></array><array name="cpu.speeds.cluster1"><value>384000</value><value>480000</value><value>633600</value><value>768000</value><value>864000</value><value>960000</value><value>1248000</value><value>1344000</value><value>1440000</value><value>1536000</value><value>1632000</value><value>1728000</value><value>1824000</value><value>1958400</value></array><item name="cpu.idle">0.144925583</item><item name="cpu.awake">9.488210416</item><array name="cpu.active.cluster0"><value>202.17</value><value>211.34</value><value>224.22</value><value>238.72</value><value>251.89</value><value>263.07</value><value>276.33</value><value>314.40</value><value>328.12</value><value>369.63</value><value>391.05</value></array><array name="cpu.active.cluster1"><value>354.95</value><value>387.15</value><value>442.86</value><value>510.20</value><value>582.65</value><value>631.99</value><value>812.02</value><value>858.84</value><value>943.23</value><value>992.45</value><value>1086.32</value><value>1151.96</value><value>1253.80</value><value>1397.67</value></array><array name="cpu.clusters.cores"><value>4</value><value>4</value></array><item name="battery.capacity">3450</item><array name="wifi.batchedscan"><value>.0003</value><value>.003</value><value>.03</value><value>.3</value><value>3</value></array>
</device>

从文件内容中可以看到,power_profile.xml文件中,定义了消耗电量的各模块。如下图所示:

文件中定义了该手机各耗电模块在不同状态下的电流值。刚刚提到,电量只跟电流值和时间相关,所以通过这个文件,再加上模块的耗时,就可以计算出App消耗的电量,App电量=∑App模块电量。划重点,手机系统里面的电量排行,也是根据这个原理计算的。

了解原理对于平常在App耗电量的测试有很大的帮助。因为获取到手机power_profile.xml文件,就可以清楚的知道这个手机上,哪些模块会耗电,以及哪些模块在什么状态下耗电量最高。那么测试的时候,应该重点关注调用了这些模块的地方。比如App在哪些地方使用WiFi、蓝牙、GPS等等。

例如最近对比测试其他App发现,在一些特定的场景下,该App置于前台20min内,扫描了WiFi 50次,这种异常会导致App耗电量大大增加。并且反过来,当有case报App耗电量异常时,也可以从这些点去考虑,帮助定位问题。

三、电量测试方法总结

如上,列出的一些常用的电量测试方法。综合各方法的优缺点,在定制个性化电量测试工具之前,目前采用的方法是Battery Historian。目前行业内,App耗电测试有很多种方案,如果仅仅测试出一个整体的电量值,对于定位问题是远远不够的。借助Battery Historian,可以查看自设备上次充满电以来各种汇总统计信息,并且可以选择一个App查看详细信息。所以QA的测试结果反馈从“这个版本App耗电量”高,变成“这个版本CPU占用高”“这个版本WiFi扫描异常”,可以帮助更快的定位到问题原因及解决问题。

当然,除了测试方法和测试工具,测试场景设计也非常重要。如果是在App内毫无规律的浏览,即使发现页面有问题,有很难定位到是哪个模块的问题。所以要针对性的设计场景,并且进行一些场景的对比,找出差异的地方。

四、总结

本文主要通过一个案例,介绍关于App电量测试中使用的一些基本方法和思路。电量测试采用的Battery Historian方法,虽然能初步解决问题,但是在实际的应用场景中还存在很多不足。目前美团云测平台,已经集成了电量测试方法,通过自动化操作,获取电量测试文件并进行解析,极大的提高了测试效率。目前每个版本发布之前,我们都会进行专门的电量测试,保障用户的使用体验。在电量测试方面,美团测试团队还在持续的实践和优化中。

作者简介

  • 倩云,美团客户端测试开发工程师,2015年加入美团,主要负责大众点评App基础功能及Android专项测试工作。

招聘信息

点评平台技术部-平台质量中心,Base上海,主要负责大众点评平台入口和基础功能的质量保障。平台包括大众点评App、大众点评微信小程序、PC站:www.dianping.com、M站:m.dianping.com;主要业务涵盖:账号、POI、评价、视频、文章、会员社区、问答、运营活动、搜索推荐、通信链路、运营活动等基础业务。热忱期待各位QA、开发、算法人才加入点评平台技术部。联系邮箱:wanxia.wang#dianping.com。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决CNN固有缺陷!通用 CNN 架构CCNN来了| ICML2022

文 | David W. Romero等源丨机器之心在 VGG、U-Net、TCN 网络中... CNN 虽然功能强大&#xff0c;但必须针对特定问题、数据类型、长度和分辨率进行定制&#xff0c;才能发挥其作用。我们不禁会问&#xff0c;可以设计出一个在所有这些网络中都运行良好的单一 CNN 吗&#xff1…

境外业务性能优化实践

本文根据第16期美团技术线上沙龙OnLine演讲内容整理而成。 前言 性能问题简介 应用性能是产品用户体验的基石&#xff0c;性能优化的终极目标是优化用户体验。当我们谈及性能&#xff0c;最直观能想到的一个词是“快”&#xff0c;Strangeloop在对众多的网站做性能分析之后得出…

LeetCode 第 21 场双周赛(779/1913,前40.7%)

文章目录1. 比赛结果2. 题目LeetCode 5336. 上升下降字符串 easyLeetCode 5337. 每个元音包含偶数次的最长子字符串 mediumLeetCode 5338. 二叉树中的最长交错路径 mediumLeetCode 5339. 二叉搜索子树的最大键值和 hard1. 比赛结果 只做出来了第1题&#xff0c;第3题有一个例子…

算法工程师的三观测试

文 | 小戏编 | 小轶如果我在谷歌输入“How to improve my machine learning models”&#xff0c;我会得到形形色色花样繁多的提升模型性能的方法。从调参到特征工程&#xff0c;从集成模型到数据增强&#xff0c;琳琅满目&#xff0c;不胜枚举。可是如果我在这个问题上加一点限…

领域驱动设计在互联网业务开发中的实践

至少30年以前&#xff0c;一些软件设计人员就已经意识到领域建模和设计的重要性&#xff0c;并形成一种思潮&#xff0c;Eric Evans将其定义为领域驱动设计&#xff08;Domain-Driven Design&#xff0c;简称DDD&#xff09;。在互联网开发“小步快跑&#xff0c;迭代试错”的大…

LeetCode 1377. T 秒后青蛙的位置(BFS)

1. 题目 给你一棵由 n 个顶点组成的无向树&#xff0c;顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下&#xff1a; 在一秒内&#xff0c;青蛙从它所在的当前顶点跳到另一个 未访问 过的顶点&#xff08;如果它们直接相连&#xff09;。青蛙无法跳回已经访问过的顶点。…

已删除

7.12更新:部分基金赎回的钱已经到账小金库了&#xff0c;今日从小金库提现时又提示银行卡已删除&#xff0c;不过这次可以点击重新绑定&#xff0c;重新绑定时会报错“绑定的卡与原卡一致”&#xff0c;流程没法走完。但这时候再退回去却发现“银行卡已删除”的提示没有了。于是…

即时配送的ETA问题之亿级样本特征构造实践

ETA&#xff08;Estimated time of Arrival&#xff0c;预计送达时间&#xff09;是外卖配送场景中最重要的变量之一&#xff08;如图1&#xff09;。 我们对ETA预估的准确度和合理度会对上亿外卖用户的订单体验造成深远影响&#xff0c;这关系到用户的后续行为和留存&#xff…

LeetCode 1376. 通知所有员工所需的时间(DFS)

1. 题目 公司里有 n 名员工&#xff0c;每个员工的 ID 都是独一无二的&#xff0c;编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。 在 manager 数组中&#xff0c;每个员工都有一个直属负责人&#xff0c;其中 manager[i] 是第 i 名员工的直属负责人。对于总负责人…

华为天才少年稚晖君做了一把模块化机械键盘,引起极客圈地震,网友:这才是真正的客制化...

作者 | 王玥、李梅&#xff0c;陈彩娴&#xff08;编辑&#xff09;来源 | AI科技评论他来了他来了&#xff0c;一人顶一个团队的稚晖君又一次带着一项硬核&#xff08;虽然他强调是“软核”&#xff09;黑科技来了&#xff01;稚晖君&#xff0c;真名彭志辉&#xff0c;三次元…

iPhone X 刘海打理指北

iPhone X 刘海机于9月13日发布&#xff0c;给科技小春晚带来一波高潮。作为开发人员却多出来一份忧虑&#xff0c;iPhone X 怎么适配&#xff1f;我们 App 的脑袋会不会也长一刘海出来&#xff1f;Tabbar 会不会被圆角&#xff1f;先来看一下美团 App 的表现&#xff1a; 图 1.…

大厂们终于无法忍受“加一秒”了,微软谷歌Meta等公司提议废除闰秒

文 | 萧箫 发自 凹非寺源 | 量子位 , 公众号 QbitAI大厂们再也无法忍受闰秒带来的一堆bug了。现在&#xff0c;谷歌Meta微软亚马逊等一众科技巨头发起了一项倡议&#xff1a;废除闰秒&#xff01;闰秒这玩意&#xff0c;说白了就是通过给“世界标准时间”加_&#xff08;或减&a…

LeetCode 1374. 生成每种字符都是奇数个的字符串

1. 题目 给你一个整数 n&#xff0c;请你返回一个含 n 个字符的字符串&#xff0c;其中每种字符在该字符串中都恰好出现 奇数次 。 返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串&#xff0c;则返回其中任意一个即可。 示例 1&#xff1a; 输入&…

Redux从设计到源码

本文主要讲述三方面内容&#xff1a; Redux 背后的设计思想源码分析以及自定义中间件开发中的最佳实践在讲设计思想前&#xff0c;先简单讲下Redux是什么&#xff1f;我们为什么要用Redux&#xff1f; Redux是什么&#xff1f; Redux是JavaScript状态容器&#xff0c;能提供可预…

LeetCode 1375. 灯泡开关 III

1. 题目 房间中有 n 枚灯泡&#xff0c;编号从 1 到 n&#xff0c;自左向右排成一排。最初&#xff0c;所有的灯都是关着的。 在 k 时刻&#xff08; k 的取值范围是 0 到 n - 1&#xff09;&#xff0c;我们打开 light[k] 这个灯。 灯的颜色要想 变成蓝色 就必须同时满足下…

MIT指出公开预训练模型不能乱用

文 | 林锐众所周知&#xff0c;用 Imagenet 预训练模型做 backbone&#xff0c;再接个下游任务的头去微调&#xff0c;是个简单有效的迁移学习方法。基本上&#xff0c;炼丹师用这种方法就能成功获得一个优秀的模型&#xff08;水一个实验室的项目&#xff09;。但是近些年一些…

从0到1:构建强大且易用的规则引擎

引言 2016年07月恰逢美团点评的业务进入“下半场”&#xff0c;需要我们在各个环节优化体验、提升效率、降低成本。技术团队需要怎么做来适应这个变化&#xff1f;这个问题直接影响着之后的工作思路。 美团外卖的CRM业务步入成熟期&#xff0c;规则类需求几乎撑起了这个业务所有…

LintCode 563. 背包问题 V(DP)

1. 题目 给出 n 个物品, 以及一个数组, nums[i] 代表第i个物品的大小, 保证大小均为正数, 正整数 target 表示背包的大小, 找到能填满背包的方案数。 每一个物品只能使用一次 样例 给出候选物品集合 [1,2,3,3,7] 以及 target 7 结果的集合为: [7] [1,3,3] 返回 22. 解题 dp[…

汽车博主因眼睛小被辅助驾驶误判为开车睡觉!何小鹏亲自回应 蔚来已成立专门研究小组...

源 | 每日经济新闻近日&#xff0c;一位汽车博主表示&#xff0c;他在驾驶小鹏汽车&#xff0c;使用小鹏辅助驾驶功能的时候&#xff0c;因为自己的眼睛比较小&#xff0c;所以被系统判定为“开车睡觉”&#xff0c;从而被扣除了智驾分。据了解&#xff0c;“智驾分”是小鹏汽车…

投资127亿!深圳,再添一所985

源 | 青塔综合转自 | 募格学术据深圳卫视近日消息&#xff0c;中山大学深圳校区多栋建筑将在暑假交付。报道称&#xff0c;中山大学深圳校区主楼正在进行工程最后收尾工作&#xff0c;预计本月底就能竣工验收&#xff0c;确保秋季新学期开始前投入使用。校区总建筑面积约127万平…