TraceView是Android SDK中自带的一个工具,可以对应用中方法调用耗时进行统计分析,是Android性能优化和分析时一个很重要的工具。TraceView位于SDK下的 tools目录中,使用时可以在终端运行traceview命令,也可以在DDMS中使用。如果在Eclipse中使用,可以不需要修改代码,比较方便易操作。
如前文所述,TraceView的使用有两种基本方法:在终端运行traceview命令、在DDMS中使用。下面依次进行介绍。
在你要进行性能分析的应用的源码中,在开始位置和结束位置分别调用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();
}
}
高亮部分为所添加的代码。
在应用的Manifest.xml文件中,需要声明如下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
这是因为,traceview的数据文件,将存储在手机的/sdcard/路径下面。如果没有声明权限,程序运行到上面添加的代码的时候,将会报错。
这里要强调的一点就是,运行程序,对其进行操作,使其有运行我们需要分析的那些代码块。这点其实很好理解,因为只是简单地开启程序,而不进行针对性操作的话,压根不会跑我们想分析的代码,整个过程也就没有意义了。
在程序运行结束后会生成”.trace”文件,存放在手机的/sdcard/目录下面。
我们首先从命令进入手机:
adb shell
cd sdcard/
查看是否生成对应的traceview文件。
startMethodTracing共有6个重载的方法,在调用时可以根据需要进行调用。如果采用不带参数的方法,产生的“.trace”文件默认将存放到外置存储器根目录下(/sdcard/)。为了方便建议自定义 trace的名称(startMethodTracing(String traceName))。
例如,我自己使用下面的代码:
startMethodTracing(“eyelike_traceview”);
最终在手机中生成的文件如下图所示:
图1 从终端查看trace文件
我们可以退出shell,将该trace文件导出,例如,导出到/local目录下,命令如下:
adb-4.4 pull /sdcard/eyelike_traceview.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目录下面。
这样,就可以成功打开这个文件了,如下图所示:
图2 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各列作用表
其实,前面所做的一切都是为了这一步。
图3 traceview面板功能图解
在实际中初步使用,我们面对上面繁杂的图表还是显得无从下手。我们最常遇到的问题,是如何查找出哪些地方比较耗时。下面简单讲一下方法。
1.TraceView罗列出了是所有监听到的方法,当然也包括Android系统很多方法的耗时,如何在这么多方法里面查找到自己关心的? 可以通过TraceView 底部的find 来查找,通常Android app都是有包名的,可以先针对某些关心的列排序后,在通过包名进行一个个查找,这些就省去自己筛选出自己app 方法耗时排行的时间。
2.我们还可以通过图形的宽窄和颜色,先大致可以了解到哪里的用时较长。然后点到该部位,再去细看这附近的具体方法。
再老手,其实基本思路也是这样的。所以初学者大可不必灰心,耐心去看具体的方法,就定会分析出一些成果出来。
traceview也可以在DDMS中直接使用,即在DDMS中在选中某个要进行监控的进程后,点击如图所示的小图标开始监控,在监控结束时再次点击小图标,ddms会自动打开traceview视图。示例图如下:
图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