一、Systrace.py是什麼?
Systrace是一款由Android操作系統提供的工具,它有助於在Android設備中級別的Tracing,同時它也是一種用於記錄所有進程(CPU、內存、GPU等)的完整分析工具。Systrace.py則是Systrace提供的Python API,幫助開發人員對Systrace命令進行更具有擴展性的編程和限制。(默認情況下,Systrace只對Google代碼和系統支持的設備提供支持,在UI層捕獲trace信息,並且輸出一個HTML report文件,但是Systrace.py則可以實現類似的效果,其排放密度甚至更強)。
二、Systrace.py的特點
除了與官方Systrace命令具有相同的特點外,Systrace.py還添加了一些值得注意的特性,例如:
- 可以為您提供更好的控制權,分別捕獲跨多個進程和線程的軌跡數據。
- 可以利用Systrace功能分析的優點,幫助查明繁忙代碼段的性能瓶頸。
- 可以對大量不同類型的事件進行過濾與調試。
- 支持各種標記,並且提供了豐富的過濾器。
- 可以集成到Jenkins的構建中以及與其他分析工具一起使用。
三、Systrace.py的用途
Systrace是針對應用程序和系統性能的一種分析工具,那麼在實際的開發過程中,Systrace.py可以有哪些用途呢?
- 追蹤應用程序性能問題分析(例如卡頓、掉幀、耗電量、啟動時間等)。
- 支持在自動化測試中檢測應用程序性能和其它是否滿足要求(例如,會導致內存泄漏的問題或者處理器運行時間是否在預期範圍內)。
- 為發現系統優化帶來便利(例如,對輸入事件分析以確定問題的根本原因)。
四、Systrace.py的示例代碼
#繼承SystraceBuilder類,獲取所需或將在命令中呈現的數據。 class MySpecificTracing(SystraceBuilder): def __init__(self, bufferSize): super().__init__(duration, app, bufferSize) #重載設置方法,用於定義已包含在命令中的特定項。 def set_categories(self): self.add_categories('audio', 'bionic', 'view', 'wm', 'audio-hal', 'audio-policy', 'scsi', 'dalvikvm', etc.) #將一個特製跟蹤類的對象傳遞給systrace的popen函數 with MySpecificTracing(4096) as p: p.run()
五、Systrace.py的過濾器
Systrace.py的主要目的之一是能夠在Systrace命令中指定過濾器,以下面的例子為例。
#創建一個過濾器對象 filter = FiltersBuilder() #將組件添加到過濾器中 filter.add_categories("wm", "sched", "freq", "idle") #添加一個條件觸發器(就像“when”補丁) filter.set_trigger(title="Power connected", predicate='arg.name=="ac" and arg.value=="1"') #添加一個即時操作(通過在TextProgressBar上設置動畫效果) filter.add_action(title="Downloading", duration=5, widget=TextProgressBar()) #將過濾器連接到我們的跟蹤器上 with TraceStreamerBuilder(flush_time=10, block=True, shell=True) as t: t.add_filter(filter) #註冊所需事件列表。 t.set_events("sched", "freq", "idle", "wm") #解決要跟蹤的特定PID(也可以使用all_thread/tag/pid函數) pid = find_pid_from_package('com.acme.app') #啟動劉易斯P:D(命令行調試)以獲取跟蹤數據。 t.start(subprocess_flags=["-p", pid])
六、Systrace.py的可讀性
Systrace.py不僅具有優秀的功能性,還比Systrace命令產生的簡單文本結果更易於理解和使用。我們知道,Systrace命令默認會在$ANDROID_HOME/platform-tools/systrace/下生成一個HTML文件。而在經過Systrace.py的處理後,其生成的結果具有更好的易讀性。
#創建一個過濾器對象 filter = FiltersBuilder() #將組件添加到過濾器中 filter.add_categories('drivers', 'binder_driver', 'workqueue', 'atomic', 'sync') #將過濾器連接到我們的跟蹤器上 with TraceStreamerBuilder(flush_time=10, block=True, shell=True) as t: t.add_filter(filter) #註冊所需事件列表。 t.set_events('binder', 'workqueue', 'futex', 'drivers', 'irq') #將跟蹤器與指定PID連接(也可以使用all_thread/tag/pid函數)。 pid = find_pid_from_package('com.acme.app') #啟動劉易斯P:D(命令行調試)以獲取跟蹤數據。 t.start(subprocess_flags=['-p', pid]) # 將跟蹤數據文件寫入壓縮文件 with open("my_trace.bytes", 'wb') as f: f.write(t.buf.getvalue()) # 使用systrace.py庫中的方法生成分析報告 trace = Trace(my_trace.bytes, MultiFileProvider('*.chr'), True, True) report = Report(trace) report.build() # 存儲生成的分析報告文件 with open("my_trace.html", 'w') as f: f.write(report.report_html)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/180362.html