1. 程式人生 > >Android UI效能專項測試及優化

Android UI效能專項測試及優化

1 UI卡頓(Jank)

內容的快速載入很重要,渲染的流暢性也很重要。android團隊把滯緩,不流暢的動畫定義為jank,一般是由於丟幀引起的。安卓裝置的螢幕重新整理率一般是60幀每秒(1/60fps=16.6ms每幀),所以你想要渲染的內容能在16ms內完成十分關鍵。每丟一幀,使用者就會感覺的動畫在跳動,會出現違和感。

2 專項優化方法

定位效能問題,一般需要多個工具配合使用,trace是必不可少的,既可以用DDMS裡面的,也可以用Android Device Monitor裡面帶的(支援分執行緒統計);再結合DDMS裡面的其他工具及開發人員選項裡面的工具便可解決問題。

2.1 UI過度繪製優化

在設定->開發者選項->除錯GPU過度繪製->開啟顯示過度繪製區域後,可以看見如下圖(對settings當前介面過度繪製進行分析):
這裡寫圖片描述
可以發現,開啟後在我們想要除錯的應用介面中可以看到各種顏色的區域,具體含義如下:

顏色 含義
無色 無過度繪製或WebView等的渲染區域
藍色 1x過度繪製
綠色 2x過度繪製
淡紅色 3x過度繪製
紅色 4x(+) 過度繪製

我們需要依據此顏色分佈進行程式碼優化,多數情況下,大面積的過度繪製一般是由於父佈局及上層容器設定了冗餘的background導致的。我們可以通過DDMS中的Dump View Hierarchy for UI Automator檢視過度繪製區域的層級結構,快速一層層的進行優化,如圖:
這裡寫圖片描述


另外,如果對於程式碼不熟悉,也可以通過resource-id或者text快速定位到其對應的layout佈局檔案中;

2.2冗餘層級優化及效能瓶頸查詢

使用Hierarchy View工具來進行兩點優化
A.查詢整個view樹中的冗餘層級,減少層次,優化結構;
B.快速找出效能瓶頸位置(通過分析各view中measure,layout,draw時間比例)

2.2.1 啟動Hierarchy View
一種是在Android sdk中,在 tools 目錄下面找到hierarchyviewer.bat即可
另外一種從Android Device Monitor中開啟,啟動 Android Device Monitor 成功之後,在新的視窗中點選切換檢視圖示,選擇 Hierarchy View ,如下圖:
這裡寫圖片描述

2.2.2 load Activity的view樹

黑體字就是表示當前介面的Activity,雙擊就load,等下下就能看見view tree了
這裡寫圖片描述

Ps:該功能只能用在開發機或者虛擬機器上,普通的手機沒法用(安全性考慮);第三方虛擬機器如bluestack可以使用,速度比較快;Android自帶的虛擬機器也可以,就是速度比較慢。

這裡寫圖片描述
上圖所示為一個Activity的view tree,右上角視窗是整個樹結構的概覽圖,右下角視窗是整個介面的概覽圖,中間視窗可以拖拽、縮放,選中某個view後會顯示詳細資訊,右下角視窗標識出對應區域,Tree View視窗底部有搜尋功能。
一個介面的層次結構越複雜、層級越深,測量、繪製時所需要的時間就越多;通過檢視view tree,可以快速定位冗餘層級,減少不必要層次(線性排列的view group能否合併)、合併不必要分割(比如兩個兄弟view group能否合併)。

2.2.3 Obtain layout time for tree rooted as selected node

這裡寫圖片描述

選中一個view後,點選上圖中的綠紅紫按鈕,就會以該view為根節點,測量它所有子view的measure、layout、draw時間。Ps:用第三方的虛擬機器,比如bluestack,該功能不好使,可以用Android自帶的虛擬機器,也不好用的時候,換不同的Android版本試試;
得到下圖所示結果:

這裡寫圖片描述

點選每個view都可以看到具體細節,詳細意義如下圖:

這裡寫圖片描述

每個view裡紅色,黃色和綠色的圓圈,它們表示該view在那一層樹形結構裡measure,layout和draw所花費的相對時間(從左到右)。綠色表示最快的前50%,黃色表示最慢的前50%,紅色表示那一層裡面最慢的view。顯然,紅色的部分是我們優先優化的物件。

