极力推荐文章:欢迎收藏 Android 干货分享 html
#####阅读五分钟,每日十点,和您一块儿终身学习,这里是程序员Androidpython
Systrace
容许您在系统级别收集和检查设备上运行的全部进程的计时信息。 它未来自Android
内核的数据(例如CPU调度
程序,磁盘活动和应用程序线程)组合起来,以生成HTML
报告。android
本篇文章主要介绍 Android
开发中的部分知识点,经过阅读本篇文章,您将收获如下内容:程序员
- Systrace 简介
- Systrace 使用方法
- 使用命令行抓取 Systrace
- 使用Systrace 检测UI 性能
- 使用Systrace 检测警告以及掉帧问题
- 查看trace 文件的快捷键
- 代码中添加trace 标记具体分析问题所在
- 使用TraceView 分析trace Log
#1.Systrace 简介浏览器
Systrace 容许您在系统级别收集和检查设备上运行的全部进程的计时信息。 它未来自Android
内核的数据(例如CPU调度
程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。缓存
若是想分析Android
系统或者app
的问题,首先咱们须要抓取Systrace
文件分析并找出引发系统卡顿,或者app反应慢
的缘由,而后在源码上解决引发慢的问题。微信
抓取Systrace 的方法:网络
Android Device Monitor
,选择要分析的进程(好比com.google.process.gapps
),点击Capture system wide trace using Android systrace
(下图右上角箭头所指的地方)此时根据不一样的需求,配置抓取不一样的trace
时间(时间请勿过长,不然会致使抓取内容部分丢失),内容等,而后点击OK
,操做要分析系统卡顿或app
运行缓慢的部分,系统会自动收集运行时的信息,而后用Chrome 浏览器打
开生成的trace
文件 。app
注意: 假如抓取过屡次trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在
Android Device Monitor
的右下角,以下图所示框架
用Chrome 浏览器
打开生成的trace 文件
,以下图所示,里面会包含每一个CPU,
以及图形渲染,输入事件等等内容。
抓取的Trace
报告提供了Android
系统进程在特定时间段内的总体状况。 它检查捕获的跟踪信息,并突出显示其检查到的问题,例如在显示运动或动画时UI粗糙
,并提供关于如何解决这些问题的建议。 可是,systrace
不会在应用程序进程中收集有关代码执行的信息。 有关您的应用程序执行哪些方法以及使用多少CPU资源
的更多详细信息,请使用Android Studio
的内置CPU分析器
,或生成跟踪日志并使用Traceview
查看它们。
本文档介绍了如何从命令行生成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
将生成包含全部可用类别的报告,并使用默认设置。 可用的类别取决于您使用的链接设备。
systrace
对于检查应用程序的UI性能
特别有用,由于它能够分析您的代码和帧速率以识别问题区域并提供可能的解决方案。 开始,按照如下步骤进行:
app
。python systrace.py view --time = 10
systrace
生成一个HTML报告。您如今能够与报告进行交互,以便在记录期间检查设备CPU
使用状况。 如下部分介绍如何检查报告中的信息以查找和修复UI性能问题
。
以下报告列出了每一个进程呈现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
查看它们。
因为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()
。
此外,您不能在一个线程上调用beginSection()
并从另外一个线程结束 - 您必须从同一线程调用endSection()
。
Traceview
是提供跟踪日志的图形表示的工具。 您能够经过使用Debug
类来设置代码来生成日志。 这种跟踪方法很是精确,由于您能够准确指定要启动的代码中的哪一个位置,并中止记录跟踪数据。 若是还没有生成这些跟踪日志并将其从链接的设备保存到本地计算机,请转至经过检测应用程序生成跟踪日志。 使用Traceview
检查这些日志可帮助您调试您的应用程序并剖析其性能。
提示:可使用命令行中的dmtracedump
来生成跟踪日志文件的图形调用堆栈图。
若是您不须要查看经过使用Debug
类检测应用程序来记录的跟踪日志,则可使用Android Studio 3.0
及更高版本中包含的CPU
分析器来查看应用程序的线程和记录方法跟踪。
使用Android Device Monitor
能够查看trace Log内容,步骤以下,打开Android Device Monitor
,选择File
,而后打开*.trace log分析。 固然,你也可使用Android Device Monitor
的图形按键进行trace
的抓取与查看。
打开跟踪日志后,Traceview
使用如下两个窗格显示日志数据:
每一个线程的执行都显示在本身的进程中,而且时间向右增长。 每种方法都以不一样的颜色显示。 第一行下方的细线显示所选方法的子项(从入口到出口),以下图所示。
以下图所示,配置文件窗格提供了系统在跟踪日志期间执行的每种方法的列表以及执行这些方法所用的时间。 调用另外一个方法的方法称为父级方法,父级调用的方法称为其子级。 当您经过单击方法选择一种方法时,它会在两个单独的节点下显示其父项和子项。
对于每种方法(顶级节点),该表都显示包含和排他时间(以毫秒为单位)以及总时间的百分比。独占时间是执行方法本身的代码的时间,而包含时间是执行方法本身的代码的时间加上执行子程序的时间。定时信息也以CPU时间
和实时的方式报告。 CPU时间
只考虑线程主动使用CPU时间的时间
,实时提供绝对时间信息,从您的应用程序进入方法的时刻到退出该方法的时间 - 不管线程处于活动状态仍是休眠状态。
对于配置文件窗格中的每一个顶级节点,表中的Calls + Rec
,Calls / Total
列(图2中未显示)将报告该方法的调用次数和递归调用次数。或者,对于父级和子级方法,此列显示方法在顶级节点中是方法的子级或父级的调用次数。
Traceview
日志记录不能很好地处理线程,致使如下问题:
1.若是线程在分析期间退出,线程名称不会被发射(在Android 5.1及更高版本中被修复)
。
至此,本篇已结束,若有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!