android基於adb的性能測試


應用CPU、內存、點亮、流量等數據,是應用測試的重要性能指標。本次以UC瀏覽器為例。
當前app測試中,每個正式版本都會專門做一輪性能測試,測試數據包括:

  • 1小時內存數據
  • 1小時CPU數據
  • 24小時電量數據

1.內存

調用dumpsys命令,獲取數據后,再進行數據處理。

1.1 測試前的准備工作:

內存、CPU測試前,手機環境需要為純凈的系統,避免其他干擾,需要刪除無關的應用,只安裝待測的app。建議手機重置

1.2 獲取app信息

#獲取包名:執行下一行命令后,進入app
adb shell am monitor
#獲取當前應用的進程
adb shell ps|grep com.UCMobile

結果如下:

u0_a227      30023   620 2464956 352744 0                   0 S com.UCMobile
u0_a227      30195   620 1901864  78448 0                   0 S com.UCMobile:SearchBackgroundProcess
u0_a227      30258   620 1910232  82752 0                   0 S com.UCMobile:MediaPlayerService
u0_a227      30425   620 1909840  86436 0                   0 S com.UCMobile:push
u0_a227      30475   620 1894068  77416 0                   0 S com.UCMobile:game
u0_a227      30558   620 1878216  70328 0                   0 R com.UCMobile:DownloadService
u0_a227      30583   620 1820128  55784 0                   0 R com.UCMobile:wificore
u0_a227      30637   620 1820128  55824 0                   0 R com.UCMobile:ppappstore

1.3 按進程或包名查看內存占用

adb shell dumpsys meminfo com.UCMobile

原文:https://blog.csdn.net/bigconvience/article/details/35553983
重點關注如下幾個字段:
(1) Native/Dalvik 的 Heap 信息
具體在上面的第一行和第二行,它分別給出的是JNI層和Java層的內存分配情況,如果發現這個值一直增長,則代表程序可能出現了內存泄漏。
參數含義:
dalvik : dalvik使用的內存
native : native堆上的內存,指C\C++堆的內存(android 3.0以后bitmap就是放在這兒)
other : 除了dalvik和native的內存,包含C\C++非堆內存······
Pss : 該內存指將共享內存按比例分配到使用了共享內存的進程
allocated : 已使用的內存
free : 空閑的內存
private dirty : 非共享,又不能被換頁出去的內存(比如linux系統中為了提高分配內存速度而緩沖的小對象,即使你的進程已經退出,該內存也不會被釋放)
share dirty : 共享,但有不能被換頁出去的內存

(2) Total 的 PSS 信息
這個值就是你的應用真正占據的內存大小,通過這個信息,你可以輕松判別手機中哪些程序占內存比較大了。

1.4 編寫腳本grabMem.sh,每隔一段時間獲取應用和進程的占用的內存。

#!/bin/sh
#傳入2個參數。第1個參數用於指定文件的前綴,便於區分
#第2個參數用於多設備時,指定設備
for i in `seq 1 5400`;do
	if [[ $2 == "" ]];then
		adb shell dumpsys meminfo com.UCMobile > $1_mem_package.text
		adb shell dumpsys meminfo com.UCMobile:SearchBackgroundProcess > $1_mem_package_SearchBackgroundProcess.text
		adb shell dumpsys meminfo com.UCMobile:MediaPlayerService > $1_mem_package_MediaPlayerService.text
		adb shell dumpsys meminfo com.UCMobile:push > $1_mem_package_push.text
		adb shell dumpsys meminfo com.UCMobile:game > $1_mem_package_game.text
		adb shell dumpsys meminfo com.UCMobile:DownloadService > $1_mem_package_DownloadService.text
		adb shell dumpsys meminfo com.UCMobile:wificore > $1_mem_package_wificore.text
		adb shell dumpsys meminfo com.UCMobile:ppappstore > $1_mem_package_ppappstore.text
	else
		adb -s $2 shell dumpsys meminfo com.UCMobile > $1_mem_package.text
		adb -s $2 shell dumpsys meminfo com.UCMobile:SearchBackgroundProcess > $1_mem_package_SearchBackgroundProcess.text
		adb -s $2 shell dumpsys meminfo com.UCMobile:MediaPlayerService > $1_mem_package_MediaPlayerService.text
		adb -s $2 shell dumpsys meminfo com.UCMobile:push > $1_mem_package_push.text
		adb -s $2 shell dumpsys meminfo com.UCMobile:game > $1_mem_package_game.text
		adb -s $2 shell dumpsys meminfo com.UCMobile:DownloadService > $1_mem_package_DownloadService.text
		adb -s $2 shell dumpsys meminfo com.UCMobile:wificore > $1_mem_package_wificore.text
		adb -s $2 shell dumpsys meminfo com.UCMobile:ppappstore > $1_mem_package_ppappstore.text
	fi
	sleep 1
