应用性能优化的工作对象就是应用的耗时瓶颈,只有先定位瓶颈,针对应用中最耗时的部分进行优化,才能有效提高性能,否则,优化效果必然事倍功半。
TraceView
TraceView是Android平台下的一款数据分析工具,结合Android SDK中的Debug类或DDMS工具进行数据采集,TraceView可以具体分析出每个method的耗时情况。
(1) Debug类采集数据
如果在一段代码前后加上Debug.startMethodTracing()和stopMethodTracing(),系统会采集这段代码运行时间段内应用中所有Java线程的函数执行情况,并将数据保存在/sdcard/dmtrace.trace中。trace文件可通过Eclipse中的TraceView工具打开。
Debug.startMethodTracing();
doSomething();
Debug.stopMethodTracing();
(2) DDMS采集数据和TraceView分析
DDMS可以采集系统中某个正在运行的进程的函数调用信息,现以分析Calendar应用启动速度为例,介绍DDMS采集数据和TraceView分析方法:
(a) 选中需要调试的进程,点击Start Method Profiling按钮启动数据采集;
(b) 在手机上进行耗时操作;
(c)点击Stop Method Profiling结束数据采集
(d) 观察DDMS自动打开的数据采集文件,分析耗时的函数;
(e) 分析trace文件
数据采集完成后,系统会自动将数据保存为一个trace文件。trace文件可通过eclipse直接浏览,也可通过命令行,用sdk/tools/traceview.bat工具打开。trace文件打开后的内容如上图所示。
整个文件分成三部分,文件左上角显示采集的线程信息,由上图可知,本次采集的线程包括main线程和2个其它处理异步任务的辅助线程。文件右上角显示时间线,时间线上是每个线程测试时间段内所涉及的函数调用信息。文件下侧是最核心的Profile界面,显示了选中线程(com.android.calendar)中各个函数的调用耗时情况,包括CPU时间、调用次数、时间和次数的百分比等。
Profile界面中各列的含义如下表所示:
列名 描述
Name 该线程运行过程中所调用的函数名
Incl Cpu Time 某函数占用的CPU时间,包含内部调用其它函数的CPU时间
Excl Cpu Time 某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间
Incl Real Time 某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间
Excl Real Time 某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间
Call+Recur Calls/Total
某函数被调用次数以及递归调用占总调用次数的百分比
Cpu Time/Call
某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间
Real Time/Call
同CPU Time/Call类似,只不过统计单位换成了真实时间
分析trace文件时,可以将数据按某一列降序排序,从而快捷定位耗时操作:如果查找哪些函数单次执行时间长,可将Cpu Time/Call按降序排列;如果查找哪些函数调用次数过多,可将Call+Recur Calls/Total按降序排列;如果查找哪些函数总执行时间长,可将Incl Cpu Time按降序排列。
上图按照Incl Cpu Time降序排序,排在最上面的日历应用中的函数是onCreate,即日历启动过程中onCreate是耗时瓶颈。点击该条目,可以进入该函数的详情界面进一步分析该函数具体耗费时间的详情。
在onCreate的详情界面中,Parents显示调用当前函数(onCreate)的函数列表,Children显示被当前函数(onCreate)调用的函数列表,由上图可知,onCreate耗时占整个测试过程的19.7%,onCreate中65.8%的时间耗费在setContentView中,花费的时间为499ms。这些数据可说明,Calendar的启动耗时在应用上的瓶颈是加载布局,需要重点优化Calendar首页的布局文件。