2.3 靜態頁面靜態測試及優化

靜態頁面標準:在當前介面中沒有動畫,沒有主動執行的後臺操作,介面是靜態的,意味著這種情況下是不會有cpu消耗或者極少消耗。
當我們在使用app過程中,需要重點測試有各類動畫和後臺功能的頁面,當該頁面切換到靜態頁面時,該頁面可能有兩種狀態,onStop或者onDestroy了,這時執行靜態測試,測試是否有未停止的動畫、執行緒、未remove的handler runnable等;

測試方法1
在開發者選項中,開啟顯示CPU使用情況開關,如下圖
A.在右邊會顯示當前執行的程序列表,排列順序是按照CPU佔用降序排列,越往上表示消耗CPU越多
B. 綠色表示 userspace佔用cpu百分比,紅色表示kernel 佔用cpu百分比,藍色表示 io interrupt 佔用cpu百分比.
C. 第一行表示所有程序疊加的佔用CPU百分比,從左到右三個數表示userspace,kernel,io interrupt
這裡寫圖片描述
通過觀察被測應用程序的cpu使用情況,理論情況下,靜態頁面中,應用應該不消耗或者消耗極少的cpu,如果應用程序一直排在前面在消耗cpu的情況,說明一直有方法在執行,這時可以使用測試方法2找出哪些方法在後面跑。

測試方法2
使用DDMS中的Traceview進行定位
Traceview工具是一個分析器,記錄了應用程式中每個函式的執行時間;
開啟DDMS,然後選擇一個程序,接著點選上面的“Start Method Profiling”按鈕(紅色小點變為黑色即開始執行,再次點選後停止)。

靜態情況下,幾乎沒有cpu消耗,如下圖
這裡寫圖片描述

有幀動畫在執行,如下圖,AnimationDrawable是幀動畫相關的方法
這裡寫圖片描述
通過Traceview,可以查找出哪些方法沒有正確的停止,避免不必要的cpu消耗,影響效能;

2.4啟動速度優化

1.從程式碼層面直接查詢Activity初始化時,初始化了哪些方法,依次估算這些方法的效能消耗,儘可能的不要在主執行緒中執行耗時操作,影響介面重新整理造成卡頓;
2.使用Traceview進行定位
啟動應用或者頁面時同時開始Trace採集,可以看到所有方法消耗cpu的百分比及排序,將方法依次對應回程式碼中,特別是觀察執行在main執行緒的方法有沒有優化空間;
3.不必須模組使用時載入
不必要的模組或者不必要的方法,延時載入或者使用時動態載入。比如drawerlayout的側邊欄,FrameLayout中的多個層,可以使用時再載入;Viewpager的多個頁面平衡什麼時候載入;

2.5 列表滑動卡頓優化

A. 使用GPU呈現模式圖考核UI效能
通過開發者選項中GPU呈現模式圖工具來進行流暢度考量的流程是(注意:如果是在開啟應用後才開啟此功能,記得先把應用結束後重新啟動)在設定->開發者選項->GPU呈現模式(不同裝置可能位置或者叫法不同)中開啟除錯後可以看見如下圖(對settings當前介面上下滑動列表後的圖表):
這裡寫圖片描述

開啟上圖視覺化工具後,我們可以在手機畫面上看到豐富的GPU繪製圖形資訊,分別展示了StatusBar、Activity區域等的GPU渲染時間資訊,隨著介面的重新整理,介面上會以實時柱狀圖來顯示每幀的渲染時間,柱狀圖越高表示渲染時間越長,每個柱狀圖偏上都有一根代表16ms基準的綠色橫線,每一條豎著的柱狀線都包含三部分(藍色代表測量繪製Display List的時間,prepare(紫色),紅色代表OpenGL渲染Display List所需要的時間,黃色代表CPU等待GPU處理的時間),只要我們每一幀的總時間低於基準線就不會發生UI卡頓問題(個別超出基準線其實也不算啥問題的)。

可以發現,這個工具是有侷限性的,他雖然能夠看出來有幀耗時超過基準線導致了丟幀卡頓,但卻分析不到造成丟幀的具體原因。所以說為了配合解決分析UI丟幀卡頓問題我們還需要藉助traceview和systrace來進行原因追蹤。

