Android性能測(cè)試(內(nèi)存尸折、cpu啰脚、fps、流量实夹、GPU橄浓、電量)——adb篇

adb 常用命令

  1. 獲取連接設(shè)備號(hào):adb devices
  2. 列出設(shè)備所有已安裝的包名 (不需root權(quán)限)
    adb shell “pm list packages”,可以加上grep 進(jìn)行篩選(windows系統(tǒng)使用findstr /i "xxxx" 或者 find)

3)查看進(jìn)程列表:adb shell "ps"亮航,同時(shí)也能獲取到應(yīng)用的UID荸实,方式如下(不需root權(quán)限):


u0_a開(kāi)頭的都是Android的應(yīng)用進(jìn)程,Android的應(yīng)用的UID是從10000開(kāi)始缴淋,到19999結(jié)束准给,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a后面的數(shù)字就是該應(yīng)用的UID值減去FIRST_APPLICATION_UID所得的值重抖,所以露氮,對(duì)于截圖這個(gè)應(yīng)用進(jìn)程,它是u0_a155仇哆,按前面的規(guī)制沦辙,它的UID就是155 + FIRST_APPLICATION_UID = 10155。

內(nèi)存說(shuō)明

VSS - Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
RSS - Resident Set Size 實(shí)際使用物理內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
PSS - Proportional Set Size 實(shí)際使用的物理內(nèi)存(比例分配共享庫(kù)占用的內(nèi)存)
USS - Unique Set Size 進(jìn)程獨(dú)自占用的物理內(nèi)存(不包含共享庫(kù)占用的內(nèi)存)
一般來(lái)說(shuō)內(nèi)存占用大小有如下規(guī)律:VSS >= RSS >= PSS >= USS

adb 查看單個(gè)內(nèi)存占用量 (均不需要root權(quán)限)

  1. 單個(gè)應(yīng)用的最大內(nèi)存限制

    adb shell "getprop | grep heapgrowthlimit"
  2. 應(yīng)用啟動(dòng)后分配的初始內(nèi)存

    adb shell "getprop|grep dalvik.vm.heapstartsize"
  3. 單個(gè)java虛擬機(jī)的最大內(nèi)存限制

    adb shell "getprop|grep dalvik.vm.heapsize"

adb內(nèi)存數(shù)據(jù)采集

使用 adb shell "dumpsys meminfo -s <pakagename | pid>"命令讹剔,輸出結(jié)果分以下4部分:

  1. process 以進(jìn)程的PSS從大到小依次排序顯示油讯,每行顯示一個(gè)進(jìn)程;
  2. OOM adjustment 分別顯示每類的進(jìn)程情況
  3. category 以Dalvik/Native/.art mmap/.dex map等劃分的各類進(jìn)程的總PSS情況
  4. total 總內(nèi)存延欠、剩余內(nèi)存陌兑、可用內(nèi)存、其他內(nèi)存

執(zhí)行結(jié)果如下圖由捎,重點(diǎn)取該應(yīng)用的TOTAL 對(duì)應(yīng)的內(nèi)存占用大型米邸(KB)

PS:在apk內(nèi)調(diào)用運(yùn)行獲取其他app的內(nèi)存數(shù)據(jù)則需要root權(quán)限

adb fps(每秒幀數(shù),計(jì)算流暢度)數(shù)據(jù)采集

adb命令:adb shell dumpsys gfxinfo <package | pid>

前提:開(kāi)發(fā)者選項(xiàng)=>GPU呈現(xiàn)模式分析確保打開(kāi)=>在adb shell dumpsys gfxinfo中or 在屏幕上顯示為線型圖
方法僅適用于Android原生應(yīng)用狞玛,不適用于游戲

正常情況下幀率應(yīng)該在16.67ms左右软驰,1秒60幀,執(zhí)行結(jié)果如下:


gfxinfo

