Android Trace

“系统跟踪”就是记录短时间内的设备活动,并生成跟踪文件,该文件记录了系统报告,可以帮助开发者了结应用的性能。

生成 Trace 的几种方式

1. Adb 命令

适用于 Activity 冷启动,注意 Activity 的 android:exported="true", 并且应用是可调试的。

1
2
3
adb shell am start -n com.android.chrome/.Home --start-profiler /data/local/tmp/sample.trace --sampling 1000
// 执行 stop 命令才会写入文件
adb shell am profile stop <PID>

2. Debug Api 代码插桩

1
2
3
4
Debug.startMethodTracing("sample.trace");

Debug.startMethodTracingSampling(tring tracePath, int bufferSize, int intervalUs);
Debug.stopMethodTracing();
  • 参数为空,则是默认路径 /sdcard/Android/data/<pkgName>/files/dmtrace.trace
  • 参数不以 “/” 开头,比如 sample.trace,则路径为 /sdcard/Android/data/<pkgName>/files/sample.trace
  • 参数以 “/“ 开头,比如 “/sdcard/sample.trace”,则为指定的路径。

Generate Trace Logs by Instrumenting Your App

3. Android Device Mointor 中的 DDMS 生成

4. Trace Api 代码插桩

1
2
3
4
5
Trace.beginSection("");
Trace.endSection();

TraceCompat.beginSection("");
TraceCompat.endSection();

5. 使用 Python 命令启动 Systrace

systrace 命令行

1
python /sdk/platform-tools/systrace/systrace.py -o mynewtrace.html sched freq idle am wm gfx view  binder_driver hal dalvik camera input res

6. 开发者选项-System Tracing

Trace 分析工具

Android Studio

trace-as-cpu

  • Top Down:选项卡显示方法调用的列表,子节点显示子方法。
  • Bottom Up:选项卡显示一个方法调用列表,子节点显示其父方法。
  • Name:方法名,以及他们在上面图表中所对应的颜色。
  • Inclusive CPU Time:CPU 在处理这个方法以及所有子方法(如被他调用的所有方法)的总耗时。
  • Exclusive CPU Time:CPU 在处理这一个单独方法的总耗时。
  • Inclusive/Exlusive Real Time:从方法的开始执行到执行结束的总耗时,和 Systrace 中的“Wall duration”类似
  • Calls+Recursion:这个方法被调用的次数,以及被递归调用的次数。
  • CPU/Real time per Call:在处理这个方法时的 CPU 耗时的平均值以及实际耗时的平均值。另外的列展示了这个方法所有调用的累计耗时
  • **wall time(代码执行时间)与 cpu time(代码消耗 CPU 时间),锁冲突会造成两者时间差距过大。
  • Wall Clock Time:程序执行时间。
  • Thread Time:CPU 执行的时间。

Profile your app performance
Inspect traces

TraceView

Traceview 是一个性能测试工具,展示了所有方法的运行时间和调用栈。已废弃,推荐使用 AS 的 Profiler。

命令行运行 ~sdk/tools/monitor.bat 打开 Android Device Mointor,再打开 .trace 文件。

traceview-sample

  • Incl Cpu Time:方法在 CPU 中执行所有时间(包含其调用的方法所消耗的时间)
  • Excl Cpu Time: 方法在 CPU 中执行的时间(不包含其调用的方法所消耗的时间)
  • Incl Real Time:方法运行消耗的所有时间(包含子方法)
  • Excl Real Time:方法运行消耗的时间(不包含子方法)
  • Calls + Recur Calls/Total:方法调用、递归次数(重要指标,防止死循环)
  • Cpu Time/Call:该方法平均占用 CPU 的时间(重要指标,可以看出单个方法占用 CPU 的平均时间,但是要防止在个别调用处出现长时间占用,然后被平均了)
  • Real Time/Call:平均执行时间,包括切换、阻塞的时间(重要指标,可以看出单个方法执行的平均时间值,但是要防止在个别调用处出现长时间调用,然后被平均了)

时间都是以毫秒为单位。

官网分析步骤:

Traceview1

Traceview2

Traceview3

Traceview4

参考

[1] Generate Trace Logs by Instrumenting Your App
[2] Android Device Monitor
[3] Inspect trace logs with Traceview
[4] APP 性能优化与分析 CPU 篇(二)- Systrace
[5] debugging-tracing