【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

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

  • 2020-02-27
  • 本文字数:4535 字

    阅读完需:约 15 分钟

大众点评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 专项测试工作。


2020-02-27 11:14907

评论

发布
暂无评论
发现更多内容

医疗知识图谱问答——文本分类解析

北桥苏

Python 聊天机器人 neo4j 图数据库 知识图谱

一种轻量级定时任务实现 | 京东云技术团队

京东科技开发者

定时任务 系统稳定性 轻量级 企业号 8 月 PK 榜

权威认证 I ONES 连续5年通过可信云企业级 SaaS 服务评估

万事ONES

使用轻量级 CDC debezium-server-databend 构建实时数据同步

Databend

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)

洛神灬殇

MySQL MySQL8.0 版本升级 服务调整

华为云与医药企业共话AI 助力医药行业数字化转型和创新发展

新消费日报

华为开发者大会2023即将召开:HarmonyOS 4 小艺或将迎来全新升级

最新动态

中国出海企业如何防范恶意退货欺诈

Geek_2d6073

提升你的前端技能:掌握 Axios 的 GET 请求

Apifox

程序员 前端 前端开发 HTTP axios

数据库,主键为何不宜太长长长长长长长长?

java易二三

Java 数据库 编程 程序员 计算机

盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容

山东布谷科技

软件开发 源码搭建 iOS SDK 一对一直播源码 弹性扩缩容

方法论揭秘|研发数字化转型,这家保险企业做对了什么?

万事ONES

数智引领,涛思数据与拾贝云携手赋能工业数字化转型

爱倒腾的程序员

etl engine 监控面板 为管理者掌握平台运行情况,决策执行方案提供即时数据支撑

weigeonlyyou

数据交换 物联网 数据采集 ETL Kafka ETL

蓝牙智能设备数据采集平台化方案 | 京东云技术团队

京东科技开发者

数据采集 企业号 8 月 PK 榜 蓝牙智能设备

MobPush Android SDK 厂商推送限制

MobTech袤博科技

前端 App 前端开发 前端开发工具

LangChain:打造自己的LLM应用 | 京东云技术团队

京东科技开发者

langchain LLM模型 企业号 8 月 PK 榜

EPM时代,国产化替代夺回话语权

智达方通

企业管理软件 EPM 智达方通 全面预算管理 智达方通EPM

数据智能:加速企业数字化转型

软通咨询

数据智能 #人工智能 数字化咨询

什么是数字化?数字化转型概念是怎么兴起的?

优秀

数字化转型 数字化

LED透明屏清晰度受什么影响

Dylan

广告 案例 信息 LED显示屏 屏幕

GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

Spring 容器原始 Bean 是如何创建的?

江南一点雨

Java spring

获取 NGINX QUIC+HTTP/3 预览版的二进制包

NGINX开源社区

nginx HTTP QUIC http3

高性能网络建设指南,《智算中心网络架构白皮书》开放下载

Baidu AICLOUD

大模型训练 高性能网络 RDMA

NFTScan 正式上线 zkSync NFTScan 浏览器和 NFT API 数据服务

NFT Research

NFT\

数字化转型背景下经管大数据课程教学能力进阶提升训练营,线下培训圆满收官!

ModelWhale

人才培养 学科交叉 师资培训 教育数字化

华为云第二期线下meetup·北理工站圆满落幕

华为云开源

开源

网心科技:AI重新定义音视频生产力“新范式”

网心科技

AI 边缘计算 边缘云

低代码是什么意思?

优秀

低代码

分布式服务高可用实现:复制 | 京东物流技术团队

京东科技开发者

数据库 复制 高可用设计 分布式服务 企业号 8 月 PK 榜

大众点评App的短视频耗电量优化实战_文化 & 方法_美团技术团队_InfoQ精选文章