Android性能分析工具systrace使用
Android性能分析工具systrace的使用,能根据需要抓取trace。
了解trace文件中数据的含义,能分析简单的性能问题。
1、systrace简介
systrace是Android4.1版本之后推出的,对系统Performance分析的工具。
systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等。在Android平台中,它主要由3部分组成:
-
内核部分:Systrace利用了Linux Kernel中的
ftrace
功能。所以,如果要使用systrace的话,必须开启kernel中和ftrace相关的模块。 -
数据采集部分:Android定义了一个Trace类。应用程序可利用该类把统计信息输出给ftrace。同时,Android还有一个
atrace
程序,它可以从ftrace中读取统计信息然后交给数据分析工具来处理。 -
数据分析工具:Android提供一个
systrace.py
(python脚本文件,位于Android SDK目录/sdk/platform-tools/systrace
中,其内部将调用atrace程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集ftrace统计数据并生成一个结果网页文件供用户查看。
简单来说,当机器以60帧/秒显示(也就是16.6 ms),用户会感觉机器会流畅。如果出现显示时出现丢帧的情况,就需要知道系统在做什么?
Systrace 是用来收集系统和应用的数据信息和一些中间生成数据的细节,在Android 4.1系统和4.1之后的系统。
Systrace在一些分析显示的问题上特别有用,如应用画图慢,显示动作或动画时变形。
2、抓取systrace
进入Android/Sdk/platform-tools/systrace目录下
python systrace.py -b 8000 -t 5 -o systrace.html
Google
Chrome浏览器可以打开systrace,如果打不开,可以浏览器输入chrome://tracing/
,然后load
systrace。
(1)脚本命令的option
options |
描述 |
---|---|
-o < FILE > |
输出的目标文件 |
-t N, –time=N |
执行时间,默认5s |
-b N, –buf-size=N |
buffer大小(单位kB),用于限制trace总大小,默认无上限 |
-k < KFUNCS >,–ktrace=< KFUNCS > |
追踪kernel函数,用逗号分隔 |
-a < APP_NAME >,–app=< APP_NAME > |
追踪应用包名,用逗号分隔 |
–from-file=< FROM_FILE > |
从文件中创建互动的systrace |
-e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > |
指定设备 |
-l, –list-categories |
列举可用的tags |
(2) 在app添加自己的systrace log
说明1:-o trace输出的文件路径
说明2:--time 配置抓取systrace的时间,通常设置5秒,并在5秒内重现问题,时间太短会导致问题重现时没有被抓到,时间太长会导致JavaHeap不够而无法保存,因此在能抓到问题点的情况下,时间越小越好。
说明3:--buf-size Buffer Size是存储systrace的size,同样的,太小会导致信息丢失,时间太长会导致Java Heap不够而无法保存,建议20480。
说明4:如果用户有自己在应用程序中加入自己的systrace log,如下:
Trace.beginSection("newInstance");
Trace.endSection("newInstance");
那么此处必须选择这个应用对应的进程名字,否则新加的systrace log不会被抓到。
在一些方法里加入trace 方便自己 跟踪调试 , 如下:
Trace.traceBegin("performTraversals");
try {
……
} finally {
Trace.traceEnd();
}
需要保证 traceBegin 与 traceEnd 一定要成对出现。 并且一定要在同一个线程里面。
加入trace的好处在于,生成的trace文件中,会在跟踪的代码段执行对应时间轴区间打上一个tag标记(比如上例中的performTraversals)
如果在代码中加入了trace,在生成trace文件时,必须指定进程为trace所在的进程。
3、systrace.html分析
3.1 trace图结构
3.1.1、颜色释义
在进程的上面有一条很细的进度条,包含了该线程的状态:
灰色:
睡眠。
蓝色:
可以运行(它可以运行,但还未被调度运行)。
绿色:
正在运行(调度程序认为它正在运行)。
红色:
不间断的睡眠(通常发生在内核锁上), 指出I
/ O负载,对于性能问题的调试非常有用
橙色:
由于I
/ O负载导致的不间断睡眠。
要查看不间断睡眠的原因(可从sched_blocked_reason跟踪点获取),请选择红色不间断睡眠切片。
------------------------------------------------------------------------------------------------------------------------
同一个进程内按线程进行纵向拆分,每个线程记录自己的工作。分别以包名为标识。每个应用进程都会包含其中所有线程的记录信号,可以看到从InputEvent到RenderThread都有。
除了进程和线程运行信息,还有两个重要信息:
3.1.2、Frame(例:UI Performance)
每个app都有一行专门显示frame,每一帧就显示为圆圈,正常绘制是1秒60帧,大约一帧16.6毫秒,在这个值以下是正常颜色绿色,如果超过它就会变成红色、黄色。非绿色的都说明有问题。这时需要通过’w’键放大那一帧,然后按‘m’键高亮,进一步分析问题。
以分析UI Performance为例:
对于Android
5.0(API level 21)或者更高的设备,该问题主要聚焦在UI
Thread
和Render
Thread
这两个线程当中。对于更早的版本,则所有工作在UI
Thread
。
3.1.3、Alerts
Systrace能自动分析trace中的事件,并能自动高亮性能问题作为一个Alerts,建议调试人员下一步该怎么做。
比如对于丢帧,点击黄色或红色的Frames圆点便会有相关的提示信息;另外,在systrace的最右上方,有一个Alerts tab可以展开,这里记录着所有的的警告提示信息。
3.1.4、使用alert和frame分析
(1)当我们点击了Alerts或者点击右边的Alerts列表中的任何一点我们可以看到在界面的最底部会相对应的优化提示以及可能会出现优化的视频教程链接。
比如上面的提示说你View的draw绘制花的时间太长了,然后我们可以根据Description来很明白的看到提示的内容是什么。
(2)然后我们可以点击一块Frames中的F来查看,同样的它会生成一份跟Alerts类似的报告结果并放在界面的最底端。
(3)可以通过按下m键查看这一帧到下一帧所花费的时间以及哪个方法被调用的最长。看到时间>16.6ms,系统要求UI的60fps水准所以系统会报出黄色的警告。照样我们从Description中可以读出到底是哪里出了问题。
Description
:
-
ListView item recycling involved inflating views. Ensure your Adapter#getView() recycles the incoming View, instead of constructing a new one.
可以看出来系统提示你在getView中花费了太多时间没能很有效的复用机制。我们就能顺着这条路去找界面的代码哪里出现了不足从而优化完善。
(4)Alerts和Frames两栏,它们展示了通过手机来的数据而生成出来的可视化分析结果。选择最上方的alerts:
这个警告指出了,有一个View#draw()方法执行了比较长的时间。可以在下面看到问题的描述,链接,甚至是相关的视频。下面我们看Frames这一行,可以看到这里展示了被绘制出来的每一帧,并且用绿、黄、红三颜色来区分它们在绘制时的性能。