我正在尝试根据以下文档http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles使用Debug.startMethodTracing(在onCreate上的活动)和Debug.stopMethodTracing(在活动onDestroy上)为应用程序生成跟踪文件。
我在物理设备上运行该应用程序,并成功创建了跟踪文件。后来我在它们上运行dmtracedump来生成一个调用堆栈图,但它不包含我的任何应用程序方法调用。
为了测试这个,我创建了一个简单的Android应用程序,向清单添加了debbuggable:
<application
...
android:debuggable="true">
创建了两个测试类A和B.A类有两个方法b()和c():
public class A {
private int _i;
public A(){_i=0;}
public void b(){c();}
public void c(){for(int k=0;k<20;k++)_i++;}}
B类有一个方法c():
public class B {
public void c(){
(new A()).b();
A d = new A();
d.c();
}}
最后在onCreate和onDestroy方法的主要活动中,我开始了跟踪:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Debug.startMethodTracing("debugtest");
A a;
for (int i = 0; i < 20; i++) {
a = new A();
a.b();
a.c();
}
(new B()).c();
}
@Override
public void onDestroy() {
super.onDestroy();
Debug.stopMethodTracing();
}
我希望在调用堆栈图中至少获得A.b()和A.c()方法调用,但是在运行之后:
adb pull sdcard/debugtest.trace . ; dmtracedump debugtest.trace -g tree.png
生成的调用图如下:
它应该如何工作,即只显示android调用而不是应用程序方法调用,或者我错过了什么?
请注意,我最感兴趣的是检索方法执行的独占和包容时间。
答案 0 :(得分:0)
您可以通过放置e.getStacktrace()或在类中使用Log来获取更多信息。我发现明确要求错误比希望代码只是来找你更容易。当然可能有一个更好的方法,但这就是我已经做了一段时间的事情,并且我已经能够获得一个非常一致且易于查明的结果。
答案 1 :(得分:0)
可能是因为(默认情况下)traceview的-t选项设置为20%。来自AndroidStudio dmtracedump
-t:在图表中包含子节点的最小阈值(孩子的包容时间占父包含时间的百分比)。如果 未使用此选项,默认阈值为20%。
如果您使用traceview打开跟踪文件,您会看到图表类似于:
使用-t 0运行dmtracedump(如下所示),您应该看到所有方法。
dmtracedump -t 0 debugtest.trace -g tree.png