B. 使用Systrace進行分析優化
開啟DDMS->Capture system wide trace using Android systrace->設定時間與選項點選OK就開始了抓取,接著操作APP,完事生成一個trace.html檔案,用Chrome開啟即可如下圖:
這裡寫圖片描述
介面很複雜,涉及的東西比較多,要想完全弄明白需要紮實的Android基礎;
主要看兩個地方,一個是如圖帶有警示標示的圓圈,這些都是有問題的地方,點選小圓圈在左下方會有詳細說明
這裡寫圖片描述
這裡寫圖片描述

另外一個地方看,帶有F標記的小圓圈
這裡寫圖片描述
每個F標記表示一幀,原點不是綠色的基本都代表存在一定問題,點選後下面會提示你選擇的幀相關詳細資訊或者alert資訊,但是遺憾的是通過Systrace只能大體上發現是否存在效能問題,具體問題還需要通過Traceview或者程式碼中嵌入Trace工具類等去繼續詳細分析;
這裡寫圖片描述

2.6 主執行緒block自動化監測工具——BlockCanary

BlockCanary對主執行緒操作進行了完全透明的監控,並能輸出有效的資訊,幫助開發分析、定位到問題所在,迅速優化應用。其特點有:
非侵入式,簡單的兩行就開啟監控,不需要到處打點,破壞程式碼優雅性。
精準,輸出的資訊可以幫助定位到問題所在(精確到行),不需要像Logcat一樣,慢慢去找。
目前包括了核心監控輸出檔案,以及UI顯示卡頓資訊功能。
具體原理參見git地址:https://github.com/markzhai/AndroidPerformanceMonitor
可以設定debug模式下彈通知欄,方便定位問題

這裡寫圖片描述

2.7 記憶體洩漏查詢及優化

~~待續

相關推薦

Android UI效能專項測試優化

1 UI卡頓(Jank) 內容的快速載入很重要,渲染的流暢性也很重要。android團隊把滯緩,不流暢的動畫定義為jank,一般是由於丟幀引起的。安卓裝置的螢幕重新整理率一般是60幀每秒(1/60fps=16.6ms每幀),所以你想要渲染的內容能在16ms內完

Python程式設計實現對2個字串最長的公共子串的多種求解方式,效能測試優化

