【小知识】Android APP 性能测试指标汇总(一)

2,579 阅读6分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

前言

众所周知,目前移动端设备的系统主要分为Android 和 IOS两大系统阵营。其中,Android系统是开源的,因此很多厂商都是以Android系统为基础进行开发应用软件。

对安卓设备中APP测试包括:功能测试、UI测试、性能测试、兼容性测试、压力测试、边界值测试、中断测试等等

image.png

其中,设备性能出现的问题,会直接对用户在使用APP产品带来不好的体验。

本期将关于安卓APP性能测试指标进行汇总和学习,Let's go~~

1. 内存

在Android系统中,每个APP内存包括两部分:

  • 与其他进程共享内存(shared drity)
  • APP独占的私有内存(private dirty)

在行业内,我们通常会使用PSS(USS+共享的内存)来判断APP的内存开销

查看指令为:adb shell dumpsys meminfo 应用包名或者 adb shell procrank

例如:我们查看Youtube应用的内存运行情况:

image.png

  • 内存测试测试项中,需要对系统不同情况进行测试

    1. 空闲状态下,应用内存消耗
    2. 中等规格状态下(操作时间较长),应用内存消耗
    3. 满格状态下(操作时间较短),应用内存消耗
    4. 测试过程中,同时要关注内存峰值、泄漏、内存释放、压测后内存使用情况
  • 内存场景问题

    1. 内存抖动:频繁的GC,导致UI卡顿
    2. 内存溢出:应用申请的内存不够引发的
    3. 内存泄漏:应用结束后无法释放内存空间,存在大量次数就会导致内存泄漏
    4. 频繁GC

更多细节,可查看之前的性能测试指标之内存

2. CPU

CPU 是衡量APP应用程序占用系统资源情况。

如果APP应用程序占用过多的CPU资源,会导致整个系统的稳定性,系统操作会异常的卡顿。

因此,Android CPU指标我们需要关注两点:

  • CPU 总体使用率
  • 应用程序CPU占有率

我们可以通过下列命令查看CPU资源使用情况:

  • adb shell dumpsys cpuinfo | grep packagename

  • adb shell dumpsys top -n 10 -s cpu 显示占比CPU最高的钱10个程序 (-t 显示进程名称,-s按指定行排序,-n 在退出前刷新几次,-d 刷新间隔,-m显示最大数量)

使用adb shell cat /proc/stat读取/proc文件。它以文件系统方式为内核与进程提供通信接口,用户和应用程序可以通过/proc文件,得到系统信息,并改变内核的某些参数。

在使用性能检测功能工具CPU指标,会有一个概念CPU利用率(默认显示第一种)

  • CPU Usage: 传统CPU利用率,也称为未规范化CPU利用率

    计算方法: 当前时刻CPU频率下,CPU Usage = CPU执行时间/CPU总时间

  • CPU Usage(normalized):规范化CPU利用率

    计算方法:CPU usage(normalized)= (CPU执行时间/CPU总时间)*(当下时刻所有CPU频率之后/所有CPU频率最大值之后)

image.png

user :从系统启动开始累计到当前时刻,用户态的jiffies ,不包含nice值为负进程;
nice :从系统启动开始累计到当前时刻,nice值为负的进程所占用的jiffies;
system :从系统启动开始累计到当前时刻,系统态的jiffies;
idle :从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待的jiffies;
iowait : 从系统启动开始累计到当前时刻,硬盘IO等待的jiffies;
irq : 从系统启动开始累计到当前时刻,硬中断的jiffies;
softirq :从系统启动开始累计到当前时刻,软中断的jiffies

注:jiffies(时间片)为Linux核心变数

total=user+system+nice+idle+iowait+irq+softirq

cpu usage=[(user_end +sys_end+nice_end) - (user_begin + sys_begin+nice_begin)]/(total_end - total_begin)*100

同样,需要在系统空闲、中等、满格三种情况下,查看CPU指标变化情况。

我们在面对问题如:APP操作时出现发烫、卡顿、ANR现象,排查是否是CPU问题时:

  • 如果是ANR,则在logcat文件里搜索ANR in,以及adb pull 拉取trace文件
  • 如果没有ANR则使用上述方法获取到CPU占用率,如果某个场景CPU占用率走势异常,峰值存在异常均值大于基线,则可以使用traceview查看分析Trace文件,反馈给RD解决。

更多细节,可查看性能测试指标之CPU

3. GPU

当一个APP操作过程中,出现卡顿,存在的原因可以有CPU问题,也有可能是GPU问题。

GPU指标专门衡量一个APP画面渲染的速度,当过度绘制对画面性能影响是极其严重的。

  • GPU指标中需要关注点:

    1. 过度绘制:界面显示的activity嵌套多层
    2. 屏幕滑动帧率
    3. 屏幕滑动平滑度
  • GPU数据获取步骤

    1. adb shell dumpsys gfxinfo 包名 > GPU.txt
    2. pull GPU.txt 文件到本地
    3. 定位到Profile datain ms 复制到Excel中绘制表格展示
  • GPU测试点:

    1. 过度绘制测试:

      • 打开开发者选项
      • 进行操作测试APP
      • 测试指标:
        • 控制过度绘制为2X
        • 不允许存在4X过度绘制
        • 不允许在面积超过屏幕1/4的3X过度绘制
  • 画面卡顿

4. FPS

FPS指标是衡量APP画面每秒传输的帧数,每秒钟帧数越多,操作APP的动作越流畅。

FPS指标是显示指标一种,显示指标主要有两大类:

  1. 系统层级的指标仅有FPS,本身的Surface的合成需要在SurfaceFlinger中进行

  2. 应用层级的指标有三类:

    • Aggregate frame stats,属于HWUI功能。HWUI进行Surface绘制后才能分析
    • Jankiness count、MAx accumulate frames、Frame rate适合范围广
    • SM、Skipped frames 需要Choreographer 绘制Surface 才能正常工作
  • FPS指标普遍要求:

    • 在android 屏幕中刷新率为60帧/秒
    • 每一帧时间不超过16.6ms,画面流畅不卡顿
  • FPS 数据获取命令:

    1. adb shell dumpsys SurfaceFlinger --latency 当前activity
    2. adb shell dumpsys gfxinfo 包名

通常情况下,FPS和GPU两个是结合的一起看的,两者的关系是相辅相成。

总结

本期,我们主要对安卓性能测试中CPU、内存、GPU和FPS四个指标相关概念进行学习。

以上是本期内容,欢迎大佬们点赞评论,下期见~~~