Android性能分析工具Systrace和TraceView的使用
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。
?第二類是那些自身占用時間不長,但調用卻非常頻繁的函數。
方法:點擊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(分配跟蹤器)等工具,這裡我們僅僅介紹了其中兩個。
原文信息:
作者:JonsonWei?
來源:CSDN?
原文:https://blog.csdn.net/xiyangyang8/article/details/50545707?
?
總結
以上是生活随笔為你收集整理的Android性能分析工具Systrace和TraceView的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java随机数的创建
- 下一篇: polyfit线性拟合函数