Android性能分析工具之TraceView

1.TraceView是什么?

TraceView是Android SDK中自带的一个工具,可以对应用中方法调用耗时进行统计分析,是Android性能优化和分析时一个很重要的工具。TraceView位于SDK下的 tools目录中,使用时可以在终端运行traceview命令,也可以在DDMS中使用。如果在Eclipse中使用,可以不需要修改代码,比较方便易操作。

2.TraceView的作用

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

3.TraceView的使用方法

如前文所述,TraceView的使用有两种基本方法:在终端运行traceview命令、在DDMS中使用。下面依次进行介绍。

方法一:在终端运行traceview命令

1.确定跟踪范围

在你要进行性能分析的应用的源码中,在开始位置和结束位置分别调用startMethodTracing和stopMethodTracing方法,示例代码如下:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 高亮 eyelike
        Debug.startMethodTracing();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 高亮 eyelike
        Debug.stopMethodTracing();
    }
}

高亮部分为所添加的代码。

2.添加SD卡读写权限

在应用的Manifest.xml文件中,需要声明如下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

这是因为,traceview的数据文件,将存储在手机的/sdcard/路径下面。如果没有声明权限,程序运行到上面添加的代码的时候,将会报错。

3.运行程序

这里要强调的一点就是,运行程序,对其进行操作,使其有运行我们需要分析的那些代码块。这点其实很好理解,因为只是简单地开启程序,而不进行针对性操作的话,压根不会跑我们想分析的代码,整个过程也就没有意义了。

4.导出.trace文件

在程序运行结束后会生成”.trace”文件,存放在手机的/sdcard/目录下面。

我们首先从命令进入手机:

adb shell
cd sdcard/

查看是否生成对应的traceview文件。

startMethodTracing共有6个重载的方法,在调用时可以根据需要进行调用。如果采用不带参数的方法,产生的“.trace”文件默认将存放到外置存储器根目录下(/sdcard/)。为了方便建议自定义 trace的名称(startMethodTracing(String traceName))。

例如,我自己使用下面的代码:

startMethodTracing(“eyelike_traceview”);

最终在手机中生成的文件如下图所示:
Android性能分析工具之TraceView_第1张图片
图1 从终端查看trace文件
我们可以退出shell,将该trace文件导出,例如,导出到/local目录下,命令如下:

adb-4.4 pull /sdcard/eyelike_traceview.trace ./

5.查看.trace文件

我们可以通过命令traceview *.trace对数据文件进行分析。如果traceview工具没有声明在环境变量中,我们一般会使用SDK中tool目录下的traceview进行打开。

首先,进入sdk,我的路径如下:

cd /local/sdb1/eyelike/tools/android-sdk-linux_x86/tools

然后,执行下面即可:

./traceview /local/eyelike_traceview.trace

由于我导出来的.trace文件是放在/local下面的,所以上面命令要写上全路径。你也可以直接将导出来的.trace文件拷贝到sdk/tool目录下面。

这样,就可以成功打开这个文件了,如下图所示:
Android性能分析工具之TraceView_第2张图片
图2 traceview工具面板视图

6.traceview工具面板介绍

Traceview 面板分上下两部分。
上面是时间轴面板 (Timeline Panel)。
左侧显示的是线程信息
右侧黑色部分是显示执行时间段、白色是线程暂停时间段,
右侧鼠标放在上面会出现时间线纵轴,在顶部会显示当前时间线所执行的具体函数信息
下面是分析面板(Profile Panel) 。

Profile Panel各列作用说明如下表所示:

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

表1 Profile Panel各列作用表

7.分析.trace文件

其实,前面所做的一切都是为了这一步。
Android性能分析工具之TraceView_第3张图片
图3 traceview面板功能图解
在实际中初步使用,我们面对上面繁杂的图表还是显得无从下手。我们最常遇到的问题,是如何查找出哪些地方比较耗时。下面简单讲一下方法。

1.TraceView罗列出了是所有监听到的方法,当然也包括Android系统很多方法的耗时,如何在这么多方法里面查找到自己关心的? 可以通过TraceView 底部的find 来查找,通常Android app都是有包名的,可以先针对某些关心的列排序后,在通过包名进行一个个查找,这些就省去自己筛选出自己app 方法耗时排行的时间。

2.我们还可以通过图形的宽窄和颜色,先大致可以了解到哪里的用时较长。然后点到该部位,再去细看这附近的具体方法。
再老手,其实基本思路也是这样的。所以初学者大可不必灰心,耐心去看具体的方法,就定会分析出一些成果出来。

方法二:在DDMS中使用

traceview也可以在DDMS中直接使用,即在DDMS中在选中某个要进行监控的进程后,点击如图所示的小图标开始监控,在监控结束时再次点击小图标,ddms会自动打开traceview视图。示例图如下:
Android性能分析工具之TraceView_第4张图片
图4 DDMS开启traceview图解

traceview视图打开后,剩下的分析与方法一相同。

这两种使用方式,各有优缺点:第一种监控过程比较精确,但需要修改代码;第二种监控使用方便,不需要修改代码,但不如第一种精确。

参考文献

1.《【Android测试工具】01. Android TraceView工具使用详解》http://blog.csdn.net/wirelessqa/article/details/8764622
2.《Android 性能优化 二 TraceView工具的使用》http://blog.csdn.net/androiddevelop/article/details/8223805

eyelike@2014-11-19

你可能感兴趣的:(android,性能,traceview)