如果把手机内存和CPU想象成固定面积的田地,单个应用对内存和CPU的占用则可比喻为个人的一亩三分地儿。当应用内存和CPU占用过高时,便过多占用了整个田地资源,挤压了邻家应用的面积,那么手机能够同时运行的应用的数量就会相应减少。
应用过度消耗手机的内存和CPU将会导致手机卡顿、延迟、甚至崩溃等现象频发,严重影响用户体验。
本次华为DevEco云测平台提供了一套专业的测试方法及解决方案,对具有代表性的几款视频类应用在不同使用场景下消耗手机内存和CPU的情况进行检测。
1、测试环境
测试平台:DevEco云测平台
(https://deveco.huawei.com/)
测试对象:腾讯视频6.2.2.17134、爱奇艺9.7.0、优酷7.3.8、搜狐视频6.9.9、乐视视频8.0、芒果TV5.8.6 华为应用市场可下载版本。
测试环境:
硬件环境:华为P20 6G+64G
软件版本:基于Android 版本8.1 EMUI
测试步骤:
1. 登陆DevEco-> 测试服务->性能测试。
2.创建任务界面:测试介绍->机型选择,选择P20->测试配置,上传应用并配置账户登陆信息->提交。
2、测试方法
1.内存测试
建议达到标准:
- 应用前台内存占用 <= 500MB;
- 应用后台内存占用(亮/灭屏)<= 400MB。
测试方法:
通过反射调用android.app.ActivityManagerNative里面的getProcessMemoryInfo方法,获取应用的PSS(应用使用内存)使用情况:appMemoryInfos[0]。
如下图,以com.tencent.qqlive为例:
2.CPU测试
建议达到标准:
- 应用后台CPU占用(亮/灭屏)<=2%
测试方法:
第一步:记录初始时CPU使用情况
测试开始时,通过读取/proc/进程pid/stat,获得进程的CPU统计信息:
当前后台运行应用占用CPU时间:AppT0=cpuInfos[13]+ cpuInfos[14]。
通过读取/proc/stat,获取整个系统的CPU占用率,结果如下:
TotalT0= cpuInfos[1] + cpuInfos[2] + cpuInfos[3] + cpuInfos[4] + cpuInfos[6]+ cpuInfos[5] + cpuInfos[7]
第二步:记录结束时CPU使用情况
测试结束时,通过读取/proc/进程pid/stat,获得进程的CPU统计信息:
当前后台运行应用占用CPU时间:AppT1=cpuInfos[13]+ cpuInfos[14]
通过读取/proc/stat,获取整个系统的CPU占用率,结果如下:
TotalT1= cpuInfos[1] + cpuInfos[2] + cpuInfos[3] + cpuInfos[4] + cpuInfos[6]+ cpuInfos[5] + cpuInfos[7]
计算公式:
cpuRate = (AppT1-AppT0)/(TotalT1- TotalT0)
*异常情况:排除AppT1-AppT0小于0,CPU使用率为0的情况。
如下图,以com.tencent.qqlive为例:
3、测试结果对比
1.视频类应用内存占用对比 (前台)
通过对比各应用最新版本在同一设备中的前台内存占用数据,可以清晰的呈现出各应用内存占用情况。
由图一可见,六款视频应用均表现良好,符合测试标准(<500MB)。其中,乐视视频和搜狐视频表现最优,内存占用远低于标准线。
2.视频类应用内存占用对比 (后台)
图二是视频类应用最新版本在手机后台亮/灭屏情况下内存占用情况。
六款视频类应用后台内存占用均低于标准线(<400MB),性能表现良好,其中搜狐视频后台内存占用最低。
3.视频类应用CPU占用对比 (后台)
图三是视频类应用最新版本亮/灭屏CPU占用情况,搜狐新闻、腾新视频、优酷视频、爱奇艺的CPU占用率较低,性能良好。
乐视视频和芒果TV两个应用的CPU占用过高,超过绿色达标线一倍多,需引起开发者重视。
总结:
通过以上的数据对比,六款主流视频应用的内存占用均位于绿色标准线以内,表现良好;而在CPU后台占用中,乐视视频、芒果TV CPU占用则远高于绿色标准线,占用过高将对用户体验造成不良影响。
内存和CPU的占用所导致的手机延迟、卡顿甚至是崩溃等现象,对视频类应用的用户体验影响是非常直接的,因此也与用户的留存和活跃度息息相关。希望开发者们予以重视,将应用内存和CPU的占用保持在绿色达标线以内,华为终端开放实验室也将与开发者一起为打造绿色健康的安卓生态不懈努力。
4、高内存和CPU占用原因分析
应用内存和CPU占用过高会严重影响用户体验,那么造成这种现象的根本原因是什么?
1.高内存占用原因:
1)内存泄漏是引发应用内存问题的主要原因,长时间内存泄漏会占用大量内存。常见的内存泄漏如:Context泄漏(Activity传递泄漏、context未使用applicationContext),Handle泄漏(在handler中持有context等做耗时操作),Cursor泄漏(使用完cursor后未关闭),register后未unregister等。
2)复杂的界面布局,过多的view层级,也会占用大量的内存。
3)使用传统的Java API中提供的HashMap工具类会相对比较低效,也会占用过多的内存。
2.高CPU占用原因:
1)网络请求过多,导致持续占用CPU。
2)存在特殊的布局或者特殊操作(GPS等需要一直刷新的服务),特殊加载(图片、视频、音频等)。
3)有过多的图表、曲线图等绘制操作。
4)大量的图片、视频处理、加载货布局操作。
5、优化建议
针对通过DevEco云测平台测试发现内存、CPU占用超标、过高的现象,建议开发者从以下几方面对内存和CPU占用进行优化:
1.内存占用优化建议:
- 尽可能设置视图为不透明;
- 不要阻塞主进程;
- 避免重复处理数据;
- 选择正确的数据格式;
- 数据结构优化;
- 对象复用;
- 避免内存泄漏。
2.CPU占用优化建议:
- 大量图片、音频、视频处理最好使用JNI技术来实现;
- 传输完数据就将线程关闭,立即释放资源,不要让线程在一直空转等待下次数据的传输。