作用
- 通过它可以分析每个方法的运行时间以及在一段时间内该方法被调用的次数。
如果一个方法很耗时,就容易出现手机卡顿的情况;
如果一个方法被频繁的调用时,就容易出现CPU频繁调用,导致手机发烫的问题。
使用
- Android Studio中通过菜单栏的Tools菜单中的Android选项,再选择Android Device Monitor即可。
1.打开Android Device Monitor后找到Devices,然后选择要测试的设备以及app,然后点击TraceView按钮,如下图中所示。
2.接着会弹出个对话框,然后选择Trace based profiling,点击OK。
3.点击OK以后,就开始追踪代码了,此时Devices中的TraceView按钮会变成下图所示。
4.当再次点击TraceView按钮以后,即表示停止追踪代码,然后会自动弹出一个TraceView分析面板,如下所示:
TraceView面板分析
TraceView面板分上下两个部分:
- 时间线面板以每个线程为一行,右边是该线程在整个过程中方法执行的情况
- 分析面板是以表格的形式展示所有线程的方法的各项指标
1.时间线面板
时间线面板中,左边是线程信息,main线程就是Android应用的主线程,这个线程是都会有的,其他的线程可能因操作不同而发生改变。每个线程的右边对应的是该线程中每个方法的执行信息,左边为第一个方法执行开始,最右边为最后一个方法执行结束,其中的每一个小立柱就代表一次方法的调用,你可以把鼠标放到立柱上,就会显示该方法调用的详细信息,如下图所示:
可以随意滑动鼠标,滑倒哪里,左上角就会显示该方法调用的信息。
1.如果想在分析面板中详细查看该方法,可以双击该立柱,分析面板自动跳转到该方法
2.放大某个区域
在某个线程的时间线上按住鼠标左键,然后往水平方向拉,然后释放就可以放大中间拉过的那段时间线。或者也可以滚动鼠标的滚动轮。
如果想回到最初的状态,双击时间线就可以。
3.每一个方法的表示:
可以看出来,每一个方法都是用一个凹型结构来表示,坐标的凸起部分表示方法的开始,右边的凸起部分表示方法的结束,中间的直线表示方法的持续。
2.分析面板
1.面板列名含义如下:
名称 | 意义 |
---|---|
Name | 方法的详细信息,包括包名和参数信息 |
Incl Cpu Time | Cpu执行该方法及其子方法所花费的时间 |
Incl Cpu Time % | 上述时间占Cpu总执行时间的百分比 |
Excl Cpu Time | Cpu执行该方法所花费的时间 |
Excl Cpu Time % | 上述时间占Cpu总时间的百分比 |
Incl Real Time | 该方法及其子方法执行所花费的实际时间(从执行该方法到结束) |
Incl Real Time % | 上述时间占总的运行时间的百分比 |
Excl Real Time | 该方法自身的实际运行时间 |
Excl Real Time % | 上述时间占总的运行时间的百分比 |
Calls+Recur | 调用次数+递归次数(只在方法中显示),在展开后的父类和子类的方法,这一栏被下面的数据代替 |
Calls/Total | 调用次数和总调用次数的占比 |
Cpu Time/Call | Cpu执行时间和调用次数的百分比,代表该方法占用Cpu的平均时间 |
Real Time/Call | Cpu实际执行时间与调用次数的百分比,代表该方法平均执行时间 |
可以点击某个函数展开更详细的信息:
展开后,大多数有以下两个类别:
- Parents:调用该方法的父类方法
- Children:该方法调用的子类方法
如果该方法含有递归调用,可能还会多出两个类别:
- Parents while recursive:递归调用时所涉及的父类方法
- Children while recursive:递归调用时所涉及的子类方法
首先,来看当前方法的信息:
根据下图中的toplevel可以看出总的Cpu执行时间为1797.167ms,当前方法占用Cpu的时间为375.201,375.201/1797.167=0.2087,和Incl Cpu Time%是吻合的。当前方法消耗的时间为580.668,而toplevel的时间为53844.141ms,580.668/53844.141=1.07%,和Incl Real Time %也是吻合的。在来看调用次数为177,递归次数为354,和为177+354=531,375.201/531 = 0.7065和Cpu Time/Call也是吻合的,580.668/531=1.0935,和Real Time/Call一栏也是吻合的。
2.Parents
其中的Incl Cpu Time%变成了100%,因为在这个地方,总时间为当前方法的执行时间,这个时候的Incl Cpu Time%只是计算该方法调用的总时间中被各父类方法调用的时间占比,比如:Parents有2个父类方法,那就能看出每个父类方法调用该方法的时间分布。因为父类只有一个,所以肯定是100%,Incl Real Time一栏也是一样的,重点是Call/Total,之前这一栏的列名为Call+Recur,而现在变成了Call/Total,这个里面的数值变成了177/531,因为总次数为531次,父类调用了177次,其他531次是递归调用。这一数据能得到的信息是,当前方法被调用了多少次,其中有多少次是父类方法调用的。
3.Children
从图中可以看出其子类有2个,一个是自身,一个是android/view/View.draw(L android/graphics/Canvas;)V,self代表自身方法中的语句执行情况,由上面可以看出来,该方法没有多余语句,直接调用了其子类方法。另外一个子类方法,可以看出被当前方法调用了177次,但是该方法被其他方法调用过,因为他的总调用次数为892次,可以点击进入子类方法的详细信息中。
4.Parents while recursive
列举了递归调用当前方法的父类方法,以及其递归次数的占比,由于当前的方法递归了354次,以上三个父类方法递归的次数分别为348+4+2 = 354次。
5.Children while recursive
列举了当递归调用时调用的子类方法。