done

1.5 步驟要點:

  • 1.設備鏈接電腦,確保應用已安裝
  • 2.電腦上啟動原始數據手機腳本./grabMem.sh version

2. cpu

https://blog.csdn.net/houzhizhen/article/details/79474427

pid: 進程ID. √
comm: task_struct結構體的進程名 √
state: 進程狀態, 此處為S 
ppid: 父進程ID (父進程是指通過fork方式,通過clone並非父進程) 
pgrp:進程組ID 
session:進程會話組ID 
tty_nr:當前進程的tty終點設備號 
tpgid:控制進程終端的前台進程號 
flags:進程標識位,定義在include/linux/sched.h中的PF_*, 此處等於1077952832 
minflt: 次要缺頁中斷的次數,即無需從磁盤加載內存頁. 比如COW和匿名頁 
cminflt:當前進程等待子進程的minflt 
majflt:主要缺頁中斷的次數,需要從磁盤加載內存頁. 比如map文件 
majflt:當前進程等待子進程的majflt 
utime: 該進程處於用戶態的時間,單位jiffies,此處等於166114 √
stime: 該進程處於內核態的時間,單位jiffies,此處等於129684 √
cutime:當前進程等待子進程的utime √
cstime: 當前進程等待子進程的utime √
priority: 進程優先級, 此次等於10. 
nice: nice值,取值范圍[19, -20],此處等於-10 
num_threads: 線程個數, 此處等於221 
itrealvalue: 該字段已廢棄,恆等於0 
starttime:自系統啟動后的進程創建時間,單位jiffies,此處等於2284 
vsize:進程的虛擬內存大小,單位為bytes 
rss: 進程獨占內存+共享庫,單位pages,此處等於93087 
rsslim: rss大小上限 
說明:

第10~17行主要是隨着時間而改變的量; 
內核時間單位,sysconf(_SC_CLK_TCK)一般地定義為jiffies(一般地等於10ms) 
starttime: 此值單位為jiffies, 結合/proc/stat的btime,可知道每一個線程啟動的時間點 
1500827856 + 2284/100 = 1500827856, 轉換成北京時間為2017/7/24 0:37:58 
第四行數據很少使用,只說一下該行第7至9個數的含義:

signal:即將要處理的信號,十進制,此處等於6660 
blocked:阻塞的信號,十進制 
sigignore:被忽略的信號,十進制,此處等於36088
#進程的cpu,只要關注utime,stime,cutime,cstime4列數值即可
adb shell cat /proc/23183/stat
#總的CPU,除了idle的不獲取,其他的全部獲取
adb shell cat /proc/stat|head -n 1

cpu.shell

#!/bin/sh
for i in `seq 1 10`;do
	echo "pid,process,uesr time,kernel time,cutime,cstime"
	for pid in `adb shell ps|grep com.UCMobile|awk '{print $2}'`;do
		adb shell cat /proc/${pid}/stat |awk '{print $1,$2,$14,$15,$17,$17}'|sed 's/ /,/g'
	done
	echo 'proc/stats,user,nice,system,iowait,irq,softirq,steal,guest,guest_nice'
	adb shell cat /proc/stat|head -n 1|awk '{print $1,$2,$3,$4,$6,$7.$8,$9,$10,$11}'|sed 's/ /,/g'
	sleep 1
done

sh cpu.sh > cpu.csv
將結果導入Excel表格中,應用的CPU差值除以CPU的總值,即可獲取CPU的占用率

3.電量

4.應用啟動時間

#獲取應用啟動activity
adb shell dumpsys activity activities |grep intent|grep --color com.UCMobile
#停止應用
adb shell am force-stop com.UCMobile
#觀察日志
adb logcat -s ActivityManager
#啟動應用
adb shell am start -n com.UCMobile/com.uc.browser.InnerUCMobile
#在手動啟動對比下

5.adb采集流量數據

新的安卓系統已經沒有uid_stat目錄,這個方法過時了

adb shell cat /proc/uid_stat/UID/tcp_rcv
adb shell cat /proc/uid_stat/UID/tcp_snd

6.參考:

https://blog.csdn.net/bigconvience/article/details/35553983
https://blog.csdn.net/houzhizhen/article/details/79474427
https://www.jianshu.com/p/6c0cfc25b038


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM