大众点评App的短视频耗电量优化实战,阿里架构师经验分享

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>
lue>
        <value>238.72</value>
        <value>251.89</value>
        <value>263.07</value>
        <value>276.33</value>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值