简介
mobileperf is python PC 工具,可以收集Android性能数据: cpu 内存 流畅度fps logcat日志 流量 进程线程数 进程启动日志,mobileperf也支持原生monkey test
该项目是由天猫团队开源的PC Android性能稳定性测试工具,可以收集Android性能数据: cpu 内存 流畅度fps logcat日志 流量 进程线程数 进程启动日志,mobileperf也支持原生monkey test,
工具稳定性:mobileperf 能支持跑 72 个小时以上,adb 断开重连都能继续采集
mobileperf 整体架构图:
环境搭建
安装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
测试案例
测试报告
报告分析
cpu
通常:采集cpu占用情况有三种方式
dumpsys cpuinfo
top 命令
通过 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,可以测试过程中查看,表中各列解释
内存
整机内存 可用内存通过 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 文件,可以查看,表中各列解释
这个 csv 表格是用 dumpsys meminfo 得出的,汇总 xlsx 文件会在测试结束后生成,对应 meminfo 这个表格
logcat 日志(支持异常日志检测)
工具会保留全量 logcat 日志,每隔 60 万行会新建文件,辅助定位问题
如果配置文件中配置了异常日志
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
评论