Android 常用的效能分析工具詳解:GPU呈現模式, TraceView, Systrace, HirearchyViewer

來源:互聯網
上載者:User

標籤:綁定   command   height   指令碼   studio   fun   統計   安卓   strace   

此篇將重點介紹幾種常用的Android效能分析工具:

一、Logcat 日誌

選取Tag=ActivityManager,可以粗略地知道介面Displaying的時間消耗。當我們開啟一個Activity的時候,log會列印一串log如下:

I/ActivityManager﹕ Displayed xxx.xxx.xxx/TestActivity: +1s272ms (total +3s843ms)  
  • 第一個時間表示系統接受到開啟的intent到TestActivity介面顯示出來的時間1.272秒。
  • 第二個時間特殊情況下才會有。例如這種調用流程:A->B(在onCreate立刻finish掉自己,直接跳轉到C)->C(TestActivity),它包含了B頁面onCreate處理以及finish的時間。這個時間如果過長,會導致使用者點擊跳轉後,頁面還停留在原來介面,延遲一段時間再跳轉。這種體驗很差,使用者會覺得卡頓並容易點擊多次。很多應用程式的入口頁面,都設計成這種情況的跳轉。

 

在此我們只討論第一個時間,在這個時間內系統做了以下事情:ActivityManager做一些task相關的處理 -> 應用內建立Activity執行個體 -> Activity的onCreate->Activity的onResume->布局的初始化->首次繪製的一些東西,這個流程是指一個Activity在一個task初次建立的情況。如果是clearTop等流程,可能還涉及其他Activity的finish,自己onNewIntent等流程。

 

二、GPU呈現模式分析(Peofile GPU Rendering tool)

1. 在adnroid手機上開啟這個功能:開啟“開發人員選項”->“GPU呈現模式分析”->“在螢幕上顯示為橫條圖”

          

GPU呈現模式用來測量app的畫面播放速率,屬於GPU Profile工具的一種.目前安卓基礎60fps以滿幀數計算,60fps在一秒沒繪製造成,所以可以計算出1÷60≈1.66(繪製每幀需要的時間約為16ms)

 

2. 開啟GPU呈現模式之後,當你的應用程式在運行時,你會看到一排柱狀圖在螢幕上,從左至右動態地顯示,每一個垂直的柱狀圖代表一幀的渲染,越長的垂直柱狀圖表示這一幀需要渲染的時間越長.隨著需要渲染的幀數越來越多,他們會堆積在一起,這樣你就可以觀察到這段時間幀率的變化.

 

(1). 綠色水平線代表16ms,要確保一秒內打到60fps,你需要確保這些幀的每一條線都在綠色的16ms標記線之下.任何時候你看到一個豎線超過了綠色的標記現,你就會看到你的動畫有卡頓現象產生.  (2). 藍色代表測量繪製的時間,或者說它代表需要多長時間去建立和更新你的DisplayList.在Android中,一個視圖在可以實際的進行渲染之前,它必須被轉換成GPU所熟悉的格式,簡單來說就是幾條繪圖命令,複雜點的可能是你的自訂的View嵌入了自訂的Path. 一旦完成,結果會作為一個DisplayList對象被系統送入緩衝,藍色就是記錄了需要花費多長時間在螢幕上更新視圖(說白了就是執行每一個View的onDraw方法,建立或者更新每一個View的Display List對象).當你看到藍色的線很高的時候,有可能是因為你的一堆視圖突然變得無效了(即需要重新繪製),或者你的幾個自訂視圖的onDraw函數過於複雜.  (3). 紅色代表執行的時間,這部分是Android進行2D渲染 Display List的時間,為了繪製到螢幕上,Android需要使用OpenGl ES的API介面來繪製Display List.這些API有效地將資料發送到GPU,最總在螢幕上顯示出來.  (4). 橙色部分表示的是處理時間,或者說是CPU告訴GPU渲染一幀的時間,這是一個阻塞調用,因為CPU會一直等待GPU發出接到命令的回複,如果柱狀圖很高,那就意味著你給GPU太多的工作,太多的負責視圖需要OpenGL命令去繪製和處理.   

 