詳細(xì)計(jì)算方法如下:

  1. 首先獲取執(zhí)行一次命令打印出來(lái)的結(jié)果,重點(diǎn)關(guān)注Draw Prepare Process Execute 行下面的數(shù)據(jù)
    Draw:是消耗在構(gòu)建java顯示列表DisplayList的時(shí)間心肪。說(shuō)白了就是執(zhí)行每一個(gè)View的onDraw方法,創(chuàng)建或者更新每一個(gè)View的DisplayList對(duì)象的時(shí)間锭亏。
    Process:表示是消耗在Android的2D渲染器執(zhí)行顯示列表的時(shí)間,view越多硬鞍,要執(zhí)行的繪圖命令就越多慧瘤,時(shí)間就越長(zhǎng)
    Execute:消耗在排列每個(gè)發(fā)送過(guò)來(lái)的幀的順序的時(shí)間.或者說(shuō)是CPU告訴GPU渲染一幀的時(shí)間,這是一個(gè)阻塞調(diào)用,因?yàn)镃PU會(huì)一直等待GPU發(fā)出接到命令的回復(fù)戴已。所以這個(gè)時(shí)間,一般都很短锅减。
    Draw + Prepare+Process + Execute = 完整顯示一幀 糖儡,這個(gè)時(shí)間要小于16ms才能保存每秒60幀。

  2. 計(jì)算總數(shù)據(jù)的行數(shù) frame_count = row_num, 計(jì)算每行渲染時(shí)間render_time = Draw + Prepare+Process + Execute, 當(dāng)渲染時(shí)間>16.67ms(1000/60),按照垂直同步機(jī)制怔匣,該幀已經(jīng)渲染超時(shí)

  3. 一旦render_time>16.67 算一次jank(丟幀),一旦jank握联,需要用掉額外的vsync
    vsync_overtime = 向上取整(render_time/16.67) - 1
    比如:render_time = 66.68 vsync_overtime = 3
    render_time = 67 vsync_overtime = 4
    一次命令執(zhí)行獲得的fps = int( frame_count * 60 / (frame_count + vsync_overtime_sum))

還有一個(gè)命令是: adb shell dumpsys SurfaceFlinger --latency LayerName

這個(gè)命令能獲取游戲/視頻應(yīng)用的fps數(shù)據(jù)

其中LayerName在各個(gè)不同系統(tǒng)中獲取的命令是不一樣的
在Android 6系統(tǒng)直接就是SurfaceView
在Android 7系統(tǒng)中可以通過(guò) dumpsys window windows | grep mSurface | grep SurfaceView 然后通過(guò)數(shù)據(jù)截取到
在Android 8系統(tǒng)中可以通過(guò) dumpsys SurfaceFlinger | grep android包名獲取到

執(zhí)行命令結(jié)果如下:


計(jì)算方法比較簡(jiǎn)單,一般打印出來(lái)的數(shù)據(jù)是129行(部分機(jī)型打印兩次257行每瞒,但是第一部分是無(wú)效數(shù)據(jù)拴疤,取后半部分),取len-2的第一列數(shù)據(jù)為end_time独泞,取len-128的第一列數(shù)據(jù)為start_time
fps = 127/((end_time - start_time) / 1000000.0)
至于為啥要取第一列數(shù)據(jù)呐矾,這里不做過(guò)多介紹,歡迎參看這兩篇文章
老羅的文章SurfaceView原理
Android性能測(cè)試之fps獲取
至于為啥要處于1000000懦砂,因?yàn)槊畲蛴〕鰜?lái)的是納秒單位蜒犯,要轉(zhuǎn)為毫秒進(jìn)行計(jì)算,127就是因?yàn)槊钜淮未蛴〕鰜?lái)127幀的數(shù)據(jù)而已

adb CPU占用率數(shù)據(jù)采集

有兩種方法可以獲取
1) adb shell "top -n 5 | grep <package | pid>" 荞膘,第三列就是實(shí)時(shí)監(jiān)控的CPU占用率(-n 指定執(zhí)行次數(shù)罚随,不需root權(quán)限),這邊top命令執(zhí)行需要2到3s左右羽资,一般可以采用busybox 的top命令執(zhí)行淘菩,效率會(huì)快很多


2) adb shell "dumpsys cpuinfo | grep <package | pid>"
兩種方法直接區(qū)別在于,top是持續(xù)監(jiān)控狀態(tài)屠升,而dumpsys cpuinfo獲取的實(shí)時(shí)CPU占用率數(shù)據(jù)

