Android性能分析工具Systrace和TraceView的使用

目錄:

  1. Systrace的介紹
  2. Systrace跟蹤代碼
  3. Systrace運行方式
  4. Systrace數據分析
  5. Systrace使用示例
  6. TraceView的介紹
  7. TraceView運行方式
  8. TraceView數據分析
  9. TraceView使用示例
  10. 總結

內容:

1.Systrace的介紹
>Systrace是Android4.1中新增的性能數據採樣和分析工具。它可幫助開發者收集Android關鍵子系統(如Surfaceflinger、WindowManagerService等Framework部分關鍵模塊、服務)的運行信息,從而幫助開發者更直觀的分析系統瓶頸,改進性能。
 Systrace的功能包括跟蹤系統的I/O操作、內核工作隊列、CPU負載以及Android各個子系統的運行狀況等。在Android平臺中,它主要由3部分組成:
 1.內核部分:Systrace利用了Linux Kernel中的ftrace功能。所以,如果要使用Systrace的話,必須開啓kernel中和ftrace相關的模塊。
 2.數據採集部分:Android定義了一個Trace類。應用程序可利用該類把統計信息輸出給ftrace。同時,Android還有一個atrace程序,它可以從ftrace中讀取統計信息然後交給數據分析工具來處理。
 3.數據分析工具:Android提供一個systrace.py(python腳本文件,位於Android SDK目錄/tools/systrace中,其內部將調用atrace程序)用來配置數據採集的方式(如採集數據的標籤、輸出文件名等)和收集 ftrace統計數據並生成一個結果網頁文件供用戶查看。
 從本質上說,Systrace是對Linux Kernel中ftrace的封裝。應用進程需要利用Android提供的Trace類來使用Systrace。
 
2.Systrace跟蹤代碼
(1).應用層代碼添加systrace跟蹤方式:
   Trace.beginSection(“TEST”);
   Trace.endSection();
(2).framework的java層代碼添加systrace跟蹤方式:
  Trace.traceBegin(Trace.TRACE_TAG_VIEW, “performTraversals”);
  Trace.traceEnd(Trace.TRACE_TAG_VIEW);
  也可以使用:
  ATRACE_BEGIN(“TEST”);
  ATRACE_END();
(3).framework的native代碼添加systrace跟蹤方式:   
  ATRACE_INIT();
  ATRACE_CALL();
 
3.Systrace的運行方式
>sdk包下手動運行:
$> cd android-sdk/tools/systrace
$> python systrace.py --set-tags gfx,view,wm
$> adb shell stop
$> adb shell start
$> python systrace.py --disk --time=10 -o mynewtrace.html
 
>用ADT工具在Eclipse裏運行:
 點擊下圖紅圈的啟動按鈕,就會彈出右邊的Android System Trace設置面板。
 
4.Systrace數據分析
>當Systrace運行之後,將記錄系統預定的跟蹤數據,生成一個html文件,如圖:
 
5.Systrace使用示例
>Android流暢程度性能分析:
 (1).將幾臺鏈接Eclipse之後,按照上頁所述,打開Android System Trace設置面板。
 (2).如果要測試介面流暢度,我們一般只關注圖形性能。因此必須選擇Graphics和View(還有其他很多選項,如果是在做音頻處理或者視頻播放的分析測試話,可以選擇其他選項)。
 (3).確認運行之後,滾滑要測試的介面,記錄跟蹤時間,之後我們會得到一個html頁面。
 (4).打開html頁面後,頁面中顯示了系統運行情況的概述圖;欲查看具體數據可以通過WASD快捷鍵來完成,W/S 放大/縮小 A/D 左移/右移。
 (5).在頁面中有一個surfaceFlinger模塊, 此模塊是負責繪製Android應用程序UI的服務,此區域如果出現空檔,一種情況是沒有操作或者滑動到頭,沒東西需要繪製,這種屬於正常;另一種情況就是有問題存在,有其他操作引起時間過長。
 (6).在分析局域,放大後就能看到具體的函數執行情況,點擊後能看到每個部分所使用的時間。比如deliverInputEvent是系統提供的觸摸事件;performTraversals是開始佈局並且繪畫顯示畫面的過程;draw是繪畫的過程;對於一個 listview,如果deliverInputEvent過長,很有可能是在adapter中的getView方法中處理時間過長導致。 所以通過Systrace的數據,可以大體上的發現是否存在性能問題。但如果要知道具體情況,就需要用到另外一個工具。 
 
6.TraceView的介紹
通過Systrace分析數據,可以大體上發現是否存在性能問題。但如果要知道具體情況,就需要用到另外一個工具
>TraceView是android的一個可視化的調試工具。藉助它,你可以具體瞭解你的代碼在運行時的性能表現。它能幫你更好瞭解到代碼運行過程的效率,進而改善代碼,提高你應用的體驗。 同時TraceView是Android平臺特有的數據採集和分析工具,它主要用於分析Android中應用程序的hotspot。讓我們瞭解我們要跟蹤的程序的性能,並且能具體到method
>Traceview的作用:
 (1). 查看跟蹤代碼的執行時間,分析哪些是耗時操作。
 (2). 可以用於跟蹤方法的調用,尤其是Android Framework層的方法調用關係。
 (3). 可以方便的查看線程的執行情況,某個方法執行時間、調用次數、在總體中的佔比等,從而定位性能點。
 