3. 如果需要分析具體詳細的資料,需要結合下面的命令來進行:

$ adb shell dumpsys gfxinfo your_package

執行該命令產生的日誌中,你會發現一個標題為: Profile data in ms. 這一節包含為每個視窗所屬應用產生的3列表格。 為了使用這些資料, 簡單的複製表格到你喜歡的試算表軟體中就會產生一個堆疊柱狀圖表。下面的圖是借用網上他人的測量結果:

每列給出渲染每幀大概需要多長時間:

 

(1). Draw 對應於藍色線:是消耗在構建java顯示列表DisplayList的時間。說白了就是執行每一個View的onDraw方法,建立或者更新每一個View的DisplayList對象的時間。  (2). Process 對應於紅色線:是消耗在Android的2D渲染器執行顯示列表的時間。你的視圖層次越多,要執行的繪圖命令就越多。  (3). Execute 對應於橙色線:是消耗在排列每個發送過來的幀的順序的時間.或者說是CPU告訴GPU渲染一幀的時間,這是一個阻塞調用,因為CPU會一直等待GPU發出接到命令的回複。其實可以簡單理解為:紅色線<span style="font-family: Arial, Helvetica, sans-serif;">Process時間+GPU返回時</span><span style="font-family: Arial, Helvetica, sans-serif;">GPU</span><span style="font-family: Arial, Helvetica, sans-serif;">與CPU通訊的時間</span>  

 

注意:使順利在60幀,每幀必須小於16毫秒完成。

 

關於Execute:如果執行耗費了過長的時間,這意味著你是跑在前面的圖形管線。 android在運行時可以有3個緩衝區.如果你需要另一個應用程式將阻塞直到其中的一個緩衝區釋放出來。兩個原因會發生這種情況。第一,你的應用在Dalvik中快速繪製但在GPU顯示列表時候消耗了大量時間。第二,你的應用程式花了很長的時間來執行第幾幀;一旦管線滿了他將無法趕上。

 

GPU Profile工具能夠很好地協助你找到渲染相關的問題,但是要修複這些問題就不是那麼簡單了。保持動畫流暢的關鍵就在於讓這些垂直的柱狀條儘可能地保持在綠線下面,任何時候超過綠線,你就有可能丟失一幀的內容。你需要結合代碼來具體分析,找到效能的瓶頸,並進行最佳化.有時候你可以開啟GPU呈現模式來測試所謂的流暢度,讓負責設計這個產品的人修改他的設計,以獲得良好的使用者體驗。 三、TraceViewAndroid內建的TraceView堪比java的效能調優工具,可以方便的查看線程的執行情況,某個方法執行時間、調用次數、在總體中的佔比等,從而定位效能點。
1. 運行TraceView有兩種方式
(a).調用Debug類
//在開始調試的地方,如Activity的onCreate函數,添加  Debug.startMethodTracing("tracefilename");    //結束調試的地方,如Activity的onDestroy函數,添加  Debug.stopMethodTracing(); 
 之後運行你的app一段時間並退出會在sd卡根目錄產生tracefilename.trace這個log檔案,記錄這段時間內的運行資訊。將記錄檔pull到PC端,cd到android sdk tools檔案夾內(或綁定sdk tools目錄到系統path內),運行traceview tracefilename.trace即可開啟TraceView分析介面,如下這種方式可以隨意開始和結束調試的位置,所以適合具體代碼的效能排查。 (b). 使用DDMs開啟devices視窗,選擇某個進程,點擊右上方的start method profiling

 

運行app一段時間後,再點擊已變成stop method profiling的該按鈕。eclipse會自動彈出debug的標籤(可通過菜單File->save as儲存資料), 介面同上面。這種方式不需要修改代碼,所以對於沒有源碼的程式同樣可以進行排查。同時可以方便的進行全域效能排查。

