1、Systrace 简介
2、Systrace 使用方法
3、使用命令行抓取 Systrace
4、使用Systrace 检测UI 性能
5、使用Systrace 检测警告以及掉帧问题
6、查看trace 文件的快捷键
7、代码中添加trace 标记具体分析问题所在
8、使用TraceView 分析trace Loghtml
Systrace 容许你收集和检查设备上运行的全部进程的计时信息。 它包括Androidkernel的一些数据(例如CPU调度
程序,IO和APP Thread),而且会生成HTML报告,方便用户查看分析trace内容。python
若是想分析Android
系统或者某个app
的卡顿性能或者渲染问题,这时候Systrace 就很是有用。
首先咱们须要抓取Systrace
文件,而后分析并找出引发系统卡顿,或者app反应慢
的缘由,最好在源码上解决引发卡顿、响应慢的问题。android
抓取Systrace的方法以下:程序员
首先连接手机,打开Android Device Monitor
,选择要分析的进程(好比com.google.process.gapps
),点击Capture system wide trace using Android systrace
(下图右上角箭头所指的地方)面试
此时根据不一样的卡顿问题需求,咱们配置抓取不一样的trace
。 抓取的Systrace时间请勿过长,不然会致使抓取内容部分丢失,而后点击OK
,操做要分析系统卡顿或app
运行缓慢的部分,系统会自动收集运行时的信息,而后用Chrome 浏览器打
开生成的trace
文件 。浏览器
假如抓取过屡次trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在 Android Device Monitor
的右下角,以下图所示缓存
用Chrome 浏览器
打开生成的trace 文件
,以下图所示,里面会包含每一个CPU,
以及图形渲染,输入事件等等内容。网络
抓取的Trace
报告提供了Android
系统进程在特定时间段内的总体状况。 例如在显示Activity或动画时卡顿,Systrace会提供关于如何解决这些问题的建议。
可是,systrace
不会在应用程序进程中收集有关代码执行的信息。 有关您的应用程序执行哪些方法以及使用多少CPU资源
的更多详细信息,请使用Android Studio
的内置CPUProfiler
,或生成跟踪日志并使用Traceview
查看它们。架构
抓取systrace
以前,请完成如下步骤:app
Android SDK Tools
Python ,
并将其包含在系统环境变量的path中。USB Debug
选项 。Systrace
脚本,存储路径以下:android-sdk/platform-tools/systrace/
Systrace
的语法使用命令行抓取 Systrace
的语法以下:python systrace.py [options] [categories]
Systrace
举例例如,如下命令调用systrace
在10
秒钟内记录设备进程,包括图形进程,并生成一个名为mynewtrace
的HTML
报告:
python systrace.py --time=10 -o mynewtrace.html gfx
若是不指定任何类别或选项,systrace
将生成包含全部可用类别的报告,并使用默认设置。 可用的类别取决于您使用的链接设备。
systrace
对于检查应用程序的UI性能
特别有用,由于它能够分析您的代码和帧速率,进而识别问题区域,同时提供可工参考的解决方案。
首先,按照如下步骤进行操做:
app
。python systrace.py view --time = 10
systrace
生成一个HTML报告。使用Chrome 打开生成的trace 文件,检测记录期间设备CPU
使用状况,丢帧状况,卡顿耗时状况等等。
以下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
查看它们。
因为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
是提供Systrace的图形显示工具。 您能够经过使用Debug
类来设置代码来生成log。 这种跟踪方法很是精确,由于您能够准确指定要启动的代码中的哪一个位置,并中止记录Systrace数据。 使用Traceview
检查这些log可帮助您调试您的应用程序并剖析其性能。
另外,可使用命令行中的dmtracedump
来生成跟踪日志文件的图形调用堆栈图。
若是您不须要查看经过使用Debug
类检测应用程序来记录的Systrace日志,则可使用Android Studio 3.0
及更高版本中包含的CPU Profiler
来查看应用程序的线程和记录方法跟踪。
使用Android Device Monitor
能够查看trace Log内容,步骤以下,打开Android Device Monitor
,选择File
,而后打开*.trace log分析。
固然,你也可使用Android Device Monitor
的图形按键进行trace
的抓取与查看。
打开Trace log后,Traceview
使用如下两个窗格显示log数据:
每一个线程的执行都显示在本身的进程中,而且时间向右增长。 每种方法都以不一样的颜色显示。 第一行下方的细线显示所选方法的子项(从入口到出口),以下图所示。
以下图所示,配置文件窗格提供了系统在Systrace期间每种方法的执行的列表以及耗时。
另外,调用另外一个方法的方法称为父级方法,父级调用的方法称为其子级。 当您经过单击方法选择一种方法时,它会在两个单独的节点下显示其父项和子项。
对于配置文件窗格中的每一个顶级节点,表中的Calls + Rec
,Calls / Total
列(图2中未显示)将显示该方法调用次数和递归调用次数。或者,对于父级和子级方法,此列显示方法在顶级节点中是方法的子级或父级的调用次数。
最后对于程序员来讲,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提高本身,历来都是咱们去适应环境,而不是环境来适应咱们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了很多精力),包含知识脉络 + 诸多细节,因为篇幅有限,这里以图片的形式给你们展现一部分。
相信它会给你们带来不少收获:
上述【高清技术脑图】以及【配套的架构技术PDF】能够 加我wx:X1524478394 免费获取!
当程序员容易,当一个优秀的程序员是须要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每一个阶段都须要掌握不一样的能力。早早肯定本身的职业方向,才能在工做和能力提高中甩开同龄人。