adb 耗電量數(shù)據(jù)采集

adb命令:adb shell "dumpsys batterystats < package | pid>" (Android 5.0后引入)
獲取單個(gè)應(yīng)用的耗電量信息潮改,具體返回結(jié)果待研究

adb命令:adb shell "dumpsys battery"
出現(xiàn)信息解讀:
AC powered:false 是否連接AC(電源)充電線
USB powered:true 是否連接USB(PC或筆記本USB插口)充電
Wireless powered:false 是否使用了無(wú)線電源
status: 1 電池狀態(tài),2為充電狀態(tài)腹暖,其他為非充電狀態(tài)
level:58 電量(%)
scale: 100. 電量最大數(shù)值
voltage: 3977 當(dāng)前電壓(mV)
current now: -335232. 當(dāng)前電流(mA)
temperature:355 電池溫度汇在,單位為0.1攝氏度

technology:Li-poly. 電池種類

adb 采集流量數(shù)據(jù)

adb 命令:adb shell "dumpsys< package | pid> | grep UID" [通過(guò)ps命令,獲取app的UID(安裝后唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat為查看命令脏答,讀取tcp_rcv獲取應(yīng)用接收流量信息(設(shè)備重啟后清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat為查看命令糕殉,讀取tcp_snd獲取應(yīng)用發(fā)送流量信息(設(shè)備重啟后清零)]
計(jì)算流量消耗步驟:

  1. 執(zhí)行一次這兩條命令,獲取到應(yīng)用的開(kāi)始接收及發(fā)送的流量
  2. 然后我們?cè)俨僮鲬?yīng)用殖告,執(zhí)行一段時(shí)間測(cè)試
  3. 再次執(zhí)行上述 2 條命令可以獲取到應(yīng)用結(jié)束時(shí)候的接收及發(fā)送的流量阿蝶,通過(guò)相減及得到應(yīng)用的整體流量消耗

或者還有一種方式獲取應(yīng)用流量消耗:

  1. 首先獲取應(yīng)用固定uid
    dumsys package android包名 | grep userId
  2. 執(zhí)行cat /proc/net/xt_qtaguid/stats | grep uid



    其中第6列代表rx_bytes接收的字節(jié)數(shù),第8列為tx_bytes發(fā)送的字節(jié)數(shù)
    一個(gè)uid可能對(duì)應(yīng)多個(gè)進(jìn)程黄绩,把數(shù)據(jù)累加就行
    兩個(gè)時(shí)間片中間應(yīng)用流量的消耗羡洁,就計(jì)算接收字節(jié)數(shù)的差值就行

adb采集CPU溫度

首先判斷類型:
cat /sys/class/thermal/thermal_zone*/type


只有紅框框出來(lái)的是有效的
cat /sys/class/thermal/thermal_zone*/temp
獲取CPU溫度


adb采集電池溫度

dumpsys battery | grep temperature 單位0.1攝氏度


adb采集整機(jī)CPU使用率和分核CPU使用率

獲取/proc/stat文件內(nèi)容(無(wú)權(quán)限限制)


總的cpu時(shí)間片是 total = user+nice+system+idle+iowait+irq+softirq
忙碌時(shí)間為 notidle = user+nice+system +iowait+irq+softirq
cpu使用率計(jì)算方法為,先取開(kāi)始的total值和忙碌時(shí)間notidle宝与,隔一段時(shí)間片焚廊,再取一次計(jì)算total2,notidle2, cpuuse = (notidle2 – notidle) * 100 / (total2 - total)%

PS:由于Android 8權(quán)限收緊习劫,在Android 8系統(tǒng)手機(jī)內(nèi)apk內(nèi)讀取文件內(nèi)容為空咆瘟,需要shell權(quán)限才可獲取文件內(nèi)容,下同

adb 采集各核cpu頻率

讀/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值诽里,X不定袒餐,看是幾核手機(jī),scaling_cur_freq是否存在也不一定谤狡,需要判斷

