性能分析工具之Systrace


一、簡介

 Systrace 是平台提供的舊版命令行工具,可記錄短時間內的設備活動,並保存在壓縮的文本文件中。該工具會生成一份報告,其中匯總了 Android 內核中的數據,例如 CPU 調度程序、磁盤活動和應用線程。

 我們一般使用Systrace分析如下性能問題:

  • UI卡頓掉幀
  • 啟動慢
  • 異常線程

 Android 10 中引入了全新平台級跟蹤工具Perfetto。這是適用於 Android、Linux 和 Chrome 的更加通用和復雜的開源跟蹤項目。與 Systrace 不同,它提供數據源超集,以protobuf 編碼的二進制流形式記錄任意長度的跟蹤記錄。


 

二、抓取Systrace

通過Android Device Monitor抓取Systrace

 這種方式比較簡單,直接從DDMS中打開配置即可

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’

解決方案:

  1. 下載six安裝文件:https://pypi.python.org/pypi/six/
  2.  解壓並放到python安裝目錄的Scripts文件夾下
  3.  執行安裝命令:python setup.py install

 

三、分析Systrace

 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,可以看到一些修改建議:

Alerts

這里的卡頓並不是其他異常線程造成的,是我們UI太復雜造成渲染慢,我們需要精簡UI。

Systrace報告所包含的信息是進程級別的,我們無法定位到具體的引起卡頓的代碼。如果要更進一步分析,我們需要在代碼中可疑的地方添加trace log,使用TraceView工具來具體分析。

Trace.beginSection("defined by yourself"); //開始跟蹤
Trace.endSection();  //結束跟蹤

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM