一、簡介
Systrace 是平台提供的舊版命令行工具,可記錄短時間內的設備活動,並保存在壓縮的文本文件中。該工具會生成一份報告,其中匯總了 Android 內核中的數據,例如 CPU 調度程序、磁盤活動和應用線程。
我們一般使用Systrace分析如下性能問題:
- UI卡頓掉幀
- 啟動慢
- 異常線程
Android 10 中引入了全新平台級跟蹤工具Perfetto。這是適用於 Android、Linux 和 Chrome 的更加通用和復雜的開源跟蹤項目。與 Systrace 不同,它提供數據源超集,以protobuf 編碼的二進制流形式記錄任意長度的跟蹤記錄。
二、抓取Systrace
通過Android Device Monitor抓取Systrace
這種方式比較簡單,直接從DDMS中打開配置即可
- Destination File :制定生成的trace.html文件的地址
- Trace duration:抓取時間,通常設置5秒,並在5秒內重現問題,時間太短會導致問題重現時沒有被抓到,時間太長會導致JavaHeap不夠而無法保存。因此在能抓到問題點的情況下,時間越小越好。
- Trace Buffer Size:存儲Systrace的size,同樣太小會導致信息丟失,太長會導致Java Heap不夠而無法保存。如果檢測結果有異常,請調整Buffer Size的大小試試。
- Enable Application Traces from:檢測的應用,默認選擇none,這里需選擇自己需要檢測的應用。
- Commonly Used Tag:常用標簽,這部分TAG全部使能。只關注顯示情況的話 ,只選取Graphics和View System即可。
- Advanced Options:高級選項。如果設備root了,可以看到更多的TAG,如eMMC commands、Synchonization、Kernel Workqueues。
通過Python命令抓取Systrace
systrace.py腳本位於:sdk路徑/platform-tools/systrace/systrace.py
注意:要運行此腳本必須安裝 jdk1.8 和 python2.7,其他版本親測不支持。
python命令:
python systrace.py [options] [categories]
參數分為兩部分
- options — 命令參數
- categories — 感興趣的系統模塊,如不指定categories,則默認包含所有可用項
例如,我們抓一個10秒的systrace:
python systrace.py --time=10 -o mynewtrace.html
options可取值:
options | 解釋 |
-o <File> | 指定trace數據文件的輸出路徑,如果不指定就是當前目錄的trace.html |
-t N, --time=N | 執行時間,默認5s。絕對不要把時間設的太短導致你操作沒完Trace就跑完了,這樣會出現Did not finish 的標簽,分析數據就基本無效了 |
-b N, --buf-size=N | buffer大小(單位kB),用於限制trace總大小,默認無上限 |
-k <KFUNCS>,--ktrace=<KFUNCS> | 追蹤kernel函數,用逗號分隔 |
-a <APP_NAME>,--app=<APP_NAME> | 這個選項可以開啟指定包名App中自定義Trace Label的Trace功能。也就是說,如果你在代碼中使用了Trace.beginSection("tag"), Trace.endSection;默認情況下,你的這些代碼是不會生效的,因此,這個選項一定要開啟 |
--from-file=<FROM_FILE> | 從文件中創建互動的systrace |
-e <DEVICE_SERIAL>,--serial=<DEVICE_SERIAL> | 指定設備,在特定連接設備上進行跟蹤,由設備序列號標識 。 |
-l, –list-categories | 這個用來列出你分析的那個手機系統支持的Trace模塊,一般來說,高版本的支持的模塊更多 |
categories可取值:
$ python systrace.py -l 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 pdx - PDX services sched - CPU Scheduling irq - IRQ Events irqoff - IRQ-disabled code section tracing preemptoff - Preempt-disabled code section tracing i2c - I2C Events freq - CPU Frequency idle - CPU Idle disk - Disk I/O mmc - eMMC commands sync - Synchronization workq - Kernel Workqueues memreclaim - Kernel Memory Reclaim regulators - Voltage and Current Regulators binder_driver - Binder Kernel driver binder_lock - Binder global lock trace pagecache - Page cache memory - Memory gfx - Graphics (HAL) ion - ION allocation (HAL)
windows環境可能報的錯誤
(1)ImportError: No module named win32con
解決方案:下載並安裝對應版本的pywin32庫:https://github.com/mhammond/pywin32/releases
這里選擇:pywin32-227.win-amd64-py2.7.exe
(2)ImportError:No module named 'six’
解決方案:
- 下載six安裝文件:https://pypi.python.org/pypi/six/
- 解壓並放到python安裝目錄的Scripts文件夾下
- 執行安裝命令:python setup.py install
三、分析Systrace
systrace報告可以清楚地看到每個時間點各個線程的運行情況
報告分析快捷鍵:
按鍵操作 作用 w 放大,[+shift]速度更快 s 縮小,[+shift]速度更快 a 左移,[+shift]速度更快 d 右移,[+shift]速度更快 f 放大當前選定區域 m 標記當前選定區域 v 高亮VSync g 切換是否顯示60hz的網格線 0 恢復trace到初始態,這里是數字0而非字母o h 切換是否顯示詳情 / 搜索關鍵字 enter 顯示搜索結果,可通過← →定位搜索結果 ` 顯示/隱藏腳本控制台 ? 顯示幫助功能
以卡頓為例分析報告:
我們在Frames一行中可以看到很多"F",每一個"F"就是一幀,測量兩幀之間的間隔
- 如果大於16.7ms,則該幀達不到60fps幀率,會卡頓,用黃色或紅色標注
- 如果小於16.7ms,則該幀可以達到60fps幀率,不會卡頓,用綠色標注
我們可以看到這個報告中有一個紅色"F",放大測量與附近的"F"間隔約為50ms,幀率只有20fps,明顯有卡頓。點擊上面對應的Alerts,可以看到一些修改建議:
這里的卡頓並不是其他異常線程造成的,是我們UI太復雜造成渲染慢,我們需要精簡UI。
Systrace報告所包含的信息是進程級別的,我們無法定位到具體的引起卡頓的代碼。如果要更進一步分析,我們需要在代碼中可疑的地方添加trace log,使用TraceView工具來具體分析。
Trace.beginSection("defined by yourself"); //開始跟蹤 Trace.endSection(); //結束跟蹤