周末闲来无事, 翻遍各大视频网站实在是找不到什么好看节目. 既然从娱乐的角度来说视频不好看, 那我们就来从技术的角度来看下各家视频 App 吧. 技术的角度, 话题还是太大, 实在是没有能力做一个全面的比较. 记得曾经有位小伙伴曾说过, 一切性能问题追究到底都会成为内存问题. 那我们就从内存的角度来简单分析下优酷, 爱奇艺和腾讯视频三家视频 App.
一, 基础知识 - dumpsys 命令
对于 Debug 版本 App 我们可以使用 Android Studio 自带的 Profiler 来查看应用对内存的使用情况. 想要查看 Release 版本应用的内存使用情况就得靠 dumpsys 这个工具了. dumpsys 运行在 Android 设备上, 我们可以通过 adb 命令来运行它. 通过 dumpsys 我们可以获取到所有正在运行的系统服务的特征信息. 系统服务非常多, 我们可以通过如下命令查看能够使用 dumpsys 来查看服务特征信息的服务列表.
adb shell dumpsys -l
上图是我在华为 P9 上测试 dumpsys -l 的截图, 服务列表很长, 只截取了一部分, 截图中看着眼熟的服务就 activity 这个服务了, 这个通常用来查看四大组件的信息, 如常见的
adb shell dumpsys activity activities
. 常用还有如下服务.
服务名 | 作用 |
---|---|
input | 获取系统输入设备的信息,如键盘、触摸屏等 |
batterystats | 获取电量使用信息 |
gfxinfo | 获取 UI 渲染信息 |
meminfo | 获取内存使用信息 |
cpuinfo | 获取 CPU 使用信息 |
netstats | 获取网络使用信息 |
1.1 dumpsys 命令语法
dumpsys 命令的语法也非常简单, 直接 adb shell dumpsys 即可. 但这样获取的是所有服务的信息, 信息非常多, 想要过滤到我们所关注的信息, 还需要在命令后跟上我们所关注的服务名. 如今天我们主要关注内存, 对应的服务名是 meminfo, 那么命令就是 adb shell dumpsys meminfo. 这个命令获取的是设备上所有进程的内存使用情况, 我们今天关注的是优爱腾三个 App 的内存, 所以我们还得再命令后加上进程名来过滤 adb shell dumpsys meminfo com.youku.phone
1.2 dumpsys 输出信息解析
如上所示内存信息, 一般关注 Pss Total 和 Private Dirty 这两列. 这是两种不同的内存统计方式.
Private (Clean and Dirty) RAM 私有内存, 这种方式只统计了当前进程独享的内存, Private Clean 和 Private Dirty 的总和当前进程的独占内存, 当进程销毁时系统会回收这部分内存. Dirty RAM 是必须保存在内存中数据, 如程序运行过程中的变量数据, 这部分内存中的东西未成为垃圾数据之前必须一直保存在内存中; Clean RAM 是从持久化文件中加载的数据, 如程序执行时加载的代码, 这部分内存中的数据可以丢掉, 再次需要使用是可以再从持久化文件中加载.
Proportional Set Size (PSS) 比例集大小, 这中方式统计的内存除了进程独享内存外, 还包括通过共享页面与其他进程共享的内存. 共享内存的一个常见用途是在进程之间共享 "代码" 内存页 (加载只读可执行代码的内存区域). 比如外部库和 JVM 的可执行代码是存放在可以跨进程安全共享的内存区域. 共享内存会根据共享进程数量分摊到各个进程中.
另外值得一提的是 Objects 区域列出来的是当前进程存活的对象数量, 这些信息对分析内存泄露问题也有指导意义. 例如 ViewRootImpl 代表了当前进程存活的根 view 个数, ViewRootImpl 是和 Windows 一一对应的, 从 ViewRootImpl 的数量我们也可以分析是否有 dialog 或者其他窗口导致的内存泄露.
二, 优爱腾内存对比
APP | 包名 | 版本 |
---|---|---|
优酷 | com.youku.phone | 7.6.7 |
爱奇艺 | com.qiyi.video | 10.2.0 |
腾讯视频 | com.tencent.qqlive | 6.8.0 |
上面是测试使用的 App 版本. 为了对比应用自己申请的内存大小, 我们列出来 Private Dirty,Private Clean 及其他们的和 Private Total. 验证了以下三个场景:
打开 App 进入首页不做任何操作稳定 30s 后测量内存数据;
在首页往下滑动 10 屏以上稳定后测量内存数据;
退出应用杀掉进程, 重新进入首页, 搜索《人民的名义》点击 01 集进入播放页, 关闭弹幕全屏播放高清资源一分钟后测量内存数据; 测量数据如下, 单位都是 KB.
从上面对比图可以看出, 优酷在首页上内存的使用是最为高效, 爱奇艺的播放器在内存使用方面做得最好. 还有一点就是爱奇艺在每个阶段 Private Clean 使用都是最小的.
来源: https://juejin.im/post/5c8e61aa6fb9a070fa3758b0