Systrace UI性能分析
在应用程序开发过程中,UI的流畅度是体验的核心,特别是在动画、跳转或者列表的滑动过程中,出现卡顿和无响应是非常影响用户体验的,要解决这些问题首先要找到问题的原因。TraceView是一款利器,Systrace也是很好的分析UI性能的工具。
Systrace是Android 4.1及以上版本提供的性能数据采样和分析工具。它可以帮助开发者收集Android关键子系统(如surfaceflinger、WindowManagerService等Framework部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观地分析系统瓶颈,改进性能。Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载等,在UI显示性能分析上提供很好的数据,特别是在动画播放不流畅、渲染卡等问题上。
Systrace工具可以跟踪、收集、检查定时信息,可以很直观地查看CPU周期消耗的具体时间,显示每个线程和进程的跟踪信息,使用不同颜色来突出问题的严重性,并提供如何解决这些问题的建议。
Systrace是以系统的角度返回一些信息,并不能定位到具体耗时的方法,要进一步获取CPU满负荷运行的原因,就需要使用工具TraceView。
1. Systrace使用方法
(1)在DDMS上使用
- 1.打开Android Device Monitor,连接收集并准备需要抓取的界面。
- 2.单击Systrace按钮进入抓取前的设置,选择需要跟踪的内容。
- 3.手机上开始操作需要跟踪的过程(如滑动列表)
- 4.到了设定好的时间后,生成Trace文件。
- 使用Chrome打开文件即可分析。
(2)使用命令行
$cd android-sdk/platform-tools/systrace
$python systrace.py --time = 10 -o mynewtrace.html sched gfx view
(3) 应用中获取
Systrace不会追踪应用的所有工作,所以在有需求的情况下,需要添加要追踪的代码部分。在Android 4.3及以上版本的代码中,可以通过Trace类来实现这个功能。它能够让你在任何时候跟踪应用的一举一动。在获取Trace类的过程中,即Trace.beginTransaction() 与 Trace.endSection()之间代码的工作会一直被追踪。
在代码中加入Trace跟踪需要注意一下两点:
- 在Trace被嵌套在另一个Trace中的时候,endSection方法只会结束离它最近的一个beginSection(String) ,即在一个Trace的过程中是无法中断其他Trace的。所以要保证endSection与beginSection调用次数匹配。
- Trace的begin与end必须在同一线程中执行。
下边着部分代码为使用Trace的例子,在整个方法中含有两个Trace块,可以根据需求定义更多的块,但都要成对出现,如果有开始块但没有结束块,会严重影响应用的性能。
public void ProcessPeople(){
Trace.beginSection("ProcessPeople");
try{
Trace.beginSection("Processing A");
// code for task...
} finally {
Trace.endSection(); // ends
}
Trace.beginSection("Processing B");
try{
// code for task2...
} finally {
Trace.endSection();
}
} finally {
Trace.endSection();
}
2. 分析Trace报告
W、S、A、D 对应了放大、缩小、左移、右移功能。
与UI绘制关系最密切的是Alerts和Frame两个数据,
(1)Alerts
它标记了性能有问题的点,单击该点可以查看详细信息,在右侧边栏还有一个Alerts框,单击可以查看每个类型的Alerts的数量,单击一个Alert可以看到问题的详细描述。
(2)Frame
每个应用都有一行专门显示Frame,每一帧就显示为一个绿色的圆圈。当显示为黄色或者红色时,它的渲染时间查过了16.6ms(即达不到60fps的水准)。使用w方法,看看此帧的渲染过程中系统到底做了些什么。同时它会jiang