Android 常用的性能分析工具详解:GPU呈现模式, TraceView, Systrace, HirearchyViewer(转)...
此篇將重點介紹幾種常用的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呈現模式來測試所謂的流暢度,讓負責設計這個產品的人修改他的設計,以獲得良好的用戶體驗。 三、TraceView Android自帶的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)
方法面板展示了所有方法的執行情況,點擊某個方法可以查看在對應線程上的執行時間區域,并會顯示其父方法及子方法。
每個方法包括如下信息列,可點擊某列進行排序,從而確定產生性能問題的函數:
?
四、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統計數據并生成一個結果網頁文件供用戶查看。
(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
(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(转)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CPU亲缘性及网卡中断绑定
- 下一篇: Android--使用VideoView