1、Android 性能指标

常见的性能指标:内存、CPU、电量、流量、速度/耗时、帧率等
Android 系统的几种场景状态:

  • 空闲状态:指打开应用后,点击 home 键让应用后台运行,此时应用处于的状态叫做空闲
  • 中等规格状态:指打开应用后,较长时间操作的状态
  • 满规格状态:指打开应用后,短时间的操作的状态

    2、关键指标

    2.1 内存

    图片1.png

    2.1.1 内存指标

    内存指标有:

  • VSS(虚拟耗用内存)

  • RSS(进程+公共库的物理内存和)
  • PSS(进程+公共库分配给进程的物理内存和)
  • USS(进程独自占用的物理内存)

测试的时候通常取 PSS 值
图片2.png
几个值之间的一般规律:VSS >= RSS >= PSS >= USS

  • VSS- Virtual Set Size:虚拟耗用内存(包含共享库占用的内存)
  • RSS- Resident Set Size:实际使用物理内存(包含共享库占用的内存)
  • PSS- Proportional Set Size:实际使用的物理内存(比例分配共享库占用的内存)
  • USS- Unique Set Size:进程独自占用的物理内存(不包含共享库占用的内存)

    2.1.2 内存值

    内存值一般可以用如下几个命令收集

  • adb shell top

  • adb shell dumpsys meminfo

