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/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

发表回复

登录后才能评论