一、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-hk/n/180362.html
微信掃一掃
支付寶掃一掃