2. TraceView介面資訊介紹。TraceView介面包括時間面板和方法面板
(1) 時間面板(Timeline Panel)
時間面板展示了每個線程的執行情況,其中的[1]main即為ui主線程。
移動到某個位置可以查看該點對應的方法的執行資訊,點擊方法面板則會選中相應的方法。
可以左鍵按住不放選中地區放大局部精細查看,不同方法用不同顏色標註
 
(2) 方法面板(Profile Panel)
方法面板展示了所有方法的執行情況,點擊某個方法可以查看在對應線程上的執行時間地區,並會顯示其父方法及子方法。
每個方法包括如下資訊列,可點擊某列進行排序,從而確定產生效能問題的函數:

 1 Incl Cpu Time   2 Excl Cpu Time   3 Incl Real Time   4 Excl Real Time   5 Incl Cpu Time%   6 Excl Cpu Time%   7 Incl Real Time%   8 Excl Real Time%   9 Calls+RecurCalls/Total  10 Cpu Time/Call   11 Real Time/Call  
 所有的Time都是以毫秒計算。每列具體含義及作用如下:

 

 四、Systrace 效能分析的工具1. Systrace是Android4.1中新增的效能資料採樣和分析工具。它可協助開發人員收集Android關鍵子系統(如surfaceflinger、WindowManagerService等Framework部分關鍵模組、服務)的運行資訊,從而協助開發人員更直觀的分析系統瓶頸,改進效能。Systrace的功能包括跟蹤系統的I/O操作、核心工作隊列、CPU負載以及Android各個子系統的健全狀態等。在Android平台中,它主要由3部分組成:
  • 核心部分:Systrace利用了Linux Kernel中的ftrace功能。所以,如果要使用Systrace的話,必須開啟kernel中和ftrace相關的模組。
  • 資料擷取部分:Android定義了一個Trace類。應用程式可利用該類把統計資訊輸出給ftrace。同時,Android還有一個atrace程式,它可以從ftrace中讀取統計資訊然後交給資料分析工具來處理。
  • 資料分析工具:Android提供一個systrace.py(python指令檔,位於Android SDK目錄/tools/systrace中,其內部將調用atrace程式)用來配置資料擷取的方式(如採集資料的標籤、輸出檔案名等)和收集 ftrace統計資料並產生一個結果網頁檔案供使用者查看。
從本質上說,Systrace是對Linux Kernel中ftrace的封裝。Android 4.1為系統中的幾個關鍵進程和模組都添加了Systrace功能。2. 如何使用 Systracesystrace 可以通過命令啟動,或者使用eclipse, android studio啟動。systrace 工具你可以在sdk/platform-tools/ 找到,或者在源碼裡位於 external/chromium-trace 下面。Systrace在各個平台上的使用流程基本是一樣的:
(1)手機準備好你要進行抓取的介面
(2)點擊開始抓取(命令列的話就是開始執行命令)
(3)手機上開始操作
(4)設定好的時間到了之後,會將產生Trace檔案,使用Chrome將這個檔案開啟進行分析
  • UsingEclipse
    1. In Eclipse, open an Android application project.  2. Switch to the DDMS perspective, by selecting Window > Perspectives > DDMS.  In the Devices tab, select the device on which to run a trace. If no devices are listed, make sure your device is connected via USB cable and that debugging is enabled on the device.  3. Click the Systrace icon at the top of the Devices panel to configure tracing.  4. Set the tracing options and click OK to start the trace.  

     

 
  • Using Android Studio
    1. In Android Studio, open an Android application project.  2. Open the Device Monitor by selecting Tools > Android > Monitor.  3. In the Devices tab, select the device on which to run a trace. If no devices are listed, make sure your device is connected via USB cable and that debugging is enabled on the device.  4. Click the Systrace icon at the top of the Devices panel to configure tracing.  5. Set the tracing options and click OK to start the trace.  

     

 
  • UsingDevice Monitor
    1. Navigate to your SDK tools/ directory.  2. Run the monitor program.  3. In the Devices tab, select the device on which to run a trace. If no devices are listed, make sure your device is connected via USB cable and that debugging is enabled on the device.  4. Click the Systrace icon at the top of the Devices panel to configure tracing.  5. Set the tracing options and click OK to start the trace. 
 
  • Command Line Usage
