adb常用命令获取连接设备号:adbdevices列出设备所有已安装的包名(不需root权限) adbshellpmlistpackages,可以加上grep进行筛选(windows系统使用findstrixxxx或者find) 3)查看进程列表:adbshellps,同时也能获取到应用的UID,方式如下(不需root权限): u0a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Process。java中查看到(FIRSTAPPLICATIONUID和LASTAPPLICATIONUID),u0a后面的数字就是该应用的UID值减去FIRSTAPPLICATIONUID所得的值,所以,对于截图这个应用进程,它是u0a155,按前面的规制,它的UID就是155FIRSTAPPLICATIONUID10155。内存说明 VSSVirtualSetSize虚拟耗用内存(包含共享库占用的内存) RSSResidentSetSize实际使用物理内存(包含共享库占用的内存) PSSProportionalSetSize实际使用的物理内存(比例分配共享库占用的内存) USSUniqueSetSize进程独自占用的物理内存(不包含共享库占用的内存) 一般来说内存占用大小有如下规律:VSSRSSPSSUSSadb查看单个内存占用量(均不需要root权限)单个应用的最大内存限制adbshellgetpropgrepheapgrowthlimit应用启动后分配的初始内存adbshellgetpropgrepdalvik。vm。heapstartsize单个java虚拟机的最大内存限制adbshellgetpropgrepdalvik。vm。heapsizeadb内存数据采集 使用adbshelldumpsysmeminfos命令,输出结果分以下4部分:process以进程的PSS从大到小依次排序显示,每行显示一个进程;OOMadjustment分别显示每类的进程情况category以DalvikNative。artmmap。dexmap等划分的各类进程的总PSS情况total总内存、剩余内存、可用内存、其他内存 执行结果如下图,重点取该应用的TOTAL对应的内存占用大小(KB) PS:在apk内调用运行获取其他app的内存数据则需要root权限adbfps(每秒帧数,计算流畅度)数据采集 adb命令:adbshelldumpsysgfxinfo前提:开发者选项GPU呈现模式分析确保打开在adbshelldumpsysgfxinfo中or在屏幕上显示为线型图方法仅适用于Android原生应用,不适用于游戏 正常情况下帧率应该在16。67ms左右,1秒60帧,执行结果如下: 详细计算方法如下:首先获取执行一次命令打印出来的结果,重点关注DrawPrepareProcessExecute行下面的数据 Draw:是消耗在构建java显示列表DisplayList的时间。说白了就是执行每一个View的onDraw方法,创建或者更新每一个View的DisplayList对象的时间。 Process:表示是消耗在Android的2D渲染器执行显示列表的时间,view越多,要执行的绘图命令就越多,时间就越长 Execute:消耗在排列每个发送过来的帧的顺序的时间。或者说是CPU告诉GPU渲染一帧的时间,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复。所以这个时间,一般都很短。 DrawPrepareProcessExecute完整显示一帧,这个时间要小于16ms才能保存每秒60帧。计算总数据的行数framecountrownum,计算每行渲染时间rendertimeDrawPrepareProcessExecute,当渲染时间16。67ms(100060),按照垂直同步机制,该帧已经渲染超时一旦rendertime16。67算一次jank(丢帧),一旦jank,需要用掉额外的vsync vsyncovertime向上取整(rendertime16。67)1 比如:rendertime66。68vsyncovertime3 rendertime67vsyncovertime4 一次命令执行获得的fpsint(framecount60(framecountvsyncovertimesum)) 还有一个命令是:adbshelldumpsysSurfaceFlingerlatencyLayerName这个命令能获取游戏视频应用的fps数据 其中LayerName在各个不同系统中获取的命令是不一样的 在Android6系统直接就是SurfaceView 在Android7系统中可以通过dumpsyswindowwindowsgrepmSurfacegrepSurfaceView然后通过数据截取到 在Android8系统中可以通过dumpsysSurfaceFlingergrepandroid包名获取到 执行命令结果如下: 计算方法比较简单,一般打印出来的数据是129行(部分机型打印两次257行,但是第一部分是无效数据,取后半部分),取len2的第一列数据为endtime,取len128的第一列数据为starttime fps127((endtimestarttime)1000000。0) 至于为啥要取第一列数据,这里不做过多介绍,欢迎参看这两篇文章 老罗的文章SurfaceView原理 Android性能测试之fps获取 至于为啥要处于1000000,因为命令打印出来的是纳秒单位,要转为毫秒进行计算,127就是因为命令一次打印出来127帧的数据而已adbCPU占用率数据采集 有两种方法可以获取 1)adbshelltopn5grep,第三列就是实时监控的CPU占用率(n指定执行次数,不需root权限),这边top命令执行需要2到3s左右,一般可以采用busybox的top命令执行,效率会快很多 2)adbshelldumpsyscpuinfogrep 两种方法直接区别在于,top是持续监控状态,而dumpsyscpuinfo获取的实时CPU占用率数据adb耗电量数据采集 adb命令:adbshelldumpsysbatterystatspackagepid(Android5。0后引入) 获取单个应用的耗电量信息,具体返回结果待研究 adb命令:adbshelldumpsysbattery 出现信息解读: ACpowered:false是否连接AC(电源)充电线 USBpowered:true是否连接USB(PC或笔记本USB插口)充电 Wirelesspowered:false是否使用了无线电源 status:1电池状态,2为充电状态,其他为非充电状态 level:58电量() scale:100。电量最大数值 voltage:3977当前电压(mV) currentnow:335232。当前电流(mA) temperature:355电池温度,单位为0。1摄氏度 technology:Lipoly。电池种类 adb采集流量数据 adb命令:adbshelldumpsyspackagepidgrepUID〔通过ps命令,获取app的UID(安装后唯一且固定)〕 adbshellcatprocuidstatUIDtcprcv〔cat为查看命令,读取tcprcv获取应用接收流量信息(设备重启后清零)〕 adbshellcatprocuidstatUIDtcpsnd〔cat为查看命令,读取tcpsnd获取应用发送流量信息(设备重启后清零)〕 计算流量消耗步骤:执行一次这两条命令,获取到应用的开始接收及发送的流量然后我们再操作应用,执行一段时间测试再次执行上述2条命令可以获取到应用结束时候的接收及发送的流量,通过相减及得到应用的整体流量消耗 或者还有一种方式获取应用流量消耗:首先获取应用固定uid dumsyspackageandroid包名grepuserId执行catprocnetxtqtaguidstatsgrepuid其中第6列代表rxbytes接收的字节数,第8列为txbytes发送的字节数 一个uid可能对应多个进程,把数据累加就行 两个时间片中间应用流量的消耗,就计算接收字节数的差值就行adb采集CPU温度 首先判断类型: catsysclassthermalthermalzonetype 只有红框框出来的是有效的 catsysclassthermalthermalzonetemp 获取CPU温度 adb采集电池温度 dumpsysbatterygreptemperature单位0。1摄氏度 adb采集整机CPU使用率和分核CPU使用率 获取procstat文件内容(无权限限制) 总的cpu时间片是totalusernicesystemidleiowaitirqsoftirq 忙碌时间为notidleusernicesystemiowaitirqsoftirq cpu使用率计算方法为,先取开始的total值和忙碌时间notidle,隔一段时间片,再取一次计算total2,notidle2,cpuuse(notidle2notidle)100(total2total) PS:由于Android8权限收紧,在Android8系统手机内apk内读取文件内容为空,需要shell权限才可获取文件内容,下同adb采集各核cpu频率 读sysdevicessystemcpucpuXcpufreqscalingcurfreq文件的值,X不定,看是几核手机,scalingcurfreq是否存在也不一定,需要判断 至于为啥不取cpuinfocurfreq文件的值,原因是android6,7系统获取的时候,这个文件shell没有读取权限,需要root权限 adb获取当前运行于手机前端的应用的包名 Android6,7系统可执行 dumpsyswindowwindowsgrepmCurrentFocus 执行结果一般为类似: mCurrentFocusWindow{81caaa5u0com。tencent。mobileqqcom。tencent。mobileqq。activity。SplashActivity} 按照一定规则把com。tencent。mobileqq提取出来即可adb采集GPU占用率,目前支持高通GPU芯片(QualcommAdreno系列) 直接apk内读取文件即可,不需要shell权限(支持到Android8) Gpu使用率获取:会得到两个值,(前一个后一个)100使用率 adbshellcatsysclasskgslkgsl3d0gpubusy Gpu工作频率: adbshellcatsysclasskgslkgsl3d0gpuclk adbshellcatsysclasskgslkgsl3d0devfreqcurfreq Gpu最大、最小工作频率: adbshellcatsysclasskgslkgsl3d0devfreqmaxfreq adbshellcatsysclasskgslkgsl3d0devfreqminfreq Gpu可用频率 adbshellcatsysclasskgslkgsl3d0gpuavailablefrequencies adbshellcatsysclasskgslkgsl3d0devfreqavailablefrequencies Gpu可用工作模式: adbshellcatsysclasskgslkgsl3d0devfreqavailablegovernors Gpu当前工作模式: adbshellcatsysclasskgslkgsl3d0devfreqgovernor注意事项所有dumpsys命令获取性能数据,如果adbshell进入终端执行,均要求执行有shell权限,如果PC端进入终端执行,则无此要求