Systrace 允许您在系统级别收集和检查设备上运行的所有进程的计时信息。 它将来自Android
内核的数据(例如CPU调度
程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。
2.Systrace 使用方法
抓取Systrace 的方法
如果想分析Android
系统或者app
的问题,首先我们需要抓取Systrace
文件分析并找出引起系统卡顿,或者app反应慢
的原因,然后在源码上解决引起慢的问题。
抓取Systrace 的方法:
- 首先链接手机,打开
Android Device Monitor
,选择要分析的进程(比如com.google.process.gapps
),点击Capture system wide trace using Android systrace
(下图右上角箭头所指的地方)
- 配置需要抓取Systrace的内容
此时根据不同的需求,配置抓取不同的trace
时间(时间请勿过长,否则会导致抓取内容部分丢失),内容等,然后点击OK
,操作要分析系统卡顿或app
运行缓慢的部分,系统会自动收集运行时的信息,然后用Chrome 浏览器打
开生成的trace
文件 。
注意: 假如抓取过多次trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在
Android Device Monitor
的右下角,如下图所示
用Chrome 浏览器
打开生成的trace 文件
,如下图所示,里面会包含每个CPU,
以及图形渲染,输入事件等等内容。
抓取的Trace
报告提供了Android
系统进程在特定时间段内的整体情况。 它检查捕获的跟踪信息,并突出显示其检查到的问题,例如在显示运动或动画时UI粗糙
,并提供关于如何解决这些问题的建议。 但是,systrace
不会在应用程序进程中收集有关代码执行的信息。 有关您的应用程序执行哪些方法以及使用多少CPU资源
的更多详细信息,请使用Android Studio
的内置CPU分析器
,或生成跟踪日志并使用Traceview
查看它们。
3.使用命令行抓取 Systrace
本文档介绍了如何从命令行生成systrace
报告,浏览由该工具生成的跟踪文件,并使用它们来分析和提高应用程序用户界面(UI)
的性能。
抓取systrace
之前,请完成以下步骤:
- 下载并安装
Android SDK Tools
- 安装
Python ,
并将其包含在工作站的执行路径中。 - 连接手机,打开开发者选项中的
USB Debug
选项 。 Systrace
存储路径如下android-sdk/platform-tools/systrace/
使用命令行抓取 Systrace
的语法如下: python systrace.py [options] [categories]
例如,以下命令调用systrace
在10
秒钟内记录设备进程,包括图形进程,并生成一个名为mynewtrace
的HTML
报告:
python systrace.py --time=10 -o mynewtrace.html gfx
如果不指定任何类别或选项,systrace
将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。
4.使用Systrace 检测UI 性能
systrace
对于检查应用程序的UI性能
特别有用,因为它可以分析您的代码和帧速率以识别问题区域并提供可能的解决方案。 开始,按照以下步骤进行:
- 连接手机并运行您的
app
。 - 使用以下命令运行systrace:
python systrace.py view --time = 10
- 操作您的应用 10秒后,
systrace
生成一个HTML报告。 - 使用网络浏览器打开HTML报告。
您现在可以与报告进行交互,以便在记录期间检查设备CPU
使用情况。 以下部分介绍如何检查报告中的信息以查找和修复UI性能问题
。
5. 使用Systrace 检测警告以及掉帧问题
如下报告列出了每个进程呈现UI帧,并指示沿着时间线的每个渲染帧。 在绿色框架
圆圈中指示在16.6毫秒内呈现的帧以保持每秒稳定60帧。 花费16.6毫秒以上渲染的帧用黄色
或红色
框圈表示。
注意: 在运行
Android 5.0(API级别21)
或更高版本的设备上, UI 渲染的工作是在UI Thread
和RenderThread
两个线程完成。 在之前的版本中,创建框架的所有工作都是在UI Thread
上完成的。
点击一个F框架圈
可以提供有关系统为渲染该框架而完成的工作的其他信息,包括警报。 它还向您展示了在渲染该框架时系统正在执行的方法,因此您可以调查这些方法是否导致UI jank
。
选择慢帧后,您可能会在报告的底部窗格中看到警报。 上图中显示的Alert
提出,框架的主要问题是在ListView
回收和重新绑定中花费了太多的时间。 跟踪中有相关事件的链接可以解释更多关于系统在这段时间内正在做什么的事情。
要查看工具在trace
中发现的每个Alert
以及设备触发Alert
的次数,请单击窗口最右侧的Alerts
选项卡,如下图所示。 Alerts
面板可帮助您查看发生了哪些问题,以及发生的频率。 将Alert
面板看作是要修复的错误列表, 通常情况下,一个区域的微小变化或改进可以消除应用程序中的全部警报。
如果你在UI Thread
上做太多的工作,你需要找出哪些方法消耗了太多的CPU时间
。 一种方法是添加跟踪标记(请参阅检测应用代码)到您认为会导致这些瓶颈的方法,以查看这些函数调用是否显示在systrace
中。 如果您不确定哪些方法可能会在UI线程上造成瓶颈,请使用Android Studio
的内置CPU分析器,
或者生成跟踪日志并使用Traceview
查看它们。
6. 查看trace 文件的快捷键
7. 代码中添加trace 标记具体分析问题所在
由于systrace
是在系统级显示有关进程的信息,因此很难在HTML
报告中的某个特定时间知道您的应用程序正在执行什么方法。 在Android 4.3(API级别18)
及更高版本中,您可以使用代码中的Trace
类在HTML
报告中标记执行事件。 您不需要用代码来记录systrace
的跟踪记录,但是这样做可以帮助您查看应用程序代码的哪些部分可能会导致线程挂起或UI断线。 这种方法与使用Debug
类不同,Trace
类简单地将标志添加到systrace
报告中,而Debug
类可帮助您通过生成.trace
文件来检查详细的app CPU
使用情况。
要生成包含已检测的跟踪事件的systrace HTML
报告,需要使用-a
或--app
命令行选项运行systrace
,并指定应用程序的包名称。
通常我们在怀疑引起jank代码地方,添加如下内容: Trace.beginSection("MyAdapter.onCreateViewHolder");
和 Trace.endSection();
,主要这两个是成对出现的。
多次调用beginSection(String)
时,调用endSection()
只会结束最近调用的beginSection(String)
方法。 因此,对于嵌套的调用,例如上面示例中的调用,您需要确保通过调用endSection()
将每个调用正确匹配到beginSection()
。
学习分享
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包
nOTdB0-1719258163475)]
[外链图片转存中…(img-XWp0hG4J-1719258163476)]
[外链图片转存中…(img-zgBFiXqT-1719258163476)]