理解和使用systrace
理解和使用systrace。
一、介紹systrace
systrace是Android4.1版本之后推出的,對系統Performance分析的工具。
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目錄/sdk/platform-tools/systrace中,其內部將調用atrace程序)用來配置數據采集的方式(如采集數據的標簽、輸出文件名等)和收集ftrace統計數據并生成一個結果網頁文件供用戶查看。
二、抓取systrace
有三種方式抓取systrace:
2.1 systrace.py工具
命令行的用法是:
| 1 | python systrace.py [options] [category1] [category2] ... [categoryN] |
需要裝python,最好是2.7版本,避免出現問題,示例如下:
| 12 | cd android-sdk/platform-tools/systracepython systrace.py --time=10 -o mynewtrace.html sched gfx view wm |
2.1.1 options
其中options可取值:
| -o < FILE > | 輸出的目標文件 |
| -t N, –time=N | 執行時間,默認5s |
| -b N, –buf-size=N | buffer大小(單位kB),用于限制trace總大小,默認無上限 |
| -k < KFUNCS >,–ktrace=< KFUNCS > | 追蹤kernel函數,用逗號分隔 |
| -a < APP_NAME >,–app=< APP_NAME > | 追蹤應用包名,用逗號分隔 |
| –from-file=< FROM_FILE > | 從文件中創建互動的systrace |
| -e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > | 指定設備 |
| -l, –list-categories | 列舉可用的tags |
2.1.2 category
其中category可取值:
| gfx | Graphics |
| input | Input |
| view | View System |
| webview | WebView |
| wm | Window Manager |
| am | Activity Manager |
| sm | Sync Manager |
| audio | Audio |
| video | Video |
| camera | Camera |
| hal | Hardware Modules |
| app | Application |
| res | Resource Loading |
| dalvik | Dalvik VM |
| rs | RenderScript |
| bionic | Bionic C Library |
| power | Power Management |
| sched | CPU Scheduling |
| irq IRQ | Events |
| freq | CPU Frequency |
| idle | CPU Idle |
| disk | Disk I/O |
| mmc | eMMC commands |
| load | CPU Load |
| sync | Synchronization |
| workq | Kernel Workqueues |
| memreclaim | Kernel Memory Reclaim |
| regulators | Voltage and Current Regulators |
2.2 Device Monitor(DDMS)
可以使用Eclipse或者Android Studio集成開發工具,切換到DDMS,點擊devices,點擊Systrace按鈕:
補充說明:
- Destionation file :trace輸出的文件路徑
- Trace duration : 配置抓取systrace的時間,通常設置5秒,并在5秒內重現問題,時間太短會導致問題重現時沒有被抓到,時間太長會導致Java Heap不夠而無法保存,因此在能抓到問題點的情況下,時間越小越好。
- Trace Buffer Size : Buffer Size是存儲systrace的size,同樣的,太小會導致信息丟失,時間太長會導致Java Heap不夠而無法保存,建議20480。
- Enable Application Traces from :如果用戶有自己在應用程序中加入自己的systrace log:
Trace.beginSection("newInstance"); Trace.endSection();
那么此處必須選擇這個應用對應的進程名字,否則新加的systrace log不會被抓到。
三、自定義systrace
有時候為了debug方便,那么我們需要自己在apk或者framework層添加trace信息:
3.1 app層
app可以使用:
| 123 | import android.os.Trace;Trace.beginSection(String sectionName)Trace.EndSection() |
然后通過python systrace.py --app=sectionName?指定apk,或者通過ddms選擇指定apk,抓取systrace分析。
3.2 Java framework層
Java Framework可以使用:
| 123 | import android.os.Trace;Trace.traceBegin(long traceTag, String methodName)Trace.traceEnd(long traceTag) |
抓取systrace分析。
3.3 Native framework層
Native Framework可以使用:最好在函數開頭聲明定義
| 12 | #include <cutils/trace.h>ATRACE_CALL() |
抓取systrace分析。
四、分析systrace
Google Chrome瀏覽器可以打開systrace,如果打不開,可以通過chrome://tracing/,然后load systrace。
以分析UI Performance為例:
4.1 Frame
每個應用都有一行專門顯示frame,每一幀就顯示為圓圈,正常繪制是1秒60幀,大約一幀16.6毫秒,在這個值以下是正常顏色綠色,如果超過它就會變成紅色、黃色。非綠色的都說明有問題。這時需要通過’w’鍵放大那一幀,然后按‘m’鍵高亮,進一步分析問題。
對于Android 5.0(API level 21)或者更高的設備,該問題主要聚焦在UI Thread和Render Thread這兩個線程當中。對于更早的版本,則所有工作在UI Thread。
4.2 Alerts
Systrace能自動分析trace中的事件,并能自動高亮性能問題作為一個Alerts,建議調試人員下一步該怎么做。
比如對于丟幀是,點擊黃色或紅色的Frames圓點便會有相關的提示信息;另外,在systrace的最右上方,有一個Alerts tab可以展開,這里記錄著所有的的警告提示信息。
五、快捷操作
5.1 導航操作
| w | 放大,[+shift]速度更快 |
| s | 縮小,[+shift]速度更快 |
| a | 左移,[+shift]速度更快 |
| d | 右移,[+shift]速度更快 |
5.2 快捷操作
| f | 放大當前選定區域 |
| m | 標記當前選定區域 |
| v | 高亮VSync |
| g | 切換是否顯示60hz的網格線 |
| 0 | 恢復trace到初始態,這里是數字0而非字母o |
| h | 切換是否顯示詳情 |
| / | 搜索關鍵字 |
| enter | 顯示搜索結果,可通過← →定位搜索結果 |
| ` | 顯示/隱藏腳本控制臺 |
| ? | 顯示幫助功能 |
對于腳本控制臺,除了能當做記事本的功能,目前還不清楚有啥功能,或許還在開發中。
5.3 模式切換
- Select mode: 雙擊已選定區能將所有相同的塊高亮選中;(對應數字1)
- Pan mode: 拖動平移視圖(對應數字2)
- Zoom mode:通過上/下拖動鼠標來實現放大/縮小功能;(對應數字3)
- Timing mode:拖動來創建或移除時間窗口線。(對應數字4)
可通過按數字1~4,用于切換鼠標模式; 另外,按住alt鍵,再滾動鼠標滾輪能實現放大/縮小功能。
Reference:
- https://developer.android.com/studio/profile/systrace-commandline.html
- https://developer.android.com/studio/profile/systrace.html
- http://gityuan.com/2016/01/17/systrace/
總結
以上是生活随笔為你收集整理的理解和使用systrace的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Binder实用指南(二) - 实战篇
- 下一篇: ART深度探索开篇:从Method Ho