7.TraceView的運行方式
>手動運行:
 在開始調試的地方,如Activity的onCreate函數,
添加Debug.startMethodTracing("tracefilename");
 結束調試的地方,如Activity的onStop函數,
添加Debug.stopMethodTracing();
 之後運行你的app一段時間並退出,會在sd卡根目錄生成tracefilename.trace這個log文件,記錄這段時間內的運行信息。
 將日誌文件pull到PC端,cmd到android sdk tools文件夾內(或綁定sdk tools目錄到系統path內),運行traceview tracefilename.trace即可打開TraceView分析界面。
>使用DDMS:
    打開devices窗口,選擇某個進程,點擊右上角的start method profilingddms trace,運行app一段時間後,再點擊已變成stop method profiling的該按鈕。eclipse會自動彈出debug的標籤(可通過菜單File->save as保存數據)。界面如下:

注:這種方式不需要修改代碼,所以對於沒有源碼的程序同樣可以進行排查。同時可以方便的進行全局性能排查。
 
8.TraceView的數據分析
>Timeline Panel(時間線面板) :

Timeline Panel又可細分爲左右兩個Pane:
    (1).左邊Pane顯示的是測試數據中所採集的線程信息。如圖,本次測試數據採集了main線程,兩個Binder線程和其它系統輔助線程(例如GC線程等)的信息。
    (2).右邊Pane所示爲時間線,時間線上是每個線程測試時間段內所涉及的函數調用信息。這些信息包括函數名、函數執行時間等。如圖,main線程對應行的的內容非常豐富,而其他線程在這段時間內幹得工作則要少得多。
    (3).開發者可以在時間線Pane中移動時間線縱軸。縱軸上邊將顯示當前時間點中某線程正在執行的函數信息。
>Profile Panel(分析面板):
    分析面板主要展示了某個線程(先在Timeline Panel中選擇線程)中各個函數調用的情況,包括CPU使用時間、調用次數等信息。而這些信息正是查找hotspot的關鍵依據。點擊某個方法可以查看在對應線程上的執行時間區域,並會顯示其父方法及子方法。
    Profile Panel各列信息作用說明 如下:
列名
描述
Name
該線程運行過程中所調用的函數名
Incl Cpu Time
某函數佔用的CPU時間,包含內部調用其它函數的CPU時間
Excl Cpu Time
某函數佔用的CPU時間,但不含內部調用其它函數所佔用的CPU時間
Incl Real Time
某函數運行的真實時間(以毫秒爲單位),內含調用其它函數所佔用的真實時間
Excl Real Time
某函數運行的真實時間(以毫秒爲單位),不含調用其它函數所佔用的真實時間
Call+Recur Calls/Total
某函數被調用次數以及遞歸調用佔總調用次數的百分比
Cpu Time/Call
某函數調用CPU時間與調用次數的比。相當於該函數平均執行時間
Real Time/Call
同CPU Time/Call類似,只不過統計單位換成了真實時間

 

9.TraceView使用示例
>通常,查找hotspot包括兩種類型的函數:
 第一類是調用次數不多,但每次調用卻需要花費很長時間的函數。
方法:在Profile Panel中,選擇按Cpu Time/Call進行降序排序(從上之下排列,每項的耗費時間由高到低),如上圖所示。展開函數,我們發現getStringsToShow在 Incl Cpu Time %一列中佔據了63.3%,它是onCreate子函數耗費時間最長的,而且Calls+Recur Calls/Total列顯示其調用次數爲1,即它僅僅被調用一次了。這個函數是應用程序實現的,所以極有可能是一個潛在的Hotspot。
>通常,查找hotspot包括兩種類型的函數:
 第二類是那些自身佔用時間不長,但調用卻非常頻繁的函數。
方法:點擊Call/Recur Calls/Total列頭,使之按降序排列。關注點放在那些調用頻繁並且佔用資源較多的函數。如上 圖所示。紅框處有兩個重載的MyMD5.getHashString函數調用,它們各運行了368次,而且佔用的CPU時間百分比達到了31.8%和53.2%。很顯然,這2處調用就是hotspot,有優化的餘地 。
10.結論
>如今Android系統日趨穩定,存儲容量也越來越大,對源碼質量的要求也不斷降低。但是很多開發工程師在開發的過程中不注重代碼質量,不考慮系統性能和用戶體驗,因此開發出的產品往往性能低下,用戶體驗機差。
>為了很好的驗證產品的性能,目前有很多工具可以用來分析測試Android的性能,比如:dumpsys、Systrace、TraceView、Update Threads(更新線程)、Update Heap(更新堆)、Allocation Tracker(分配跟蹤器)等工具,這裡我們僅僅介紹了其中兩個。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章