Android绘制检测工具 -- TraceView

TraceView 是 Android 自带的工具, 可以在 DDMS 中找到. 最终的分析结果会导出为 .trace 格式的文件. 文件获取有以下方式:

获取方式
  1. 手动检测:

    • 在 DDMS 中选择进程.
    • 点击 Start Method Profiling 开始记录.
    • 操作完成后点击 Stop Method Profiling 结束记录.
  2. 代码检测 (需要权限 WRITE_EXTERNAL_STORAGE):

    • 在开始监控的地方调用 Debug.startMethodTracing("name") .
    • 在结束监控的地方调用 Debug.stopMethodTracing().
    • 在 sd 卡中生成 name.trace 文件.

通过 DDMS 打开 trace 文件, 下面会有一个表格展示每个函数的各项数据, 分别介绍一下各个数据的含义.

分析表格

以下面这个函数块为例子:

    void main() {                --- 10s
        A();                    --- 1s
        B();                    --- 5s
        XXX;                    --- 4s
    }
  • Incl Cpu Time % : 表示每个函数运行所占 Cpu 时间的百分比, 包括该函数内所调用的其他函数的时间.

    如果记录的正好是 main() 的执行周期, 那么 main() 的百分比就是 100%. 以 100% 为总和来计算, 每个函数执行的时间所占百分比就是其 Incl Cpu Time % 的值.

      void main() {                --- 100%
          A();                    --- 10%
          B();                    --- 50%
          XXX;                    --- 40%
      }
  • Incl Cpu Time : 表示每个函数运行所占的 Cpu 时间, 包括该函数内调用的其他函数的时间.

  • Excl Cpu Time % : 表示每个函数运行所占 Cpu 时间的百分比, 不包括该函数内所调用的其他函数的时间.

  • Excl Cpu Time : 表示每个函数运行所占的 Cpu 时间, 不包括该函数内调用的其他函数的时间.

  • Incl Real Time % : 表示每个函数运行所占实际时间的百分比, 包括该函数内调用其他函数的时间.

    Cpu Time Real Time
    进程运行在 Cpu 上的时间 从进程开始到进程结束的整个时间, 包括 I/O 的等待时间
  • Incl Real Time : 表示每个函数运行所占的实际时间, 包括该函数内调用其他函数的时间.

  • Excl Real Time % : 表示每个函数运行所占实际时间的百分比, 不包括该函数内调用其他函数的时间.

  • Excl Real Time : 表示每个函数运行所占的实际时间, 不包括该函数内调用其他函数的时间.

  • Calls + Recur Calls / Total : 对于父函数而言, 会显示 调用次数 + 递归调用次数. 对于子函数而言, 会显示 该子函数被父函数调用的次数 / 该子函数总共被调用的次数.

    以下面的表格为例子.

    Name Calls + Recur Calls / Total 说明
    main() 10 + 0 main() 是父函数, 被调用了10次, 被递归调用了0次.
    A() 1 / 3 A() 是子函数, 被 main() 调用了1次, 被其他函数调用了3次.
  • Cpu Time / Call : Incl Cpu Time / Calls , 表示每个函数在 Cpu 上的执行时间.

  • Real Time / Call : Incl Real Time / Calls , 表示每个函数运行的实际时间.

特点

TraceView 的思路是把一段时间内所有的函数都记录下来, 因为记录的东西太多, 所以记录的结果比不开启 TraceView 要慢一些.