Traceview 性能分析工具

时间:2022-06-17 11:05:27

简介

TraceView 是 Android 平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到 method。详细内容参考:http://developer.android.com/tools/debugging/debugging-tracing.html

Traceview的作用:
1、查看跟踪代码的执行时间,分析哪些是耗时操作 
2、可以用于跟踪方法的调用,尤其是Android Framework层的方法调用关系

Traceview的使用步骤:
1、选择追踪范围加入记录代码
2、利用tools下的工具trace view打开.trace文件
3、分析trace文件
此方法适用于有目标应用源代码的情况。
开发者在开始追踪前调用Android SDK中Debug类的startMethodTracing函数,并在结束追踪前调用stopMethodTracing函数。这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是Java线程)的函数执行情况,并将采集数据保存到/mnt/sdcard/目录下的一个.trace文件中(路径也可以自己制定)。然后利用SDK中的Traceview工具来分析这些数据。

在没有目标应用源代码的情况下,可以借助Android SDK中的DDMS工具。DDMS可采集系统中某个正在运行的进程的函数调用信息。DDMS工具中Traceview的使用下图所示。
Traceview 性能分析工具
点击开启方法分析后对应用的目标页面进行测试操作,测试完毕后停止方法分析时,DDMS会自动触发Traceview工具来浏览采集数据。界面会跳转到 DDMS 的 trace 分析界面。

示例
public class MainActivity extends ListActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Debug.startMethodTracing("bqt_traceview");//【权限】The trace file will be put under "/sdcard" unless an absolute path is given
        String[] array = { "点击添加TextView", };
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Debug.stopMethodTracing();
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        addView();
    }
    private void addView() {
        TextView tv_info = new TextView(this);// 将内容显示在TextView中
        tv_info.setText(new SimpleDateFormat("yyyy.MM.dd HH-mm-ss").format(new Date()));
        tv_info.setTextColor(Color.RED);
        tv_info.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
        tv_info.setPadding(20, 10, 20, 10);
        getListView().addFooterView(tv_info);
    }
}

说明:
  开发文档中说可以在activity的onCreate()中添加Debug.startMethodTracing(), 而在onDestroy()中添加Debug.stopMethodTracing(),但是在实际的测试时发现这种方式其实并不好用,因为通常情况下我们的activity的onDestroy()是由系统决定何时调用的,因此可能等了很长时间都不会得到这个trace文件。

traceview工具所在的路径为【D:\Android\sdk\tools】
Traceview 性能分析工具
生成的trace文件为:
Traceview 性能分析工具
在CMD中使用traceview打开trace文件的命令为【traceview d:/bqt_traceview.trace】
Traceview 性能分析工具

结果
Traceview 性能分析工具

Traceview 性能分析工具

界面分析
TraceView 界面比较复杂,其 UI 划分为上下两个面板,上半部分为Timeline Panel(时间线面板),下半部分为 Profile Panel(分析面板)。
Traceview 性能分析工具
Timeline Panel 又可细分为左右两个 Pane:
  • 左边 Pane 显示的是测试数据中所采集的线程信息。
  • 右边 Pane 所示为时间线,时间线上是每个线程测试时间段内所涉及的函数调用信息。这些信息包括函数名、函数执行时间等。
另外,开发者可以在时间线 Pane 中移动时间线纵轴。纵轴上边将显示当前时间点中某线程正在执行的函数信息。

Profile Panel 是 TraceView 的核心界面,其内涵非常丰富。它主要展示了某个线程(先在 Timeline Panel 中选择线程)中各个函数调用的情况,包括 CPU 使用时间、调用次数等信息。而这些信息正是查找 hotspot 的关键依据。所以,对开发者而言,一定要了解 Profile Panel 中各列的含义。下表列出了 Profile Panel 中比较重要的列名及其描述。

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类似,只不过统计单位换成了真实时间

一般而言,hotspot包括两种类型的函数:
  • 一类是调用次数不多,但每次调用却需要花费很长时间的函数。在示例代码中,它就是hotspot 1。
  • 一类是那些自身占用时间不长,但调用却非常频繁的函数。在示例代码中,它就是hotspot 2。
相对来说,类型1的hotspot比较好找,步骤是先按降序对时间项进行排列(可以是时间百分比、真实时间或CPU时间),然后查找耗费时间最多的函数。
一般而言,先应对应用程序自己实现的函数进行排查,Framework的函数也有可能是hotspot,但主因一般还是在应用本身(例如设置复杂的界面,导致对应XML解析非常慢)。

找到hotspot之后,开发者就需要结合代码来进行对应的优化了。关于Java代码优化,读者可参考如下资料:http://developer.android.com/training/articles/perf-tips.html
总体而言,Hotspot的查找是一个细致的工作,需要开发者对目标程序的代码,以及Traceview工具都比较熟悉才行。