简介

mobileperf is python PC 工具,可以收集Android性能数据: cpu 内存 流畅度fps logcat日志 流量 进程线程数 进程启动日志,mobileperf也支持原生monkey test
该项目是由天猫团队开源的PC Android性能稳定性测试工具,可以收集Android性能数据: cpu 内存 流畅度fps logcat日志 流量 进程线程数 进程启动日志,mobileperf也支持原生monkey test,
工具稳定性:mobileperf 能支持跑 72 个小时以上,adb 断开重连都能继续采集

mobileperf 整体架构图:

image-1657776686315

环境搭建

项目地址

  • 安装python3.7 python下载链接,加入到环境变量中,执行python --version,确保是python3

C:\Users\admin>python --version
Python 3.7.4
  • 安装adb,确保adb devices能找到设备

C:\Users\admin>adb devices
List of devices attached
5d0c9ab6        device
  • 修改配置文件,示例参考根目录下config.conf

[Common]
#test process,example: package=com.alibaba.ailabs.genie.contacts
#测试流程,示例:package=com.alibaba.ailabs.genie.contacts
#support multi process,separate use; if contains child process,first must be main process
#支持多进程,分开使用;如果包含子进程,首先必须是主进程
#com.tencent.mm  com.sina.weibo com.taobao.taobao
package=com.example.myapplication #修改成自己手机上要测试的
#collect frequency, int type,unit: second
#采集频率,int类型,单位:秒
frequency=5 # 采集频率
#collect timeout ,int type ,unit:minute, for example:72 hours 4320
# 收集超时时间,int类型,单位:分钟,例如:72小时4320
timeout=3 # 采集时长
#dumpheap frequency, int type,unit: minute
#dumpheap频率,int类型,单位:分钟
dumpheap_freq=1
#adb serialnum,adb devices result example WSKFSKBQLFA695D6
serialnum=5d0c9ab6  # 修改成自己的,adb devices
#except log tag,tools will check in logcat,save exception log in exception.log,multi tags separate use ;
#日志标签除外,工具会在logcat中检入,异常日志保存在exception.log中,多标签分开使用;
exceptionlog=fatal exception;has died
#monkey test,true will enable,other disable
#monkey 测试,true 将启用,其他禁用
monkey=
#test results save path,forbidden space, default None,will save in mobileperf/results
#测试结果保存路径,禁止空格,默认无,会保存在mobileperf/results
#example  save_path=/Users/look/Desktop/project/mobileperf_output
save_path=
#device pull path,test end,tool pull path to PC,multi path separate use;
#设备拉路径,测试端,工具拉路径到PC,多路径分开使用;
phone_log_path=/data/anr  # 日志文件
#mailbox Reserved, no use
mailbox=390125133@qq.com
  • 运行,mac、linux 在mobileperf工具根目录下执行sh run.sh,windows 双击run.bat,结束测试,等待设置测试时长到或按Ctrl+C
    image-1657776600245

测试案例

测试报告

image-1657776943050

报告分析

cpu

通常:采集cpu占用情况有三种方式

  1. dumpsys cpuinfo

  2. top 命令

  3. 通过 proc/stat 计算 cpu 使用率

top 和 dump cpuinfo 的不同,看网上一番讨论,top 更准、但发现采集频率非常快时top 有点耗 cpu,对手机本身性能有影响、除外如果计算指定进程的 cpu 使用率,只需读对应的 proc 文件,通过 jiffies 计算就可以了,这样比 top 方式占用 cpu 低,计算方式如下

整机 cpu 使用率

通过读取/proc/stat ,这个文件包含了所有 cpu 核的汇总情况,所以后面计算不用考虑核数,占用率不会超过 100%

cpu 使用时间 = user+nice+system+iowait+irq+softirq

CPU 总时间=user+nice+system+idle+iowait+irq+softirq = cpu 使用时间 +cpu idle 时间

总 cpu 使用率=(cpu 使用时间 2-cpu 使用时间 1)/(cpu 总时间 2-cpu 总时间 1)*100%

进程 cpu 使用率

通过读取/proc/pid/stat

进程 cpu 使用时间 = utime+stime

进程 cpu 使用率=(进程 cpu 使用时间 2-进程 cpu 使用时间 1)/(cpu 总时间 2-cpu 总时间 1)*100%

采集时间间隔 ,配置文件中默认 5 秒,由于对采集频率要求不高,top 支持同时采集多进程,结果简单易处理,实时性 可信度高,采用 top 的方式

测试过程中会生成 cpuinfo.csv,可以测试过程中查看,表中各列解释
image-1657777654795

内存

整机内存 可用内存通过 dumpsys meminfo 获取 Total RAM 、Free RAM

各进程 pss 通过 dumpsys meminfo package 获取 TOTAL 行 Pss Total 所在列的值,各进程 PSS 也可以通过 dumpsys meminfo 获取,只是拿不到各进程更详细的内存占比情况,比如堆大小、native、system、so 大小等

经测试发现 dumpsys meminfo 比 dumpsy meminfo package 耗时长,dumpsys meminfo 耗时 6s 多,dumpsys meminfo package 能在一秒内完成,采集频率 5s,dumpsy meminfo 会导致 system_server 系统进程 cpu 由 2%增高到 80%,所以降低了 dumpsys meminfo 采集频率,采用 10 倍设置频率采集(比如 dumpsys meminfo package 5s,dumpsy meminfo 则 50s)

由于要支持多进程的情况,现在各进程 pss 通过解析 dumpsys meminfo 结果得到,dumpsys meminfo package 来获取各个进程的详细内存情况

在测试过程中会生成一个 meminfo.csv 文件,可以查看,表中各列解释
image-1657778177739
这个 csv 表格是用 dumpsys meminfo 得出的,汇总 xlsx 文件会在测试结束后生成,对应 meminfo 这个表格

logcat 日志(支持异常日志检测)

工具会保留全量 logcat 日志,每隔 60 万行会新建文件,辅助定位问题
image-1657778775694

如果配置文件中配置了异常日志

exceptionlog=fatal exception;has died

会将 logcat 中出现的异常日志都保存在 exception.log 中

流畅度(fps/丢帧)

fps 通过 dumpsys SurfaceFlinger 或 dumpsys gfxinfo(android8.0 之后)获得最近 128 帧数据计算得出,fps=帧数/耗费时间

如果以上两种方式都不 OK,机器有 root,用 service call SurfaceFlinger 1013 获取帧数

通过 dumpsys SurfaceFlinger 的方式还会计算丢帧 janky 值

丢帧:相邻两次绘制之间的丢帧数,丢帧数越多,说明问题越严重,mobileperf 默认丢帧数超过 10 帧算是严重丢帧

流畅度数据在 fps.csv 中

表中各列解释

页面打开耗时

mobileperf 从 logcat 日志中抓取 am_activity_fully_drawn_time 和 am_activity_launch_time(大多数情况)日志,

会生成 launch_logcat.csv

资料来源:http://www.hzhcontrols.com/new-1405035.html