Android Systrace 使用详解

本文详细介绍了如何使用Systrace工具诊断Android系统的UI性能问题,包括抓取方法、分析UI卡顿、检测丢帧,以及结合TraceView进行代码定位。了解Systrace在排查卡顿和优化性能中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转自:https://www.jianshu.com/p/75aa88d1b575,转载请标明出处。


目录

一、Systrace 简介

二、Systrace 使用方法

三、使用命令行抓取 Systrace

四、使用Systrace 检测UI 性能

五、使用Systrace 检测卡顿丢帧问题

六、查看trace 文件的快捷键

七、代码中添加trace 标记方法

八、使用TraceView 分析trace Log


一、Systrace 简介

Systrace 允许你收集和检查设备上运行的所有进程的计时信息。 它包括Androidkernel的一些数据(例如CPU调度程序,IO和APP Thread),并且会生成HTML报告,方便用户查看分析trace内容。

二、Systrace 使用方法

1. Systrace 的作用

如果想分析 Android 系统或者某个 app 的卡顿性能或者渲染问题,这时候 Systrace 就非常有用。

首先我们需要抓取 Systrace 文件,然后分析并找出引起系统卡顿,或者 app 反应慢的原因,最好在源码上解决引起卡顿、响应慢的问题。

2. 抓取Systrace 的方法

抓取Systrace的方法如下:

  • 1. 链接手机,打开 DDMS

首先链接手机,打开 Android Device Monitor,选择要分析的进程(比如 com.google.process.gapps),点击 Capture system wide trace using Android systrace(下图右上角箭头所指的地方)

【C:\Users\Administrator\AppData\Local\Android\Sdk\tools\lib\monitor-x86_64\monitor.exe】

 

  • 2. 配置需要抓取Systrace的内容

此时根据不同的卡顿问题需求,我们配置抓取不同的 trace。 抓取的 Systrace 时间请勿过长,否则会导致抓取内容部分丢失,然后点击 OK,操作要分析系统卡顿或 app 运行缓慢的部分,系统会自动收集运行时的信息,然后用 Chrome 浏览器打开生成的 trace 文件 。

  • 3. 抓取过多次 trace,请及时清理缓存

假如抓取过多次 trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在 Android Device Monitor 的右下角,如下图所示

  • 4. 使用 Chrome 分析 trace

用 Chrome 浏览器打开生成的 trace 文件,如下图所示,里面会包含每个 CPU,以及图形渲染,输入事件等等内容。

 

抓取的 trace 报告提供了 Android 系统进程在特定时间段内的整体情况。例如在显示 Activity 或动画时卡顿,Systrace 会提供关于如何解决这些问题的建议。
但是,systrace 不会在应用程序进程中收集有关代码执行的信息。有关您的应用程序执行哪些方法以及使用多少 CPU 资源的更多详细信息,请使用 Android Studio 的内置 CPUProfiler ,或生成跟踪日志并使用 Traceview 查看它们。

三、使用命令行抓取 Systrace

1. 使用命令行抓取 Systrace 的准备工作

抓取 systrace 之前,请完成以下步骤:

  1. 下载并安装 Android SDK Tools
  2. 安装 Python, 并将其包含在系统环境变量的 path 中。
  3. 连接手机,打开开发者选项中的 USB Debug 选项 。
  4. 查找 Systrace 脚本,存储路径如下:android-sdk/platform-tools/systrace/

2. 使用命令行抓取 Systrace 的语法

使用命令行抓取 Systrace 的语法如下:
python systrace.py [options] [categories]

3. 使用命令行抓取 Systrace 举例

例如,以下命令调用 Systrace 在 10 秒钟内记录设备进程,包括图形进程,并生成一个名为 mynewtrace 的 HTML 报告:

python systrace.py --time=10 -o mynewtrace.html gfx

如果不指定任何类别或选项,Systrace 将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。

4. Systrace 参数解释

1. Global options

2. Commands and command options

四、使用 Systrace 检测 UI 性能

Systrace 对于检查应用程序的UI性能特别有用,因为它可以分析您的代码和帧速率,进而识别问题区域,同时提供可工参考的解决方案。

1.使用 Systrace 检测 UI 性能

首先,按照以下步骤进行操作:

  1. 连接手机并运行您的 app。
  2. 使用以下命令运行 systrace:
    python systrace.py view --time = 10
  3. 操作您的应用 10 秒后,Systrace 生成一个HTML报告。
  4. 使用网络浏览器打开 HTML 报告。

使用 Chrome 打开生成的 trace 文件,检测记录期间设备 CPU 使用情况,丢帧情况,卡顿耗时情况等等。

五、使用 Systrace 检测卡顿丢帧问题

如下 Systrace 报告列出了每个进程呈现 UI frame,并显示沿着时间线的每个渲染帧。 在绿色框架圆圈中,是指在16.6ms内呈现每秒稳定60帧。 花费16.6ms以上渲染的帧用黄色红色圆圈表示。

UI渲染帧率查看

在运行 Android 5.0(API级别21)或更高版本的设备上, UI 渲染的工作主要由 UI Thread 和 RenderThread两个线程完成。 在之前的版本中,创建渲染框架的所有工作都是在UI Thread上完成的。

