NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

大众点评 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:14902

评论

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

ARTS 打卡 第2周

Scotty

一个爱不释手的Apifox,让我扔掉 Postman的想法

给你买橘子

Java 编程 程序员 开发 Postman

给 Spring Boot 项目减减肥!18.18M 到 0.18M 是如何做到的?

给你买橘子

Java 程序员 Spring Cloud 编码 SpringBoot 2

RESTful 架构及实践

pingan8787

Java 大前端 RESTf

java 后端博客系统文章系统——No3

猿灯塔

无价值人生记录.0:浪费1000%时间去做一个用来节省1%时间的“轮子玩具”(上:因缘)

八苦-瞿昙

C# 程序员 随笔 随笔杂谈 aop

使用 Dockerfile 创建镜像 | Docker 系列

AlwaysBeta

Docker 容器 镜像 Dockerfile

《精益思想》读后感分享

zhongzhq

高效工作 精益 精益思想 精益生产方式

玩转Redis高可用 - 哨兵(Sentinel)模式

Man

高可用 redis高可用 中间件

如何基于 BitMap 进行海量数据分析

GrowingIO技术专栏

互联网 数据分析 科技互联网 数据化

如何搭建一个HBase集群

Rayjun

HBase

啃碎并发(九):内存模型之基础概述

猿灯塔

Java 猿灯塔

分布式系统的一些基础理论

俊俊哥

分布式事务 CAP Base

猿灯塔:spring Boot Starter开发及源码刨析(三)

猿灯塔

Java 猿灯塔

架构师训练营第六周作业

张明森

DOM 树的构建

法正

html 大前端 DOM

计算机操作系统基础(十七)---进程同步之Unix域套接字

书旅

php laravel 线程 操作系统 进程

图说前端-内存管理(1/3)

梦见君笑

大前端 内存

redis里的数据结构

流沙

redis

那些让程序员目瞪口呆的Bug

Java小咖秀

程序员 bug

图解:深度优先搜索与广度优先搜索

淡蓝色

Java 数据结构 算法

图说前端-ArrayBuffers 和 SharedArrayBuffers(2/3)

梦见君笑

大前端 内存管理

图说前端-使用Atomics避免SharedArrayBuffers中的race conditions(3/3)

梦见君笑

大前端 内存管理

Java 线程的生老病死

武培轩

Java 线程 多线程 并发 线程状态

刘华:上云还是不上云,这是一个问题

刘华Kenneth

架构 敏捷

游戏夜读 | 如何分析游戏体验?

game1night

如果你想写自己的Benchmark框架

程序那些事

JVM 性能调优 GC benchmark

架构师必须知道的架构知识

Chank

架构 架构师 Architecture Architect

redis系列之——Redis为什么这么快?

诸葛小猿

Java redis 程序员

基于Kubernetes实现的大数据采集与存储实践总结

岿然独存5

Docker Kubernetes S3 EFK Fluentd

Git 常用操作汇总-cheat sheet

多选参数

git GitHub gitlab gitee

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