如果把手机内存和 CPU 想象成固定面积的田地,单个应用对内存和 CPU 的占用则可比喻为个人的一亩三分地儿。当应用内存和 CPU 占用过高时,便过多占用了整个田地资源,挤压了邻家应用的面积,那么手机能够同时运行的应用的数量就会相应减少。
应用过度消耗手机的内存和 CPU 将会导致手机卡顿、延迟、甚至崩溃等现象频发,严重影响用户体验。
本次华为 DevEco 云测平台提供了一套专业的测试方法及解决方案,对具有代表性的几款视频类应用在不同使用场景下消耗手机内存和 CPU 的情况进行检测。
测试平台:DevEco 云测平台
测试对象:腾讯视频 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
测试步骤:
2.创建任务界面:测试介绍->机型选择,选择 P20->测试配置,上传应用并配置账户登陆信息->提交。
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 为例:
1.视频类应用内存占用对比(前台)
通过对比各应用最新版本在同一设备中的前台内存占用数据,可以清晰的呈现出各应用内存占用情况。
由图一可见,六款视频应用均表现良好,符合测试标准(<500MB)。其中,乐视视频和搜狐视频表现最优,内存占用远低于标准线。
2.视频类应用内存占用对比(后台)
图二是视频类应用最新版本在手机后台亮/灭屏情况下内存占用情况。
六款视频类应用后台内存占用均低于标准线(<400MB),性能表现良好,其中搜狐视频后台内存占用最低。
3.视频类应用 CPU 占用对比(后台)
图三是视频类应用最新版本亮/灭屏 CPU 占用情况,搜狐新闻、腾新视频、优酷视频、爱奇艺的 CPU 占用率较低,性能良好。
乐视视频和芒果 TV 两个应用的 CPU 占用过高,超过绿色达标线一倍多,需引起开发者重视。
总结:
通过以上的数据对比,六款主流视频应用的内存占用均位于绿色标准线以内,表现良好;而在 CPU 后台占用中,乐视视频、芒果 TV CPU 占用则远高于绿色标准线,占用过高将对用户体验造成不良影响。
内存和 CPU 的占用所导致的手机延迟、卡顿甚至是崩溃等现象,对视频类应用的用户体验影响是非常直接的,因此也与用户的留存和活跃度息息相关。希望开发者们予以重视,将应用内存和 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)大量的图片、视频处理、加载货布局操作。
针对通过 DevEco 云测平台测试发现内存、CPU 占用超标、过高的现象,建议开发者从以下几方面对内存和 CPU 占用进行优化:
1.内存占用优化建议:
尽可能设置视图为不透明;
不要阻塞主进程;
避免重复处理数据;
选择正确的数据格式;
数据结构优化;
对象复用;
避免内存泄漏。
2.CPU 占用优化建议:
大量图片、音频、视频处理最好使用 JNI 技术来实现;
传输完数据就将线程关闭,立即释放资源,不要让线程在一直空转等待下次数据的传输。