androidfps
A. 如何測量Android應用的幀率FPS
方法如下:
1.打開網路瀏覽器,在輸入欄里輸入gltools,並點擊下載安裝。
B. 如何測量Android應用的幀率FPS
測量Android應用的幀率FPS的方法如下:
首先打開設置,進行如下操作(「設置」->"開發者選項",然後勾選「GPU顯示配置文件」),以打開GPU呈現模式分析。如圖:
C. 如何測量Android應用的幀率FPS
通過 [設置]->[開發者選項]->[GPU呈現模式分析] ->[在屏幕上顯示為條形圖] 進行直觀的取樣,截圖如下:
繪制過程中的不同顏色具有不同的含義,詳細解釋請移步>> 官網查看更多。
那麼是不是說我只需要打開界面去數一下超過綠色閾值的柱狀圖有多少就可以觀察我們應用的流暢度了?然而並沒有,因為這個方式獲取到的渲染時間只是UI主線程上的繪制行為,目前我所接手的項目,採用的方式是捕捉相機的數據然後放到GPU中去進行繪制,有單獨的繪制線程,單獨的視圖,所以這個方案並不適合我手上的項目。
D. 如何測試安卓(Android)系統的流暢度
測試方法一:系統自帶-開發者模式
實際上,為了方便開發者測試,安卓本身就內置了流暢度檢測的功能。不過,這需要我們開啟隱藏的開發者選項。如果你在用原生系統,那麼開啟開發者選項的方法很簡單,進入到設置菜單「關於手機」頁面,點擊數次「版本號」,即可開啟開發者選項。如果用的是其他ROM,方法也許有所不同,比如說魅族的Flyme開啟開發者選項的方法是在撥號界面輸入「*#*#6961#*#*」,其他機器方法也各有不同,大家可以參照廠商的說明。
進入到開發者選項,可以看到有「GPU呈現模式分析」的選項,開啟後即可以條形圖和線形圖的方法顯示系統的界面響應速度,可以用以觀察系統流暢度。那麼要如何根據曲線判斷系統是否流暢呢?實際上這個曲線表達的是GPU繪制每一幀界面的時間,只要不超過頂部綠線,都可以視為足夠流暢。
開啟GPU呈現模式分析
FPS Meter可以顯示最大最小幀數以及平均幀數
FPS Meter可以測試界面幀數,不過某些手機如果界面靜止,幀數會為0。FPS Meter除了測量系統界面幀數外,還可以用來測量游戲的幀數,所以用FPS Meter來測試某部安卓機游戲性能多強也是個很好的選擇。
當然,FPS Meter也並非十全十美。由於屬於第三方App,所以可能會有一些兼容性問題。某些安卓機或者ROM使用FPS Meter可能會不兼容,即使成功開啟了幀數顯示也沒法測量到准確數值,而某些設備使用FPS Meter甚至會死機。不過在大多數情況下,這款App還是相當值得信任的。
安卓在多個版本中都通過新技術提升了流暢度,比如說安卓2.3引入Dalvik、安卓4.0引入GPU界面繪制、安卓4.1引入黃油計劃、安卓4.3引入Trim以及安卓4.4引入ART等等。
H5頁面載入速度:window.performance.timing
Android以上測試方法不適用h5頁面
如何分析頁面整體載入速度:
主要是查看指標值PAGET_頁面載入時間,此指標指的是頁面整體載入時間但不含(onload事件和redirect), 此指標值可直接反應用戶體驗, 從此項指標可以知道指定某時間段的頁面載入速度值,以及和天,周,月的對比狀況.也可以查詢指標ALLT_頁面完全載入時間, 可以查詢到從瀏覽器開始導航(用戶點擊鏈接或在地址欄輸入url或點刷新,後退按鈕)到頁面onload 事件js完全跑完的所有時間.如果發現頁面載入速度有增加或減少,則可以分項查詢前面表格中的每個指標值,總的來說他們的關系如下:
dom開始載入前所有花費時間=重定向時間+域名解析時間+建立連接花費時間+請求花費時間+接收數據花費時間
pageLoadTime頁面載入時間=域名解析時間+建立連接花費時間+請求花費時間+接收數據花費時間+解析dom花費時間+載入dom花費時間
allLoadTime頁面完全載入時間=重定向時間+域名解析時間+建立連接花費時間+請求花費時間+接收數據花費時間+解析dom花費時間+載入dom花費時間+執行onload事件花費時間
resourcesLoadedTime資源載入時間=解析dom花費時間+載入dom花費時間
流暢度暫時沒有發現好用的測試衡量工具,開發層面了解,主要是根據log分析
E. Android性能測試(內存、cpu、fps、流量、GPU、電量)——adb篇
3)查看進程列表:adb shell "ps",同時也能獲取到應用的UID,方式如下(不需root許可權):
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 shell "mpsys meminfo -s <pakagename | pid>"命令,輸出結果分以下4部分:
PS:在apk內調用運行獲取其他app的內存數據則需要root許可權
adb命令:adb shell mpsys gfxinfo <package | pid>
正常情況下幀率應該在16.67ms左右,1秒60幀,執行結果如下:
詳細計算方法如下:
還有一個命令是: adb shell mpsys SurfaceFlinger --latency LayerName
其中LayerName在各個不同系統中獲取的命令是不一樣的
在Android 6系統直接就是SurfaceView
在Android 7系統中可以通過 mpsys window windows | grep mSurface | grep SurfaceView 然後通過數據截取到
在Android 8系統中可以通過 mpsys SurfaceFlinger | grep android包名獲取到
執行命令結果如下:
計算方法比較簡單,一般列印出來的數據是129行(部分機型列印兩次257行,但是第一部分是無效數據,取後半部分),取len-2的第一列數據為end_time,取len-128的第一列數據為start_time
fps = 127/((end_time - start_time) / 1000000.0)
至於為啥要取第一列數據,這里不做過多介紹,歡迎參看這兩篇文章
老羅的文章SurfaceView原理
Android性能測試之fps獲取
至於為啥要處於1000000,因為命令列印出來的是納秒單位,要轉為毫秒進行計算,127就是因為命令一次列印出來127幀的數據而已
有兩種方法可以獲取
1) adb shell "top -n 5 | grep <package | pid>" ,第三列就是實時監控的CPU佔用率(-n 指定執行次數,不需root許可權),這邊top命令執行需要2到3s左右,一般可以採用busybox 的top命令執行,效率會快很多
2) adb shell "mpsys cpuinfo | grep <package | pid>"
兩種方法直接區別在於,top是持續監控狀態,而mpsys cpuinfo獲取的實時CPU佔用率數據
adb命令:adb shell "mpsys batterystats < package | pid>" (Android 5.0後引入)
獲取單個應用的耗電量信息,具體返回結果待研究
adb命令:adb shell "mpsys battery"
出現信息解讀:
AC powered:false 是否連接AC(電源)充電線
USB powered:true 是否連接USB(PC或筆記本USB插口)充電
Wireless powered:false 是否使用了無線電源
status: 1 電池狀態,2為充電狀態,其他為非充電狀態
level:58 電量(%)
scale: 100. 電量最大數值
voltage: 3977 當前電壓(mV)
current now: -335232. 當前電流(mA)
temperature:355 電池溫度,單位為0.1攝氏度
adb 命令:adb shell "mpsys< package | pid> | grep UID" [通過ps命令,獲取app的UID(安裝後唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat為查看命令,讀取tcp_rcv獲取應用接收流量信息(設備重啟後清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat為查看命令,讀取tcp_snd獲取應用發送流量信息(設備重啟後清零)]
計算流量消耗步驟:
或者還有一種方式獲取應用流量消耗:
首先判斷類型:
cat /sys/class/thermal/thermal_zone*/type
只有紅框框出來的是有效的
cat /sys/class/thermal/thermal_zone*/temp
獲取CPU溫度
mpsys battery | grep temperature 單位0.1攝氏度
獲取/proc/stat文件內容(無許可權限制)
總的cpu時間片是 total = user+nice+system+idle+iowait+irq+softirq
忙碌時間為 notidle = user+nice+system +iowait+irq+softirq
cpu使用率計算方法為,先取開始的total值和忙碌時間notidle,隔一段時間片,再取一次計算total2,notidle2, cpuuse = (notidle2 – notidle) * 100 / (total2 - total)%
PS:由於Android 8許可權收緊,在Android 8系統手機內apk內讀取文件內容為空,需要shell許可權才可獲取文件內容,下同
讀/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值,X不定,看是幾核手機,scaling_cur_freq是否存在也不一定,需要判斷
至於為啥不取cpuinfo_cur_freq文件的值,原因是android 6,7系統獲取的時候,這個文件shell沒有讀取許可權,需要root許可權
參考文章: https://blog.csdn.net/long_meng/article/details/45934899
Android 6,7系統可執行
mpsys window windows | grep "mCurrentFocus"
執行結果一般為類似:
mCurrentFocus=Window{81caaa5 u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity}
按照一定規則把com.tencent.mobileqq提取出來即可
直接apk內讀取文件即可,不需要shell許可權(支持到Android8)
Gpu使用率獲取:會得到兩個值,(前一個/後一個)*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當前工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor
F. Android App嫻佺晠搴FPS嫻嬭瘯鏂規硶鎬葷粨
Android App嫻佺晠搴﹀撫鐜囨祴璇曞疄鐢ㄦ寚鍗
棰勫囩煡璇嗭細
- 1. 閫氳繃楂橀熸憚鍍忔満鎴杋Phone褰曞埗瑙嗛戱紝鎹曟崏240甯/s鐨勫撫鐜囨祴璇
- 姝ラ1: 娓呴櫎鍚庡彴錛屽綍鍒惰仈緋諱漢婊戝姩榪囩▼錛屾椂闂寸害20縐掞紝娉ㄦ剰瑙嗛戣川閲忋
- 姝ラ2: QuickTime甯у洖鏀句腑錛岄夋嫨璧峰嬫竻鏅板撫(F1)浣滀負鍩哄噯銆
- 姝ラ3-5: 寰鐜媯鏌ワ紝璁$畻騫沖潎甯ф暟F錛屽啀奼傚撫鐜嘑ps銆
- 2. SurfaceFlinger鏂規硶錛屾繁搴﹀垎鏋愬簲鐢ㄧ▼搴忔祦鐣呭害
- 姝ラ1: 浣跨敤adb shell鍛戒護鑾峰彇SurfaceFlinger鏁版嵁錛屽叧娉"com.android.contacts#0"銆
- 姝ラ2: 娓呴櫎Buffer緙撳啿鍖猴紝紜淇濇暟鎹鍑嗙『鎬с
- 姝ラ3-4: 妯℃嫙嫻嬭瘯鍦烘櫙婊戝姩錛岃幏鍙栧撫鐩稿叧鏁版嵁錛岀洃鎺у撫寤惰繜銆佸撫鐜囧拰鎺夊撫銆
- 姝ラ5: 閫氳繃浠g爜璁$畻甯х巼錛岄伩寮adb service call SurfaceFlinger 1013銆
娣卞叆鍒嗘瀽錛
SurfaceFlinger鐨勫撫鐜囧垎鏋愭彁渚涗簡鏇磋︾粏鐨勬暟鎹錛岄氳繃鏌ョ湅搴旂敤紼嬪簭鎻愪氦甯у埌紜浠剁殑鏃墮棿鐐瑰拰甯у歡榪燂紝鎴戜滑鍙浠ュ垽鏂鍔ㄧ敾鐨勬祦鐣呮с傚撫鐜囪$畻涓嶄粎鍩轟簬甯ф暟閲忥紝榪樿冭檻浜嗗撫闂寸殑寤惰繜錛屽傛灉甯у歡榪熻法瓚婂埛鏂板懆鏈燂紝灝卞彲鑳藉艱嚧"jank"錛屽嵆浣垮鉤鍧囧撫鐜囬珮涔熷彲鑳藉嚭鐜板崱欏褲
閫氳繃"Gfxinfo"鏂規硶錛屾祴璇曟椂闇娉ㄦ剰鍖呭悕鐨勫樊寮傦紝濡"android.process.contacts"銆傝劇疆GPU鍛堢幇妯″紡鍒嗘瀽錛屾粦鍔ㄥ簲鐢ㄥ苟鏀墮泦120甯ф暟鎹錛岃$畻鐪熷疄甯х巼騫惰冭檻棰濆栫殑鍚屾ヨ剦鍐插獎鍝嶃
浣跨敤systrace宸ュ叿錛岄氳繃鎶撳彇trace鏂囦歡錛岄夋嫨鍚堥傜殑綰跨▼鍜屾椂闂村尯闂達紝鏌ョ湅UI Thread鍜孋horeographer甯ф暟錛屼互璇勪及搴旂敤紼嬪簭鍦ㄥ疄闄呬嬌鐢ㄤ腑鐨勫撫鐜囩ǔ瀹氭с
甯х巼涓庢樉紺烘妧鏈鐨勫尯鍒錛
甯х巼鍜屽埛鏂扮巼鏄涓や釜鐩稿叧浣嗕笉鍚岀殑姒傚康銆傚撫鐜囪閲忕敾闈㈡洿鏂伴熷害錛岃屽埛鏂扮巼鍒欐槸鏄劇ず璁懼囨帴鏀跺拰鏄劇ず鐢婚潰鐨勯熷害銆傝繃楂樼殑甯х巼騫朵笉鎬繪槸鎰忓懗鐫鏇村ソ鐨勭敤鎴蜂綋楠岋紝鍥犱負鏃犳晥甯у彲鑳藉艱嚧璧勬簮嫻璐瑰拰鏄劇ず闂棰樸
鍐呭瓨甯﹀戒笌嫻佺晠搴︾殑鍏崇郴錛
灞忓箷鐨勫埛鏂扮巼鍜屽撫鐜囧彈鍐呭瓨甯﹀介檺鍒訛紝濡傛灉鍐呭瓨閫熷害璺熶笉涓婏紝鍗充嬌甯х巼寰堥珮錛屼篃鍙鑳藉艱嚧鏄劇ず闂棰樸傜悊瑙h繖涓鍘熺悊鍙浠ュ府鍔╀紭鍖栧簲鐢ㄧ▼搴忥紝紜淇濆唴瀛樺拰鏄劇ず璁懼囩殑鍗忓悓宸ヤ綔銆