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.
CPU调度
程序,IO和APP Thread),并且会生成HTML报告,方便用户查看分析trace内容。Android
系统或者某个app
的卡顿性能或者渲染问题,这时候Systrace 就非常有用。首先我们需要抓取
Systrace
文件,然后分析并找出引起系统卡顿,或者app反应慢
的原因,最好在源码上解决引起卡顿、响应慢的问题。二、使用命令行抓取 Systrace
1. 使用命令行抓取Systrace的准备工作
抓取systrace
之前,请完成以下步骤:
- 下载并安装
Android SDK Tools
- 安装
Python ,
并将其包含在系统环境变量的path中。 - 连接手机,打开开发者选项中的
USB Debug
选项 。 - 查找
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
将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。
三、使用Systrace 检测UI 性能
systrace
对于检查应用程序的UI性能
特别有用,因为它可以分析您的代码和帧速率,进而识别问题区域,同时提供可工参考的解决方案。
使用Systrace 检测UI 性能
首先,按照以下步骤进行操作:
- 连接手机并运行您的
app
。 - 使用以下命令运行systrace:
python systrace.py view --time = 10
- 操作您的应用 10秒后,
systrace
生成一个HTML报告。 - 使用网络浏览器打开HTML报告。
使用Chrome 打开生成的trace 文件,检测记录期间设备CPU
使用情况,丢帧情况,卡顿耗时情况等等。
四、使用Systrace 检测卡顿丢帧问题
如下Systrace报告列出了每个进程呈现UI frame,并显示沿着时间线的每个渲染帧。 在绿色框架
圆圈中,是指在16.6ms内呈现每秒稳定60帧。 花费16.6ms以上渲染的帧用黄色
或红色
圆圈表示
在运行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。
如果你的代码在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