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

adb 常用命令

  1. 获取连接设备号:adb devices
  2. 列出设备所有已安装的包名 (不需root权限)
    adb shell “pm list packages”,可以加上grep 进行筛选(windows系统使用findstr /i "xxxx" 或者 find)
3)查看进程列表:adb shell "ps",同时也能获取到应用的UID,方式如下(不需root权限):
 
内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

文章插图
 u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Process.JAVA中查看到(FIRST_AppLICATION_UID和LAST_APPLICATION_UID),u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值,所以,对于截图这个应用进程,它是u0_a155,按前面的规制,它的UID就是155 + FIRST_APPLICATION_UID = 10155 。
内存说明VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
adb 查看单个内存占用量 (均不需要root权限)
  1. 单个应用的最大内存限制
     
    adb shell "getprop | grep heapgrowthlimit"
     
    内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

    文章插图
     
  2. 应用启动后分配的初始内存
     
    adb shell "getprop|grep dalvik.vm.heapstartsize"
     
    内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

    文章插图
     
  3. 单个java虚拟机的最大内存限制
     
    adb shell "getprop|grep dalvik.vm.heapsize"
     
    内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

    文章插图
     
adb内存数据采集使用 adb shell "dumpsys meminfo -s <pakagename | pid>"命令,输出结果分以下4部分:
  1. process 以进程的PSS从大到小依次排序显示,每行显示一个进程;
  2. OOM adjustment 分别显示每类的进程情况
  3. category 以Dalvik/Native/.art mmap/.dex map等划分的各类进程的总PSS情况
  4. total 总内存、剩余内存、可用内存、其他内存
 
执行结果如下图,重点取该应用的TOTAL 对应的内存占用大小(KB)
 
内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

文章插图
 PS:在apk内调用运行获取其他app的内存数据则需要root权限
adb fps(每秒帧数,计算流畅度)数据采集adb命令:adb shell dumpsys gfxinfo <package | pid>
前提:开发者选项=>GPU呈现模式分析确保打开=>在adb shell dumpsys gfxinfo中or 在屏幕上显示为线型图方法仅适用于Android原生应用,不适用于游戏正常情况下帧率应该在16.67ms左右,1秒60帧,执行结果如下:
 
内存、cpu、fps、流量、GPU、电量 Android性能测试——adb篇

文章插图
gfxinfo详细计算方法如下:
  1. 首先获取执行一次命令打印出来的结果,重点关注Draw Prepare Process Execute 行下面的数据
    Draw:是消耗在构建java显示列表DisplayList的时间 。说白了就是执行每一个View的onDraw方法,创建或者更新每一个View的DisplayList对象的时间 。
    Process:表示是消耗在Android的2D渲染器执行显示列表的时间,view越多,要执行的绘图命令就越多,时间就越长
    Execute:消耗在排列每个发送过来的帧的顺序的时间.或者说是CPU告诉GPU渲染一帧的时间,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复 。所以这个时间,一般都很短 。
    Draw + Prepare+Process + Execute = 完整显示一帧,这个时间要小于16ms才能保存每秒60帧 。
  2. 计算总数据的行数 frame_count = row_num, 计算每行渲染时间render_time = Draw + Prepare+Process + Execute, 当渲染时间>16.67ms(1000/60),按照垂直同步机制,该帧已经渲染超时
  3. 一旦render_time>16.67 算一次jank(丢帧),一旦jank,需要用掉额外的vsync
    vsync_overtime = 向上取整(render_time/16.67) - 1
    比如:render_time = 66.68 vsync_overtime = 3


    推荐阅读