應用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
