理解和使用systrace
理解和使用systrace。
一、介紹systrace
systrace是Android4.1版本之后推出的,對(duì)系統(tǒng)Performance分析的工具。
systrace的功能包括跟蹤系統(tǒng)的I/O操作、內(nèi)核工作隊(duì)列、CPU負(fù)載以及Android各個(gè)子系統(tǒng)的運(yùn)行狀況等。在Android平臺(tái)中,它主要由3部分組成:
- 內(nèi)核部分:Systrace利用了Linux Kernel中的ftrace功能。所以,如果要使用systrace的話,必須開(kāi)啟kernel中和ftrace相關(guān)的模塊。
- 數(shù)據(jù)采集部分:Android定義了一個(gè)Trace類(lèi)。應(yīng)用程序可利用該類(lèi)把統(tǒng)計(jì)信息輸出給ftrace。同時(shí),Android還有一個(gè)atrace程序,它可以從ftrace中讀取統(tǒng)計(jì)信息然后交給數(shù)據(jù)分析工具來(lái)處理。
- 數(shù)據(jù)分析工具:Android提供一個(gè)systrace.py(python腳本文件,位于Android SDK目錄/sdk/platform-tools/systrace中,其內(nèi)部將調(diào)用atrace程序)用來(lái)配置數(shù)據(jù)采集的方式(如采集數(shù)據(jù)的標(biāo)簽、輸出文件名等)和收集ftrace統(tǒng)計(jì)數(shù)據(jù)并生成一個(gè)結(jié)果網(wǎng)頁(yè)文件供用戶查看。
二、抓取systrace
有三種方式抓取systrace:
2.1 systrace.py工具
命令行的用法是:
| 1 | python systrace.py [options] [category1] [category2] ... [categoryN] |
需要裝python,最好是2.7版本,避免出現(xiàn)問(wèn)題,示例如下:
| 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 > | 輸出的目標(biāo)文件 |
| -t N, –time=N | 執(zhí)行時(shí)間,默認(rèn)5s |
| -b N, –buf-size=N | buffer大小(單位kB),用于限制trace總大小,默認(rèn)無(wú)上限 |
| -k < KFUNCS >,–ktrace=< KFUNCS > | 追蹤kernel函數(shù),用逗號(hào)分隔 |
| -a < APP_NAME >,–app=< APP_NAME > | 追蹤應(yīng)用包名,用逗號(hào)分隔 |
| –from-file=< FROM_FILE > | 從文件中創(chuàng)建互動(dòng)的systrace |
| -e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > | 指定設(shè)備 |
| -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集成開(kāi)發(fā)工具,切換到DDMS,點(diǎn)擊devices,點(diǎn)擊Systrace按鈕:
補(bǔ)充說(shuō)明:
- Destionation file :trace輸出的文件路徑
- Trace duration : 配置抓取systrace的時(shí)間,通常設(shè)置5秒,并在5秒內(nèi)重現(xiàn)問(wèn)題,時(shí)間太短會(huì)導(dǎo)致問(wèn)題重現(xiàn)時(shí)沒(méi)有被抓到,時(shí)間太長(zhǎng)會(huì)導(dǎo)致Java Heap不夠而無(wú)法保存,因此在能抓到問(wèn)題點(diǎn)的情況下,時(shí)間越小越好。
- Trace Buffer Size : Buffer Size是存儲(chǔ)systrace的size,同樣的,太小會(huì)導(dǎo)致信息丟失,時(shí)間太長(zhǎng)會(huì)導(dǎo)致Java Heap不夠而無(wú)法保存,建議20480。
- Enable Application Traces from :如果用戶有自己在應(yīng)用程序中加入自己的systrace log:
Trace.beginSection("newInstance"); Trace.endSection();
那么此處必須選擇這個(gè)應(yīng)用對(duì)應(yīng)的進(jìn)程名字,否則新加的systrace log不會(huì)被抓到。
三、自定義systrace
有時(shí)候?yàn)榱薲ebug方便,那么我們需要自己在apk或者framework層添加trace信息:
3.1 app層
app可以使用:
| 123 | import android.os.Trace;Trace.beginSection(String sectionName)Trace.EndSection() |
然后通過(guò)python systrace.py --app=sectionName?指定apk,或者通過(guò)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可以使用:最好在函數(shù)開(kāi)頭聲明定義
| 12 | #include <cutils/trace.h>ATRACE_CALL() |
抓取systrace分析。
四、分析systrace
Google Chrome瀏覽器可以打開(kāi)systrace,如果打不開(kāi),可以通過(guò)chrome://tracing/,然后load systrace。
以分析UI Performance為例:
4.1 Frame
每個(gè)應(yīng)用都有一行專(zhuān)門(mén)顯示frame,每一幀就顯示為圓圈,正常繪制是1秒60幀,大約一幀16.6毫秒,在這個(gè)值以下是正常顏色綠色,如果超過(guò)它就會(huì)變成紅色、黃色。非綠色的都說(shuō)明有問(wèn)題。這時(shí)需要通過(guò)’w’鍵放大那一幀,然后按‘m’鍵高亮,進(jìn)一步分析問(wèn)題。
對(duì)于Android 5.0(API level 21)或者更高的設(shè)備,該問(wèn)題主要聚焦在UI Thread和Render Thread這兩個(gè)線程當(dāng)中。對(duì)于更早的版本,則所有工作在UI Thread。
4.2 Alerts
Systrace能自動(dòng)分析trace中的事件,并能自動(dòng)高亮性能問(wèn)題作為一個(gè)Alerts,建議調(diào)試人員下一步該怎么做。
比如對(duì)于丟幀是,點(diǎn)擊黃色或紅色的Frames圓點(diǎn)便會(huì)有相關(guān)的提示信息;另外,在systrace的最右上方,有一個(gè)Alerts tab可以展開(kāi),這里記錄著所有的的警告提示信息。
五、快捷操作
5.1 導(dǎo)航操作
| w | 放大,[+shift]速度更快 |
| s | 縮小,[+shift]速度更快 |
| a | 左移,[+shift]速度更快 |
| d | 右移,[+shift]速度更快 |
5.2 快捷操作
| f | 放大當(dāng)前選定區(qū)域 |
| m | 標(biāo)記當(dāng)前選定區(qū)域 |
| v | 高亮VSync |
| g | 切換是否顯示60hz的網(wǎng)格線 |
| 0 | 恢復(fù)trace到初始態(tài),這里是數(shù)字0而非字母o |
| h | 切換是否顯示詳情 |
| / | 搜索關(guān)鍵字 |
| enter | 顯示搜索結(jié)果,可通過(guò)← →定位搜索結(jié)果 |
| ` | 顯示/隱藏腳本控制臺(tái) |
| ? | 顯示幫助功能 |
對(duì)于腳本控制臺(tái),除了能當(dāng)做記事本的功能,目前還不清楚有啥功能,或許還在開(kāi)發(fā)中。
5.3 模式切換
- Select mode: 雙擊已選定區(qū)能將所有相同的塊高亮選中;(對(duì)應(yīng)數(shù)字1)
- Pan mode: 拖動(dòng)平移視圖(對(duì)應(yīng)數(shù)字2)
- Zoom mode:通過(guò)上/下拖動(dòng)鼠標(biāo)來(lái)實(shí)現(xiàn)放大/縮小功能;(對(duì)應(yīng)數(shù)字3)
- Timing mode:拖動(dòng)來(lái)創(chuàng)建或移除時(shí)間窗口線。(對(duì)應(yīng)數(shù)字4)
可通過(guò)按數(shù)字1~4,用于切換鼠標(biāo)模式; 另外,按住alt鍵,再滾動(dòng)鼠標(biāo)滾輪能實(shí)現(xiàn)放大/縮小功能。
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/
總結(jié)
以上是生活随笔為你收集整理的理解和使用systrace的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Binder实用指南(二) - 实战篇
- 下一篇: ART深度探索开篇:从Method Ho