Android systrace 基本用法教學

本篇介紹如何在 Android 開發使用 systrace 指令,Android 開發工具包內提供一個 systrace.py 供開發者使用,systrace 是開發 Android 時常用到的性能分析工具,使用 systrace 工具可對 android 程式進行錄製 trace 資料並轉換成可視覺化的 html 格式,以便後續分析,以下內容為如何安裝 Android systrace 與 systrace 基本使用教學。

Google 官方的 SDK Platform Tools release notes 有各版本的釋出說明。

Windows 安裝方式

從官方下載 Windows 最新版
目前最新版為 platform-tools_r34.0.5-windows.zip

Mac 安裝方式

從官方下載 Mac 最新版
目前最新版為 platform-tools_r34.0.5-darwin.zip

Ubuntu 安裝方式

從官方下載 Linux 最新版
目前最新版為 platform-tools_r34.0.5-linux.zip

下載好後 systrace.py 的路徑位於 android-sdk/platform-tools/systrace 目錄下,
systrace.py 是用 python2 寫成的,目前還不支援 Python3,所以在執行上要先有 Python 2 的運行環境。

systrace 指令基本教學

安裝好 systrace 後將 Android 裝置插上電腦的 USB 孔,執行要分析的 App 或程式後,再輸入 systrace 指令開始錄製,
systrace 指令的語法如下,

1
python systrace.py [options] [categories]

最基本最簡單的範例如下,什麼參數也沒帶的話 systrace 程式會需要你按下任何按鍵才會停止錄製,
預設輸出檔名為 trace.html。

1
$ python systrace

指定輸出檔名為 systrace.html

1
$ python systrace -o systrace.html

指定錄製 7 秒,但是如果提前使用完預設的 buffer 也會提前結束錄製

1
$ python systrace -t 7

指定錄製 7 秒,並加大 buffer,我自己是常用 1024000KB,官方文件的範例是 96000KB,

1
$ python systrace -t 7 -b 2048000

只想關注 CPU 排程的話,可以像下面這樣下,CPU 排程(sched)算是最常用到且實用的功能了,要看 CPU Frequency 的話可以用 freq,
預設不下的話會錄製出很多類別是自己不想關注的,二來錄製出來的東西會顯示很多同時檔案也較肥大,
指定自己想關注的類別的話,這樣其他類別的就不會錄製到,將能儲存更多的資料,檔案也會小很多,算是個小技巧,

1
$ python systrace -t 7 -b 96000 sched freq

要看還支援其它什麼類別的話可以用下列指令查看。

1
2
3
$ python systrace -l

$ python systrace.py --list-categories

以下列出 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
res: Resource Loading
dalvik: Dalvik VM
rs: RenderScript
bionic: Bionic C Library
power: Power Management
pm: Package Manager
ss: System Server
database: Database
network: Network
adb: ADB
vibrator: Vibrator
aidl: AIDL calls
nnapi: NNAPI
rro: Runtime Resource Overlay
core_services: Core services
pdx: PDX services
sched: CPU Scheduling
freq: CPU Frequency
idle: CPU Idle
disk: Disk I/O
sync: Synchronization
memreclaim: Kernel Memory Reclaim
binder_driver: Binder Kernel driver
binder_lock: Binder global lock trace
memory: Memory
gfx: Graphics (HAL)
ion: ION allocation (HAL)

systrace 指令選項

以下為常用的 systrace 指令,有想到在陸續增加吧!

-o: 設定輸出檔名(預設為trace.html)
-t: 秒數
-b: 設定緩衝區大小KB

chrome 開啟 systrace 的 HTML 常用操作

錄製完的 systrace.html 一定要用 chrome 瀏覽器才開得起來,
開啟 systrace.html 的方式有兩種,一種是直接對該 html 右鍵選擇用 chrome 開啟,或者預設瀏覽器就是 chrome 就雙擊開啟,
另一種是在 chrome 瀏覽器網址列輸入 chrome://tracing/ 再按 load 按鈕開啟該 html,
w/s:放大 zoom in、縮小 zoom out
a/d:向左捲動、向右捲動
m:高亮顯示當前所選的區塊
f:放大當前所選取的區塊
0:恢復縮放與平移,恢復到預設大小
1:鼠標模式
2
3
4:範圍選取模式
E:時間軸置於當前滑鼠游標位置的中心
G:從當前選取區塊的開始處顯示網格,網格間距為16.6ms,再按一次則取消顯示
Shift + G:從當前選取區塊的結束處顯示網格,網格間距為16.6ms,再按一次則取消顯示
<左方向鍵>:跳至上一個的相同選取區塊
<右方向鍵>:跳至下一個的相同選取區塊
/:搜尋字串
Enter:下一個搜尋結果
?:顯示幫助

systrace 名詞解釋

以下為常見 systrace 的資訊以及解釋,通常框選多個 slice 時會顯示更多統計數據,
Wall Duration:持續時間
CPU Duration:cpu耗時
Self Time:自身方法耗時(不包含其呼叫方法)
CPU Self Time:自身方法cpu執行時間
Average CPU Duration:平均cpu耗時
Occurrence:發生次數

我的使用心得

systrace 的操作就介紹到這邊,systrace 的操作並不難,
實際上從 systrace 中分析出有用的資訊,並改善系統效能才是最精髓最難的地方,同時這也是需要多方面實務經驗的累積。
這部份經驗及技巧未來有機會再來談談。

其他參考

了解 Systrace Android 開源項目 - Android Open Source Project
https://source.android.com/devices/tech/debug/systrace
Capture a system trace on the command line | Android Developers
https://developer.android.com/topic/performance/tracing/command-line
手把手教你使用Systrace(一)
https://zhuanlan.zhihu.com/p/27331842
[Android] 效能工具Systrace的使用- IT閱讀
https://www.itread01.com/content/1545024620.html
Android Systrace 使用详解
https://www.jianshu.com/p/75aa88d1b575
Android Systrace使用介绍
https://www.jianshu.com/p/f83d84dcd0b8
os-android:性能分析工具(systrace,starce,top,iotop)_智能多媒体-CSDN博客
https://blog.csdn.net/shareviews/article/details/84749549

開發用的文章參考

Define custom events | Android Developers
https://developer.android.com/topic/performance/tracing/custom-events
說明在 Managed code (Java/Kotlin) 怎麼使用 beginSection 與 endSection
說明在 Native code (C/C++) 怎麼使用 ATrace_beginSection 與 ATrace_endSection
說明在 Native code (C/C++) 怎麼使用 ATRACE_NAME (aka ScopedTrace)

systrace/trace.h at master · ganadist/systrace · GitHub
https://github.com/ganadist/systrace/blob/master/libs/c/trace.h
C 版本的 TRACE_BEGIN 和 TRACE_END
systrace/systrace.py at master · ganadist/systrace · GitHub
https://github.com/ganadist/systrace/blob/master/libs/python/systrace.py
pyhton 版本的 traceBegin 和 traceEnd

其他技巧推薦

如果你是常常在Android adb shell下做事情的話,尤其是需要使用到vi,建議安裝busybox,使用busybox附帶的vi會方便很多,
如果還想知道busybox支援哪些指令或busybox基本用法的話請看這篇
其他的 Android 系列文章可以看這篇
下一篇來介紹Android fastboot指令的安裝與用法教學吧~