一、前言
本文章主要介绍通过adb工具对安卓游戏客户端进行性能采集开发。网络上关于adb shell指令进行性能采集的文章有很多,我也是通过看这些文章来学习的,本文章目的就是整理这些文章的内容,以方便后续查阅。
二、关于adb工具
可以下载Android SDK,我本地的版本是在platform-tools里面就包含了此工具,使用的方法也比较简单。为了方便可以将此目录添加至系统的环境变量中,这样在任何地方打开命令行,都可以执行adb命令。
常用的adb命令列表:
- adb devices 获取连接本机的安卓设备列表。
- adb connect ip:port 连接指定的安卓设备,连接模拟器常会用到
- adb start-server 启动adb服务,一般无需执行,在执行其他adb命令时,如果服务器没有启动,会自动启动服务
- adb kill-server 关闭adb服务
- adb -s
shell 进入device_name命令行交互操作,如果只有一台设备连接,可以不输入-s device_name。这里会有很多命令可以操作,具体会根据不同的需求进行逐步讲解 - adb logcat 查看连接设备的日志.这条指令有很多扩展参数包括过滤进程,过滤日志级别等。
- adb push <本地文件路径> <设备目录> 将本地的文件上传至设备上的指定目录。设备目录需要有可写权限才可以。
- adb pull <设备文件路径> <本地目录> 将设备上的指定文件下载到本地的指定目录。
三、性能采集相关指令
1、获取设备进程列表
adb shell pm list packages 获取已安装的app的包名,可以添加额外的参数如 -f 获取app包的路径
2、获取设备的相关信息
设备型号
adb shell getprop ro.product.model
设备系统版本
adb shell getprop ro.build.version.release
设备AndroidSDK版本号
adb shell getprop ro.build.version.sdk
设备CPU信息
cat /sys/devices/system/cpu/present 可以获取CPU的核数
cat /sys/devices/system/cpu/cpu{0}/cpufreq/cpuinfo_max_freq 然后就可以计算出CPU的最高主频
设备内存信息
adb shell cat /proc/meminfo | grep 'MemTotal' 可计算出内存大小。
设备屏幕截图
adb shell screencap -p 此方法可以重定向输入至png文件,也可直接输出然后读取写入图片文件。
设备屏幕录制
adb shell screenrecord <输出文件.mp4> 此方法本人并未实际使用,待验证。
3、获取App的相关信息
获取App的进程ID
adb shell ps | grep
获取App的版本
adb shell pm dump
获取App的CPU信息
1)通过CPU时间计算 参考文章: 安卓性能测试之cpu占用率统计方法总结(https://www.jianshu.com/p/6bf564f7cdf0)
2)通过Top指令计算 adb shell top -d 1 -n 1 这个指令也需要针对不同的手机,不同的系统进行区别判断。
3)通过adb shell dumpsys cpuinfo | grep
获取App的内存信息
adb shell dumpsys meminfo -s
获取App的网络流量数据
adb shell cat /proc/
获取手机的温度和电量
adb shell dumpsys battery 里面temperature为温度,level为电量百分比。
获取App的FPS数据
dumpsys SurfaceFlinger --latency SurfaceView 因为我只做了游戏App的性能采集,因此只介绍游戏相关的,这条指令获取数据后可以计算出帧率。但仅限于Android 6及以下的设备。计算方式:Android性能测试之fps获取(https://blog.csdn.net/itfootball/article/details/43084527)
获取高系统版本的App的FPS数据
关于Android 6以上的系统设备,我花一段时间对dumpsys SurfaceFlinger进行分析,最后找到了一个较准确的计算方法,此方法目前在网上并没有发现有谁分享过, 具体如下 dumpsys SurfaceFlinger | grep flips 获取屏幕绘制队列。然后执行两次该命令,将获取的数据相减,并除以间隔时间,即可得到FPS值。我分别在Android 6, 7, 8, 9的设备上都进行了数据采集,相对是较准确的。但此方法没有看到理论支持,而且我也没有去看Android本身的源码,因此该方法仍需要在实践中检验。
四、工具开发
通过上面的内容,已经可以对一款游戏进行客户端性能采集,当然这些指标只能算通用性测试指标。并未涉及DC,三角面等更加深层的数据统计,针对这些深层的数据统计,我也仅使用过游戏引擎自带工具进行数据采集,例如Unity的profiler。说到工具开发首先就得选择合适的开发语言和界面设计。
个人开发工具的一些思路(才疏学浅T.T)