Android Systrace 使用详解

Systrace 允许收集和检查设备上运行的所有进程的即时信息。

发布日期 2018-01-23

一、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(下图右上角箭头所指的地方)

    1. 配置需要抓取Systrace的内容

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

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

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

    1. 使用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举例

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

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以上渲染的帧用黄色红色圆圈表示。

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

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

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

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

如果你的代码在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的抓取与查看。

2.Trace log 的分析

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

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

3.Trace log 时间轴窗格

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

4.Trace log配置文件窗格

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

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

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