你可以通過python systrace.py -h 來查看systrace 的使用協助
 1 Usage: systrace.py [options] [category1 [category2 ...]]   2 Example: systrace.py -b 32768 -t 15 gfx input view sched freq   3 Options:   4   -h, --help            show this help message and exit   5   -o FILE               write HTML to FILE   6   -t N, --time=N        trace for N seconds   7   -b N, --buf-size=N    use a trace buffer size of N KB   8   -k KFUNCS, --ktrace=KFUNCS   9                         specify a comma-separated list of kernel functions to  10                         trace  11   -l, --list-categories  12                         list the available categories and exit  13   -a APP_NAME, --app=APP_NAME  14                         enable application-level tracing for comma-separated  15                         list of app cmdlines  16   --link-assets         link to original CSS or JS resources instead of  17                         embedding them  18   --from-file=FROM_FILE  19                         read the trace from a file (compressed) rather than  20                         running a live trace  21   --asset-dir=ASSET_DIR  22   -e DEVICE_SERIAL, --serial=DEVICE_SERIAL  23                         adb device serial number 
 3. 下面,我們通過一個樣本來展示Systrace的使用執行上述命令後,將得到一個名為trace.html的檔案(trace.html是預設檔案名稱,讀者也可在命令列中指定其他檔案名稱)。產生的trace檔案需要通過Chrome瀏覽器開啟,結果如:圖中所示的trace.html頁面內容和Traceview的Timeline Panel非常類似。圖中包含的內容如下:
(1). 由於在systrace.py中指定了-f -l和-i參數,Systrace將產生CPU頻率、負載和狀態相關的資訊。它們為圖中第一個紅框所示。由於筆者所測手機CPU為雙核,故圖中有CPU0和CPU1之分。為行文方便,用CPU N來指代CPU的某個核。
“CPU N“所示行對應於整個測試時間內,某個核上啟動並執行進程資訊。
“CPU N C-State“所示行為整個測試時間內,某個CPU狀態的變化。C-State取值見下表。
“CPU N Clock Frequency”所示行展示了某個CPU啟動並執行頻率。通過點擊這一行的色塊可以查看某個時間點上CPU N的運行頻率。
“cpufreq”:該行所示內容和CPU互動式頻率調節器(Interactive Governor)的工作有關。互動式CPU調節器驅動添加了對CPU頻率調節事件的跟蹤。感興趣的讀者不妨閱讀kernel中的 include/trace/events/cpufreq_interactive.h檔案以瞭解更多的資訊。
(2). VSYNC:顯示了每次Tick Tack的時間大概都在16ms左右
(3). 圖中 com.example.systracedemo/com.example.systracedemo.MainActivity所示為應用程式佔用顯示Buffer的Tick-Tack情況。如果使用時間超過16ms,將導致介面顯示遲滯等現象。
(4). 圖中SurfaceFlinger行展示了其函數調用的CPU耗時情況(如箭頭1所指,SurfaceFlinger中的onMessageReceived函數的運行資訊)。
(5). 圖中最下部的方框中,詳細顯示了當前滑鼠在時間軸中選擇的部分(即SurfaceFlinger中的onMessageReceived)的詳細資料。你還可以用如下鍵盤操作:
 1 Key Description   2 w   Zoom into the trace timeline.   3 s   Zoom out of the trace timeline.   4 a   Pan left on the trace timeline.   5 d   Pan right on the trace timeline.   6 e   Center the trace timeline on the current mouse location.   7 g   Show grid at the start of the currently selected task.   8 Shift+g Show grid at the end of the currently selected task.   9 Right Arrow Select the next event on the currently selected timeline.  10 Left Arrow  Select the previous event on the currently selected timeline.  11 Double Click    Zoom into the trace timeline.  12 Shift+Double Click  Zoom out of the trace timeline.  
 找到你要分析的進程ID, 分析每個線程在一段時間類具體做什麼工作。如果你發現某個方法耗用了很長時間。 可以去代碼裡面搜尋去具體的實現。4.在自己代碼中加入trace 
