Android Method Trace 生成与解析

Android Studio 3.0 中的 Profiler 工具相比 2.0 版本有了很大的进步,这几天翻了下相关的源码记录如下.

生成 trace 文件

官方的文档里对于生成 trace 文件主要有两种

code

第一种是在代码中添加

1
2
3
4
5
// start tracing to "/sdcard/calc.trace"
Debug.startMethodTracing("calc");
// ...
// stop tracing
Debug.stopMethodTracing();

生成的trace文件

ddmlib

第二种是使用 ddms / Android Monitor 手动生成, ddms 的核心是一个叫 ddmlib 的库, 在 Android SDK 里 tools/lib/ddmlib-*.jar 可以找到.
网上关于 ddmlib 的文章不多, 可以参考一下. 隐藏Boss——ddmlib使用入门通过 ddmlib 使用 adb,构建框架基础库

命令行工具

翻着源码掉了 N 次坑写了一个命令行调用的 jar AndroidMethodTraceRunner
命令行中调用 $ java -jar mtr.jar -p com.your.package -o output.trace -t 10 可以 trace 10 秒钟, 运行需要 java8.
主要的两个坑:
AndroidDebugBridge.init(true); false 的话不能获取到 client
必须关闭 ddms 和 Studio 的 monitor / profiler, 否则会抢占 client 造成连接失败.

对于 ddmlib 有几个大体的概念
bridge - adb
device - 设备
client - 应用

主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//bridge
//**注意**, 生成 trace 需要连接 client, init(false) 会断开 client
AndroidDebugBridge.init(true);
AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();
//device
IDevice[] devices = bridge.getDevices();
IDevice device = devices[0];
//client
Client client = device.getClient(packageName);
//start stop
client.startSamplingProfiler(10, TimeUnit.MILLISECONDS);
client.stopSamplingProfiler();

Android Studio

但是 Android Studio 3.0 中并没有使用 ddmlib
大体调用栈如下:

1
2
3
4
5
6
7
8
9
10
11
./idea/profilers-ui/src/com/android/tools/profilers/cpu/CpuProfilerStageView.java: myStage.startCapturing();
startCapturing
./tools/adt/idea/profilers/src/com/android/tools/profilers/cpu/CpuProfilerStage.java
com.android.tools.profilers.cpu.CpuProfilerStage#startCapturing
./tools/base/profiler/native/perfd/cpu/cpu_service.cc
grpc::Status CpuServiceImpl::StartProfilingApp
./tools/base/profiler/native/perfd/cpu/simpleperf_manager.cc
bool SimplePerfManager::StartProfiling

解析/读取 trace

GUI

ddms 或者 Android Studio 2.0 / Intellij IDEA 可以直接打开 trace 文件, 但是都没有 Android Studio 3.0 的 profiler 直观好用.

android-studio-3.0-profile)

android-studio-traceview

monitor

dmtracedump

todo

命令行工具

todo

目录

  1. 1. 生成 trace 文件
    1. 1.1. code
    2. 1.2. ddmlib
    3. 1.3. 命令行工具
    4. 1.4. Android Studio
  2. 2. 解析/读取 trace
    1. 2.1. GUI
    2. 2.2. dmtracedump
    3. 2.3. 命令行工具