内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇( 二 )


render_time = 67 vsync_overtime = 4
一次命令执行获得的fps = int( frame_count * 60 / (frame_count + vsync_overtime_sum))
还有一个命令是: adb shell dumpsys SurfaceFlinger --latency LayerName
这个命令能获取游戏/视频应用的fps数据其中LayerName在各个不同系统中获取的命令是不一样的
在Android 6系统直接就是SurfaceView
在Android 7系统中可以通过 dumpsys window windows | grep mSurface | grep SurfaceView 然后通过数据截取到
在Android 8系统中可以通过 dumpsys SurfaceFlinger | grep android包名获取到
执行命令结果如下:
 

内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

文章插图
 计算方法比较简单,一般打印出来的数据是129行(部分机型打印两次257行,但是第一部分是无效数据,取后半部分),取len-2的第一列数据为end_time,取len-128的第一列数据为start_time
fps = 127/((end_time - start_time) / 1000000.0)
至于为啥要取第一列数据,这里不做过多介绍,欢迎参看这两篇文章
老罗的文章SurfaceView原理
Android性能测试之fps获取
至于为啥要处于1000000,因为命令打印出来的是纳秒单位,要转为毫秒进行计算,127就是因为命令一次打印出来127帧的数据而已
adb CPU占用率数据采集有两种方法可以获取
1) adb shell "top -n 5 | grep <package | pid>",第三列就是实时监控的CPU占用率(-n 指定执行次数,不需root权限),这边top命令执行需要2到3s左右,一般可以采用busybox 的top命令执行,效率会快很多
 
内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

文章插图
 2) adb shell "dumpsys cpuinfo | grep <package | pid>"
两种方法直接区别在于,top是持续监控状态,而dumpsys cpuinfo获取的实时CPU占用率数据
adb 耗电量数据采集adb命令:adb shell "dumpsys batterystats < package | pid>" (Android 5.0后引入)
获取单个应用的耗电量信息,具体返回结果待研究
adb命令:adb shell "dumpsys battery"
出现信息解读:
AC powered:false 是否连接AC(电源)充电线
USB powered:true 是否连接USB(PC或笔记本USB插口)充电
Wireless powered:false 是否使用了无线电源
status: 1 电池状态,2为充电状态,其他为非充电状态
level:58 电量(%)
scale: 100. 电量最大数值
voltage: 3977 当前电压(mV)
current now: -335232. 当前电流(mA)
temperature:355 电池温度,单位为0.1摄氏度
 
technology:Li-poly. 电池种类
 
内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

文章插图
 adb 采集流量数据adb 命令:adb shell "dumpsys< package | pid> | grep UID" [通过ps命令,获取app的UID(安装后唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat为查看命令,读取tcp_rcv获取应用接收流量信息(设备重启后清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat为查看命令,读取tcp_snd获取应用发送流量信息(设备重启后清零)]
计算流量消耗步骤:
  1. 执行一次这两条命令,获取到应用的开始接收及发送的流量
  2. 然后我们再操作应用,执行一段时间测试
  3. 再次执行上述 2 条命令可以获取到应用结束时候的接收及发送的流量,通过相减及得到应用的整体流量消耗
或者还有一种方式获取应用流量消耗:
  1. 首先获取应用固定uid
    dumsys package android包名 | grep userId
  2. 执行cat /proc.NET/xt_qtaguid/stats | grep uid
     
    内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

    文章插图
      其中第6列代表rx_bytes接收的字节数,第8列为tx_bytes发送的字节数
    一个uid可能对应多个进程,把数据累加就行
    两个时间片中间应用流量的消耗,就计算接收字节数的差值就行
adb采集CPU温度首先判断类型:
cat /sys/class/thermal/thermal_zone*/type
 
内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

文章插图
 只有红框框出来的是有效的
cat /sys/class/thermal/thermal_zone*/temp
获取CPU温度
 
内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇


推荐阅读