Android framework 裡面已經有很多trace的代碼。你也可以仿照在自己一些方法裡加入trace 跟蹤調試。你需要保證 traceBegin 與 traceEnd 一定要成對出現,並且一定要在同一個線程裡面。
1 Trace.traceBegin(Trace.TRACE_TAG_VIEW, "performTraversals");  2 try {  3     //TODO your work  4 } finally {  5     Trace.traceEnd(Trace.TRACE_TAG_VIEW);  6 }  
 5. 總體來說,Systrace用法比Traceview要複雜,它支援對CPU、Native進程甚至Kernel線程進行效能資料採樣,可協助開發人員對整個系統的效能情況進行一個詳盡的分析。Android官方對Systrace也有一些介紹,請讀者閱讀:
http://developer.android.com/tools/debugging/systrace.html
http://developer.android.com/tools/help/systrace.html 

五、HierarchyViewer

1. 如何使用HierarchyViewer ?

Hierarchy Viewer是隨Android SDK發布的工具,位於Android SDK/tools/hierarchyviewer.bat (Windows作業系統,mac上顯示的為hierarchyviewer),使用起來也是超級簡單,通過此工具可以詳細的理解當前介面的控制項布局以及某個控制項的屬性(name、id、height等),調試UI介面分析其效能。
(1)串連裝置真機或者模擬器(真機可能無法串連,我用的2.3,串連上了,沒讀到內容)
(2)啟動你要觀察的應用
(3)開啟Hierarchyviewer,點擊hierarchyviewer檔案即可。串連後如:

 

  • Load View Hierarchy: 介面的控制項層次,查看介面中各個控制項的階層關係
  • Inspect Screenshot : 精確查看模式,開發人員可以隨意點介面的任意一部分,進行放大或縮小觀察以查看介面中各控制項的具體位置和情況

 

(4)點擊“Load View Hierarchy”, 然後雙擊最上面的Focused Window,這個是當前視窗,載入完畢後會顯示當前介面階層。

(5)觀察階層圖,這個圖有點大,可以拖動。View Hierarchy視窗顯示了Activity的所有View對象,選中某個View還可以查看View的具體資訊,最好選擇工具中的Show Extras選項。

(6)觀察單個view,選擇單個view後會出現如所示圖形:

這裡會看到Measure、Layout、Draw的耗時。View節點中帶有紅色或黃色的點代錶速度較慢的View對象。請注意,低效能並不表示一定有問題,特別像是ViewGroup對象,View的子節點越多,結構越複雜,效能越差。只要看每個View節點的顏色就可以找到(布局或繪製)最慢的View對象是哪個,這樣你就能快速確定問題。

 

不合理的布局會使我們的應用程式UI效能變慢,HierarchyViewer能夠可視化的角度直觀地獲得UI布局設計結構和各種屬性的資訊,協助 我們最佳化布局設計。

HierarchyViewer是我們最佳化程式的工具之一,它是Android內建的非常有用的工具,可以協助我們更好地檢視和設計用 戶介面(UI),絕對是UI檢視的利器。

 

轉自:http://blog.csdn.net/wangbaochu/article/details/50396512

Android 常用的效能分析工具詳解:GPU呈現模式, TraceView, Systrace, HirearchyViewer(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.