解法1-暴力求解法: def LongestCommonSubstring(FirstString,SecondString): ''' 求最長子串解法1: 以字串1的每個漢字作為起始位置 去字串2中找到能與之匹配的最長長度 將這個長度和記錄的最長長度比較

Android UI效能優化實戰 識別繪製中的效能問題

                     1、概述2015年初google釋出了Android效能優化典範,發了16個小視訊供大家欣賞,當時我也將其下載,通過微信公眾號給大家推送了百度雲的下載地址(地址在文末,ps:歡迎大家訂閱公眾號),那麼近期google又在udacity上開了系列類的相關課程。有了上述的

Android效能專項測試之耗電量統計API

耗電量API Android系統中很早就有耗電量的API,只不過一直都是隱藏的,Android系統的設定-電池功能就是呼叫的這個API,該API的核心部分是呼叫了com.android.internal.os.BatteryStatsHelper類,利用P

Android效能專項測試之Allocation Tracker(Device Monitor)

Allocation Tracker 能做什麼? 追蹤記憶體分配資訊,按順序排列,這樣我們就能清晰看出來某一個操作的記憶體是如何一步一步分配出來的。比如在有記憶體抖動的可疑點,我們可以通過檢視其記憶體分配軌跡來看短時間內有多少相同或相似的物件被建立,進

JNI/NDK開發指南(九)——JNI呼叫效能測試優化

在前面幾章我們學習到了,在Java中宣告一個native方法,然後生成本地介面的函式原型宣告,再用C/C++實現這些函式,並生成對應平臺的動態共享庫放到Java程式的類路徑下,最後在Java程式中呼叫宣告的native方法就間接的呼叫到了C/C++編寫的函數

[譯]Android UI 效能優化

。水平有限,翻譯不妥之處請多多指教。UI渲染是指從App生成幀並顯示在螢幕上的行為。為了保證使用者體驗的流暢性,App需要在16ms內渲染完一幀以達到60fps的幀率(為什麼是60fps?)。如果你的App UI渲染緩慢,那麼系統會強制跳過某些幀,使用者就會感知到介面的“口吃”,也就是卡頓。(以下三段Goog

Android UI效能優化實戰 解決佈局複雜導致的程式奔潰

1、概述 2015年初google釋出了Android效能優化典範,發了16個小視訊供大家欣賞,當時我也將其下載,通過微信公眾號給大家推送了百度雲的下載地址(地址在文末,ps:歡迎大家訂閱公眾號),那麼近期google又在udacity上開了系列類的相關課程

多表外連線效能測試優化

   前提:資料庫中一共有三個表:class,book,phone,而且每個資料庫表中都有10萬條資料,三個表一共有30萬條資料,從大資料量的角度來檢測你寫的sql語句效能是如何的. 一.左連線 用s

Android效能專項測試之Allocation Tracker(Android Studio)

Android Studio版的特點 Allocation Tracker(AS)工具比Allocation Tracker(Eclipse)工具強大的地方是更炫酷,更清晰,但是能做的事情都是一樣的。 Allocation Tracker啟動

Android 系統性能優化(34)---Android UI 效能優化

Android官網 Slow rendering;個人覺得非常有價值,比如指出 物件分配、垃圾回收(GC)、執行緒排程以及Binder呼叫 是Android系統中常見的卡頓原因,更重要的是給出了定位和解決這些問題的方案;而非簡單地告訴你避免物件分配,減少佈局層級,減少過度

JNI/NDK開發指南(八)---JNI呼叫效能測試優化

在前面幾章我們學習到了,在Java中宣告一個native方法,然後生成本地介面的函式原型宣告,再用C/C++實現這些函式,並生成對應平臺的動態共享庫放到Java程式的類路徑下,最後在Java程式中呼叫宣告的native方法就間接的呼叫到了C/C++編寫的函數了,在C/C++

Android UI效能優化 檢測應用中的UI卡頓

一、概述 在做app效能優化的時候,大家都希望能夠寫出絲滑的UI介面,以前寫過一篇部落格,主要是基於Google當時釋出的效能優化典範,主要提供一些UI優化效能示例: 實際上,由於各種機型的配置不同、程式碼迭代歷史悠久,程式碼中可能會存在很多在U

Android UI效能優化—過度繪製篇

Android UI效能優化——過度繪製篇 過度繪製(overdraw) 過度繪製介紹 每過幾年,就會有傳聞說某個博物館在用x光掃描一副無價的名畫之後,發現畫作的作者其實重用了老的畫布,在名畫的底下還藏著另一副沒有被發現的畫作。有時候,博物館還能用

android效能專項測試流程和學習計劃

前陣子一直在研究效能測試,但是困難挺大的,公司也主要是功能測試為主,也沒有大神帶帶我這個小白…於是自己一個人滾滾爬爬一直停在指標啊,工具的學習上面,網上的文章也都是介紹某個效能工具的使用,就沒有一

Android效能專項測試之Heap Viewer工具

Heap Viewer能做什麼? 實時檢視App分配的記憶體大小和空閒記憶體大小發現Memory LeaksHeap Viewer使用條件 5.0以上的系統,包括5.0開發者選項可用Heap Viewer啟動 可以直接在Android studio工具欄中直接點選小機器人啟動:  還可以在Androi

Android效能專項測試之Memory Monitor工具

Memory Monitor能做什麼? 實時檢視App的記憶體分配情況 快速判斷App是否由於GC操作造成卡頓 快速判斷App的Crash是否是因為超出了記憶體 Memory Monitor使用準備 開發者選項可用 USB除錯開啟 備

效能壓力測試TPS優化之路---SYN__

SYN Cookie的原理和實現 2014年01月06日 16:56:15 zhangskd 閱讀數:28214 標籤: TCPIPlinux核心 更多 個人分類: TCP/IPKernel 所屬專欄: TCP協議優化

Android移動端專項測試與自動化測試Python篇

com 什麽 error: pytho 管理器 運行方式 Suite 時代 source 下面我們開始第一個簡單的Android UI自動化測試 1.使用adb命令連接真機或模擬器 2.打開uiautomatorviewer工具 3.使用uiautomatorviewer工

OpenCV_Python官方文件8——程式效能的檢測優化

OpenCV-Python Tutorials 獲取程式執行時間 OpenCV主要函式 cv2.getTickCount():記錄從參考點到程式執行完成的時間週期數 cv2.getTickFrequ