Systrace.py的多方位分析

一、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可以有哪些用途呢?

  1. 追蹤應用程序性能問題分析(例如卡頓、掉幀、耗電量、啟動時間等)。
  2. 支持在自動化測試中檢測應用程序性能和其它是否滿足要求(例如,會導致內存泄漏的問題或者處理器運行時間是否在預期範圍內)。
  3. 為發現系統優化帶來便利(例如,對輸入事件分析以確定問題的根本原因)。

四、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-tw/n/180362.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-22 05:13
下一篇 2024-11-22 05:13

相關推薦

  • Python如何導入py文件

    Python是一種開源的高級編程語言,因其易學易用和強大的生態系統而備受青睞。Python的import語句可以幫助用戶將一個模塊中的代碼導入到另一個模塊中,從而實現代碼的重用。本…

    編程 2025-04-29
  • NLP領域的多方位探索

    一、文本分類 文本分類是NLP領域中的一個重要任務,它的目的是自動將文本分配到不同的預定義類別中。文本分類技術可以在廣泛的領域中應用,例如情感分析、輿情監測等。 文本分類的一種常見…

    編程 2025-04-24
  • display屬性的多方位應用

    一、display屬性概述 display屬性是CSS中常用的一個屬性,它定義了一個元素的盒模型類型,以及其在頁面上的布局形式。在HTML文檔中,每個HTML標籤都有一個默認的di…

    編程 2025-04-23
  • 多方位詳解日期格式化

    一、基本概念 日期格式化是指將日期類型轉換為字元串類型的過程,常見於前端頁面的數據展示。日期格式化通常需要指定日期的格式。在 JavaScript 中,可以使用 Date 對象來表…

    編程 2025-04-23
  • Python __init__.py的作用

    在 Python 開發中,__init__.py 是一個十分常用的文件。在許多 Python 的包(package)中,都包含有 __init__.py 文件。這個文件包含有許多內…

    編程 2025-04-23
  • 小企鵝輸入法的多方位優勢

    一、智能識別與糾錯能力 小企鵝輸入法在智能化方面成績突出。它能夠聚合用戶常用的表情符號、片語和詞庫,預測和推薦輸入內容,大大提升了用戶的輸入效率。同時,它還能夠通過機器學習實現糾錯…

    編程 2025-04-23
  • Unity Toggle組件的多方位探索

    一、Toggle是什麼 Toggle是unity中的一個UI組件,可以理解為開關或者複選框,用於實現用戶交互中的選擇功能,常用於設置界面、遊戲中的道具選擇、任務選項等。 Toggl…

    編程 2025-04-22
  • 全能工程師必須知道的Esptool.py詳解

    一、什麼是Esptool.py Esptool.py是一個使用Python編寫的命令行工具,用於與ESP8266和ESP32微控制器進行通信。它主要用於固件升級、擦除、燒寫和讀取芯…

    編程 2025-04-18
  • str.substring()——多方位詳解

    一、基本介紹 在JavaScript中,字元串是常見數據類型之一,而在我們操作字元串時,常常需要截取其中一部分。這時,str.substring()方法就派上了用場。該方法用於獲取…

    編程 2025-04-12
  • 多方位了解查看Linux版本命令

    一、使用uname命令查看Linux版本 在Linux系統中,使用uname命令可以查看Linux系統的版本和系統基本信息。 例如,輸入如下命令: uname -a 輸出結果類似於…

    編程 2025-04-12

發表回復

登錄後才能評論