至于為啥不取cpuinfo_cur_freq文件的值灸眼,原因是android 6,7系統(tǒng)獲取的時(shí)候,這個(gè)文件shell沒(méi)有讀取權(quán)限墓懂,需要root權(quán)限

參考文章:https://blog.csdn.net/long_zhimeng/article/details/45934899

adb獲取當(dāng)前運(yùn)行于手機(jī)前端的應(yīng)用的包名

Android 6,7系統(tǒng)可執(zhí)行
dumpsys window windows | grep "mCurrentFocus"

執(zhí)行結(jié)果一般為類似:
mCurrentFocus=Window{81caaa5 u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity}
按照一定規(guī)則把com.tencent.mobileqq提取出來(lái)即可

adb 采集GPU占用率焰宣,目前支持高通GPU芯片(Qualcomm Adreno系列)

直接apk內(nèi)讀取文件即可,不需要shell權(quán)限(支持到Android8)
Gpu使用率獲炔蹲小:會(huì)得到兩個(gè)值匕积,(前一個(gè)/后一個(gè))*100%=使用率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy

Gpu工作頻率:
adb shell cat /sys/class/kgsl/kgsl-3d0/gpuclk
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq

Gpu最大、最小工作頻率:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq

Gpu可用頻率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies

Gpu可用工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors

Gpu當(dāng)前工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor

注意事項(xiàng)

  1. 所有dumpsys命令獲取性能數(shù)據(jù)榜跌,如果adb shell進(jìn)入終端執(zhí)行闪唆,均要求執(zhí)行有shell權(quán)限,如果PC端進(jìn)入終端執(zhí)行钓葫,則無(wú)此要求
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悄蕾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子础浮,更是在濱河造成了極大的恐慌帆调,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豆同,死亡現(xiàn)場(chǎng)離奇詭異贷帮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诱告,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門撵枢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人精居,你說(shuō)我怎么就攤上這事锄禽。” “怎么了靴姿?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沃但,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我佛吓,道長(zhǎng)宵晚,這世上最難降的妖魔是什么垂攘? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮淤刃,結(jié)果婚禮上晒他,老公的妹妹穿的比我還像新娘。我一直安慰自己逸贾,他們只是感情好陨仅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著铝侵,像睡著了一般灼伤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咪鲜,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天狐赡,我揣著相機(jī)與錄音,去河邊找鬼疟丙。 笑死猾警,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隆敢。 我是一名探鬼主播发皿,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拂蝎!你這毒婦竟也來(lái)了穴墅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤温自,失蹤者是張志新(化名)和其女友劉穎玄货,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悼泌,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡松捉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馆里。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘世。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠踪,靈堂內(nèi)的尸體忽然破棺而出丙者,到底是詐尸還是另有隱情,我是刑警寧澤营密,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布械媒,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纷捞。R本人自食惡果不足惜痢虹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望主儡。 院中可真熱鬧奖唯,春花似錦、人聲如沸缀辩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臀玄。三九已至,卻和暖如春畅蹂,著一層夾襖步出監(jiān)牢的瞬間健无,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工液斜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留累贤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓少漆,卻偏偏與公主長(zhǎng)得像臼膏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子示损,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 那些年我們用過(guò)的顯示性能指標(biāo)Android客戶端性能優(yōu)化(魅族資深工程師毫無(wú)保留奉獻(xiàn))這一次渗磅,我優(yōu)化了37%的內(nèi)存...
    Art_Collector閱讀 10,400評(píng)論 2 22
  • 深圳市金融社贝喙螅卡個(gè)人辦理指南 申辦流程:參保人帶著以下資料到全市12家合作銀行的任一銀行網(wǎng)點(diǎn)申請(qǐng)辦理金融社币角澹卡。 ...
    xiaoxiatess閱讀 9,489評(píng)論 0 1
  • 1.關(guān)于斷牙 上小學(xué)時(shí)卖氨,需要早上六點(diǎn)起床会烙,有一次起晚了,所以心里焦急筒捺,走的匆忙持搜,經(jīng)過(guò)立交橋下的臺(tái)階時(shí),摔掉了半顆下...
    肆意不為閱讀 285評(píng)論 0 1