例如:dumpsys meminfo com.xx.xx.settings
图片3.jpg

  • Native Heap:Native 代码分配的内存,虚拟机和 Android 框架分配内存。关于什么是 Native 代码,即非 Java 代码分配的内存
  • Dalvik Heap:Java 对象分配的占据内存
  • Dalvik Other:类数据结构和索引占据内存
  • Stack:栈内存
  • Ashmem:不以 dalvik- 开头的内存区域,匿名共享内存用来提供共享内存通过分配一个多个进程可以共享的带名称的内存块。匿名共享内存(Anonymous Shared Memory-Ashmem。Android 匿名共享内存是基于 Linux 共享内存的,都是在 tmpfs 文件系统上新建文件,并将其映射到不同的进程空间,从而达到共享内存的目的,只是,Android 在 Linux 的基础上进行了改造,并借助 Binder+fd 文件描述符实现了共享内存的传递
  • Other dev:内部 driver 占用的内存
  • .so mmap:C 库代码占用的内存
  • .jar mmap:java 文件代码占用的内存
  • .apk mmap:apk 代码占用的内存
  • .ttf mmap:ttf 文件代码占用的内存
  • .dex mmap:dex 文件代码占用内存。类函数的代码和常量占用的内存,dex mmap 是映射 classex.dex 文件,Dalvik 虚拟机从 dex 文件加载类信息和字符串常量等。Dex 文件有索引区和 Data 区
  • Other mmap:其它文件占用的内存
  • 私有内存 (Dirty and Clean):进程独占内存。也就是进程销毁时可以回收的内存容量。通常 private Dirty 内存是最重要的部分,因为只被自己进程使用。Dirty 内存是已经被修改的内存页,因此必须常驻内存(因为没有swap);Clean 内存是已经映射持久文件使用的内存页(例如正在被执行的代码),因此一段时间不使用的话就可以置换出去
  • 实际使用内存 (PSS):将跨进程共享页也加入进来, 进行按比例计算 PSS。这样能够比较准确的表示进程占用的实际物理内存。通常我们需要关注 PSS TOTAL 和 Private Dirty
  • Dalvik Heap:dalvik 虚拟机分配的内存。PSS Total 包含所有 Zygote 分配使用的内存,共享跨进程加权。PrivateDirty 是应用独占内存大小,包含独自分配的部分和应用进程从 Zygote 复制时被修改的 Zygote 分配的内存页。 HeapAlloc 是 Dalvik 堆和本地堆分配使用的大小,它的值比 Pss Total 和 Private Dirty 大,因为进程是从 Zygote 中复制分裂出来的,包含了进程共享的分配部分
  • .so mmap & .dex mmap …:mmap 映射本地或虚拟机代码到使用的内存中
  • Unknown:无法归类的其他项。主要包括大部分的本地分配
  • Native Heap:native 代码申请的内存, 堆和栈,及静态代码块等
  • TOTAL:进程总使用的实际内存
  • Objects:显示持有对象的个数这些数据也是分析内存泄漏的重要数据。如 activity 等

    2.1.3 内存常见问题

  • 内存抖动

  • OOM:当java进程申请的java空间超过阈值时,就会抛出OOM异常(getprop dalvik.vm.heapgrowthlimit,可以查看)
  • 内存不断增长(内存泄漏
  • 频繁GC (手动GC命令:kill -10 pid)

    2.1.4 测试子项

  • 空闲状态下的应用内存消耗情况

  • 中等规格状态下的应用内存消耗情况
  • 满规格状态下的应用内存消耗情况
  • 压力测试后的内存使用情况

    2.2 CPU

    CPU 一般有如下几种 adb 命令可以实现

  • adb shell top

  • adb shell dumpsys cpuinfo

CPU 测试中的测试子项:

  1. 空闲状态下的应用 CPU 消耗情况
  2. 中等规格状态下的应用 CPU 消耗情况
  3. 满规格状态下的应用 CPU 消耗情况
  4. 应用 CPU 峰值情况
  5. CPU 抖动频率

    2.3 fps

    16ms:Android 系统每16ms 就会发出一次 VSYNC 信号触发UI渲染更新
    图片4.png

  6. 图中先显示第0帧,在这 16ms 显示时间里,CPU 和 GPU 已经开始准备下一帧的数据了,赶在下个 VSYNC 信号到来时,GPU 渲染完成,及时交换数据,display 绘制显示完成,不出什么意外的话,每一帧都这么井然有序进行着

  7. A 缓冲用来显示当前帧,那么 B 缓冲就用来缓存下一帧的数据,从而做到边缓冲、边处理
  8. 当 Display 渲染0帧数据时,cpu 在 16ms 内开始渲染第1帧成功,但到 GPU 渲染时却超过了 16ms,导致 VSync 触发后,Display 依然显示第0帧画面,所以此时出现了卡顿

    2.3.1 fps 有如下几种命令

  • adb shell dumpsys SurfaceFlinger
  • adb shell dumpsys gfxinfo android.process.contacts

详细介绍下如何使用 dumpsys SurfaceFlinger 参数计算 fps、jank count:
图片5.jpg

  1. 使用 dumpsys SurfaceFlinger —list 找到当前 Activity
  2. 使用 dumpsys SurfaceFlinger —latency-clear 清除数据
  3. 然后在滑动界面后,使用 dumpsys SurfaceFlinger —latency com.xx.xx.settings/com.xx.xx.settings.entrance.Settings#0 获取数据

【图片6】.jpg
命令解释:

  • 数据的单位是纳秒,时间是以开机时间为起始点
  • 每一次的命令都会得到128行的帧相关的数据
  • 第一行数据,表示刷新的时间间隔 refresh_period
  • 帧率 = ((fameCount-1)/time)*1000000000
  • 第1列:这一部分的数据表示应用程序绘制图像的时间点
  • 第2列:在 SF (软件)将帧提交给 H/W (硬件)绘制之前的垂直同步时间,也就是每帧绘制完提交到硬件的时间戳,该列就是垂直同步的时间戳
  • 第3列:在 SF 将帧提交给 H/W 的时间点,算是 H/W 接受完 SF 发来数据的时间点,绘制完成的时间点

    3、常用工具

    市面上有很多安卓性能测试工具,例如前几年比较火的 GT,emmagee。但想介绍两款工具:mobileperf(阿里)、perfDog(腾讯)

    3.1 moblieperf

    mobileperf 是阿里天猫测试团队写的一款开源的工具
    mobileperf 的实现原理:
    图片7.png
    mobileperf 指标:
mobileperf(https://github.com/alibaba/mobileperf)
指标 测试方法
cpu top
内存 dumpsysmeminfo
fps dumpsysSurfaceFlinger
jank dumpsysSurfaceFlinger
应用启动时间 am_activity_fully_drawn_time;am_activity_launch_time
monkey 可以通过monkey.py 文件修改参数配置
流量 /proc/net/xt_qtaguid/stats
Android10,/proc/net/xt_qtaguid/stats not found,用/proc/net/dev /proc/pid/net/dev

mobileperf 优点

  • 开源
  • 无需root
  • 获取数据比较全

mobileperf 缺点

  • 无法实时查看

    3.2 perfDog

    perfDog 是由腾讯游戏测试团队开发
    perfDog 的实现原理:
    图片8.png
    perfDog 优点:

  • 即插即用

  • 无需root
  • 支持Android、iOS平台
  • 支持微信小程序、小游戏
  • 对测试的影响较小(获取数据时大概cpu消耗在1%)

perfDog 缺点:

  • 测试的指标比较少

    3.3 与GT对比

    | 工具 | 启动时间 | CPU | 内存 | Fps/jank | monkey | Thread num | 打印日志 | processstack | root | 安卓版本 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | | GT | Y | Y | Y | Y | N | N | N | N | N | 9.0之前 | | mobileperf | Y | Y | Y | Y | Y | Y | Y | Y | N | all | | perfDog | N | Y | Y | Y | N | Y | Y(仅USB) | Y | N | all |