systrace

一、SysTrace简介

Systrace是android性能调试优化的常用工具,它可以收集进程的活动信息,如界面布局、UI渲染、binder通信等;也可以收集内核信息,如cpu调度、IO活动、中断等;这些信息会统一时间轴,在Chrome浏览器中显示出来,非常方便工程师性能调试、优化卡顿等工作。

Systrace允许你监视和跟踪Android系统的行为(trace)。它会告诉你系统都在哪些工作上花费时间、CPU周期都用在哪里,甚至你可以看到每个线程、进程在指定时间内都在干嘛。它同时还会突出观测到的问题,从垃圾回收到渲染内容都可能是问题对象,甚至提供给你建议的解决方案。但是不能确定具体有问题的代码在哪里,这里可用用traceview工具。在Android平台中,Systrace主要由3部分组成:   
内核部分:Systrace利用了Linux Kernel中的ftrace功能。所以,如果要使用Systrace的话,必须开启kernel中和ftrace相关的模块。   
数据采集部分:Android定义了一个Trace类。应用程序可利用该类把统计信息输出给ftrace。同时,Android还有一个atrace程序,它可以从ftrace中读取统计信息然后交给数据分析工具来处理。   
数据分析工具:Android提供一个systrace.py(python脚本文件,位于Android SDK目录/tools/systrace中,其内部将调用atrace程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集ftrace统计数据并生成一个结果网页文件供用户查看。 从本质上说,Systrace是对Linux Kernel中ftrace的封装。应用进程需要利用Android提供的Trace类来使用Systrace.

Systrace 允许你收集和检查设备上运行的所有进程的计时信息。 它包括Androidkernel的一些数据(例如CPU调度程序,IO和APP Thread),并且会生成HTML报告,方便用户查看分析trace内容。
如果想分析Android系统或者某个app的卡顿性能或者渲染问题,这时候Systrace 就非常有用。
首先我们需要抓取Systrace文件,然后分析并找出引起系统卡顿,或者app反应慢的原因,最好在源码上解决引起卡顿、响应慢的问题。

二、使用命令行抓取 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将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。



三、使用Systrace 检测UI 性能

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

使用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 ThreadRenderThread两个线程完成。 在之前的版本中,创建渲染框架的所有工作都是在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查看它们。



参考链接
https://www.jianshu.com/p/75aa88d1b575

https://www.jianshu.com/p/0090d1428714

https://www.sohu.com/a/404342135_467784

https://blog.csdn.net/vicwudi/article/details/100191529

posted @ 2022-04-29 14:47  青山牧云人  阅读(1445)  评论(0编辑  收藏  举报