点击一个 F圆圈,它可以提供系统为渲染该 frame 完成所包含的工作信息,包括警报,丢帧,建议等。
同时它还向您展示了在渲染该frame时系统正在执行的方法,因此您可以调查这些方法是否导致UI jank

 

点击黄色或红色帧按钮,会分析提示此帧卡顿的信息

选择黄色的 frame 后,您可能会在报告的底部窗格中看到如上提示信息。
上图中显示的 Alert , 主要问题是在 ListView 回收和重新bind中花费了太多的时间。 trace 中有相关事件的链接,点击可以获取更多关于系统在这段时间内正在做什么的事情。

要查看 Systrace 中发现的每个 Alert 以及设备触发 Alert 的次数,请单击窗口最右侧的 Alerts 选项卡,如下图所示。
Alerts 面板可帮助您查看发生了哪些问题,以及发生的频率。 将 Alert 面板看作是要修复的错误列表, 通常情况下,一个区域的微小变化或改进就可以消除应用程序中的全部Alert。

Alert 分析面板

Frame Input File Metrics Alerts 等面板

如果你的代码在 UI Thread 上做太多的工作,你需要找出哪些方法消耗了太多的CPU时间
一种方法是添加systrace(请参阅检测应用代码)到您认为会导致这些卡顿或者导致慢的方法地方,然后查看这些函数调用是否显示在systrace中。 如果您不确定哪些方法可能会在UI线程上造成卡顿,请使用Android Studio的内置CPU Profiler,或者生成跟踪日志并使用 Traceview 查看它们。

六、查看 trace 文件的快捷键

七、代码中添加trace 标记方法

由于 Systrace 是在系统级显示有关进程的信息,因此很难在HTML报告中查看某个特定时间内,您的应用程序正在执行什么方法。 在Android 4.3(API级别18)及更高版本中,您可以使用代码中的Trace类在HTML报告中标记执行事件。 您不需要用代码来记录Systrace 的跟踪记录,这样做可以帮助您查看app代码的哪些部分可能导致线程 hung 或 UI 丢帧。 但是这种方法与使用 Debug 类不同,Trace类简单地将标志添加到 Systrace 报告中,而Debug类可帮助您生成.trace文件,并且检查app CPU使用情况。

要生成包含已检测的跟踪事件的systrace HTML报告,需要使用-a--app命令行选项运行systrace,并指定应用程序的包名称。

通常我们在怀疑引起jank代码地方,添加如下内容:
Trace.beginSection("MyAdapter.onCreateViewHolder");
Trace.endSection(); 可以查看自定义的从开始到结束期间的Systrace信息。这两个是成对出现的,需要注意一下。

代码举例

多次调用beginSection(String)时,调用endSection()只会结束最近调用的beginSection(String)方法。 因此,对于嵌套的调用,例如上面示例中的调用,您需要确保通过调用endSection()将每个调用正确匹配到beginSection()

此外,您不能在一个线程上调用beginSection()并从另一个线程结束 - 您必须从同一线程调用endSection()

八、使用TraceView 分析trace Log

Traceview是提供Systrace的图形显示工具。 您可以通过使用Debug类来设置代码来生成log。 这种跟踪方法非常精确,因为您可以准确指定要启动的代码中的哪个位置,并停止记录Systrace数据。 使用Traceview检查这些log可帮助您调试您的应用程序并剖析其性能。

另外,可以使用命令行中的dmtracedump来生成跟踪日志文件的图形调用堆栈图。

如果您不需要查看通过使用Debug类检测应用程序来记录的Systrace日志,则可以使用Android Studio 3.0及更高版本中包含的CPU Profiler来查看应用程序的线程和记录方法跟踪。

1. trace Log 的打开方法

使用Android Device Monitor可以查看trace Log内容,步骤如下,打开Android Device Monitor,选择File,然后打开*.trace log分析。
当然,你也可以使用Android Device Monitor 的图形按键进行trace的抓取与查看。

使用Android Device Monitor 查看trace Log

2. Trace log 的分析

打开Trace log后,Traceview使用以下两个窗格显示log数据:

    1. 时间轴窗格:
      描述每个线程何时进入和退出方法的时间轴窗格
    1. 配置文件窗格:
      总结每个线程在跟踪日志的执行期间的配置文件窗格
      以下各节提供有关traceview输出窗格的附加信息。

3. Trace log 时间轴窗格

每个线程的执行都显示在自己的进程中,并且时间向右增加。 每种方法都以不同的颜色显示。 第一行下方的细线显示所选方法的子项(从入口到出口),如下图所示。

时间轴窗格

4. Trace log 配置文件窗格

如下图所示,配置文件窗格提供了系统在Systrace期间每种方法的执行的列表以及耗时。

另外,调用另一个方法的方法称为父级方法,父级调用的方法称为其子级。 当您通过单击方法选择一种方法时,它会在两个单独的节点下显示其父项和子项。

对于配置文件窗格中的每个顶级节点,表中的Calls + RecCalls / Total列(图2中未显示)将显示该方法调用次数和递归调用次数。或者,对于父级和子级方法,此列显示方法在顶级节点中是方法的子级或父级的调用次数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值