1 记录
1.1 调用静态方法android.os.Debug.startMethodTracing();和android.os.Debug.stopMethodTracing();
1) 使用android.os.Debug.startMethodTracing();(开始跟踪),android.os.Debug.stopMethodTracing();(停止跟踪),来包裹你要分析的代码块。在这两个静态方法间的所有方法的调用都会被跟踪记录下来存放到设备的/sdcard/xxx.trace文件中(没有sd的设备,请到内置存储的根目录下查找))。
2) 把xxx.trace拷贝到pc上,运行cmd,执行命令xxx\sdk\tools xxx \xxx.trace,如下图:
3) 出现该工具的图形界面,如下图:
注:运行cmd命令后,出现了这样子的提示,如下图:
谷歌告诉我们现在traceview这个东西已经被舍弃了,被集成到了Android Device Monitor中去,我也按照提示去Android Device Monitor找到了该功能,但是发现在Android Device Monitor无法使用查找功能,所以暂时还是继续使用traceview。Android Device Monitor使用该功能的步骤如下图:
在android studio中打开Android Device Monitor,
选择File->Open File打开你的xxx.trace文件:
1.2 使用DDMS
打开Android Device Monitor,打开DDMS版面,选择你要跟踪的代码所属的进程,点击Start Method Profiling,如下图:
操作设备,然后点击Stop Method Profiling,则可以分析刚才发生了的所有函数调用了,如下图:
2 分析
2.1 时间轴
左边是是线程信息,右边深色部分是显示执行时间段、白色是线程暂停时间段,把鼠标放在右边的时间轴上,在由上方显示当前时间线所执行的函数的具体信息。
2.2 详细信息
Parent表示调用这个方法的方法,Children表示这个方法中调用的其他方法。
列名 |
含义 |
Name |
该线程运行过程中所调用的函数名 |
Incl Cpu Time |
某函数占用的Cpu时间,包含内部调用其它函数的Cpu时间 |
Excl Cpu Time |
某函数占用的Cpu时间,但不含内部调用其它函数所占用的Cpu时间 |
Incl Real Time |
某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间 |
Excl Real Time |
某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间 |
Call+Recur Calls/Total |
某函数被调用次数以及递归调用占总调用次数的百分比 |
Cpu Time/Call |
某函数调用Cpu时间与调用次数的比。相当于该函数平均执行时间 |
Real Time/Call |
同Cpu Time/Call类似,只不过统计单位换成了真实时间 |
2.3 具体分析方法
1) 如何定位到所关心的地方?
上面只是介绍了如何使用TraceView且有两种用法,但是有时使用第一种方式范围又不太精确,使用第二种添加代码的方式,可能有些地方又监听不到。这种情况可以 尝试把开始或者结束放到延迟线程中,延迟一段时间在执行开始或者结束。
2) 如何查找出哪些地方比较耗时?
TraceView罗列出了是所有监听到的方法,当然也包括Android系统很多方法的耗时,如何在这么多方法里面查找到自己关心的? 可以通过TraceView底部的find 来查 找,通常Android app都是有包名的,可以先针对某些关心的列排序后,在通过包名进行一个个查找,这些就省去自己筛选出自己app 方法耗时排行的时间。