TraceView进行性能分析

一.TraceView概述
TraceView 是 Android 平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到 method。
详细内容参考:Profiling with Traceview and dmtracedump

TraceView 简介
TraceView 是 Android 平台特有的数据采集和分析工具,它主要用于分析 Android 中应用程序的 hotspot。TraceView 本身只是一个数据分析工具,而数据的采集则需要使用 Android SDK 中的 Debug 类或者利用 DDMS 工具。二者的用法如下:

    开发者在一些关键代码段开始前调用 Android SDK 中 Debug 类的 startMethodTracing 函数,并在关键代码段结束前调用 stopMethodTracing 函数。这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是 Java 线程)的函数执行情况,并将采集数据保存到 /mnt/sdcard/dmtrace.trace中。开发者然后需要利用 SDK 中的 TraceView 工具来分析这些数据
    借助 Android SDK 中的 DDMS 工具。DDMS 可采集系统中某个正在运行的进程的函数调用信息。对开发者而言,此方法适用于没有目标应用源代码的情况。

在ddms中选定某一个进程,点击start Method profiling即可开始追踪,在点一次就停止trace,同时ddms会把trace的文件保存到c盘临时目录
 

 TraceView 界面比较复杂,其 UI 划分为上下两个面板,即 Timeline Panel(时间线面板)和 Profile Panel(分析面板)。上图中的上半部分为 Timeline Panel(时间线面板),Timeline Panel 又可细分为左右两个 Pane:

    左边 Pane 显示的是测试数据中所采集的线程信息。由图可知,本次测试数据采集了 main 线程,传感器线程和其它系统辅助线程的信息。
    右边 Pane 所示为时间线,时间线上是每个线程测试时间段内所涉及的函数调用信息。这些信息包括函数名、函数执行时间等。由图可知,Thread-1412 线程对应行的的内容非常丰富,而其他线程在这段时间内干得工作则要少得多。
    另外,开发者可以在时间线 Pane 中移动时间线纵轴。纵轴上边将显示当前时间点中某线程正在执行的函数信息。

上图中的下半部分为 Profile Panel(分析面板),Profile Panel 是 TraceView 的核心界面,其内涵非常丰富。它主要展示了某个线程(先在 Timeline Panel 中选择线程)中各个函数调用的情况,包括 CPU 使用时间、调用次数等信息。而这些信息正是查找 hotspot 的关键依据。所以,对开发者而言,一定要了解 Profile Panel 中各列的含义。下表列出了 Profile Panel 中比较重要的列名及其描述
 
二.实例分析
编写代码如下:
  1. package org.bing.smalilibrary;
  2. import com.android.smalilib.LogUtil;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Debug;
  6. public class MainActivity extends Activity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. Debug.startMethodTracing();
  12. Thread thread = new Thread(new Runnable() {
  13. @Override
  14. public void run() {
  15. int i = 0;
  16. while (i < 10000) {
  17. LogUtil.d(i);
  18. i++;
  19. }
  20. }
  21. });
  22. thread.start();
  23. }
  24. @Override
  25. protected void onDestroy() {
  26. super.onDestroy();
  27. Debug.stopMethodTracing();
  28. }
  29. }

需要加入权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
 
运行程序,退出,看到日志
 
将文件拷贝到电脑上用Eclipse打开
 
我们马上发现run方法占用了几乎100%的CPU时间,其中log.d调用了1W次
再次trace需要把/mnt/sdcard/dmtrace.trace文件删除掉,因为程序会覆盖写




posted @ 2016-08-30 22:19  Bingghost  阅读(735)  评论(0编辑  收藏  举报