插桩需要使用到 Debug 类,并且会在 sdcard 中生成 .trace 文件,所以你必须首先保证你的应用具有写外部存储( WRITE_EXTERNAL_STORAGE )的权限。
在想要跟踪的代码逻辑开头和结尾处分别插桩:
// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name “sample.trace”.
Debug.startMethodTracing(“sample”);
…
// The system begins buffering the generated trace data, until your
// application calls stopMethodTracing(), at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing();
生成的 .trace
文件会被保存在固定目录下,与 getExternalFilesDir()
返回的目录相同,即 /sdcard/Android/data/[YOUR_PACKAGE_NAME]/files
下。
请注意,如果您的应用在未更改跟踪日志名称的情况下再次调用 startMethodTracing(),则会覆盖已保存至设备的现有日志。如果希望每次运行都保存至不同的日志文件,可以使用如下代码:
// Uses the SimpleDateFormat class to create a String with
// the current date and time.
SimpleDateFormat date =
new SimpleDateFormat(“dd_MM_yyyy_hh_mm_ss”);
String logDate = date.format(new Date());
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing(
“sample-” + logDate);
如果系统在您调用 stopMethodTracing() 之前达到最大缓冲值,则会停止跟踪并向管理中心发送通知。 开始和停止跟踪的函数在您的整个应用流程内均有效。 也就是说,您可以在 Activity 的 onCreate(Bundle)
函数中调用 startMethodTracing(),在 Activity 的 onDestroy() 函数中调用 stopMethodTracing()。
插好桩后,安装应用并运行被检测部分的功能,然后就可以通过 AS 或者 traceview 查看文件了。
在AS中点击 View - Tool Windows - Android File Explorer 打开 Android File Explorer :
在 /sdcard/Android/data/[YOUR_PACKAGE_NAME]/files 下即可找到生成的 .trace 文件,双击文件即可打开。
将 .trace 文件保存至电脑,直接拖入AS窗口,也可直接打开该视图。
在打开的视图中,左上方可以选择想要查看的线程。可以查看监控期间指定线程运行了多久、执行了哪些方法、每个方法执行了多久等等。
其中有4个名词需要解释一下:
**Wall Clock Time:**壁钟时间,表示实际经过的时间,即进入某个方法到退出该方法的时间,不考虑线程是活动还是休眠状态。
**Thread time:**线程时间,表示实际经过的时间减去线程没有消耗 CPU 资源(处于休眠)的时间部分。 对于任何给定函数,其线程时间始终少于或等于其壁钟时间。 使用线程时间可以让您更好地了解线程的实际 CPU 使用率中有多少是给定函数消耗的。
**Inclusive Time:**方法执行自己代码的时间 + 执行自己child方法的时间。
**Exclusive Time:**方法执行自己代码的时间。
要使用 traceview 查看,需要首先将 .trace 文件保存到电脑:
adb pull /sdcard/Android/data/[YOUR_PACKAGE_NAME]/files/sample.trace D:\Documents\sample.trace
打开 Android Device Monitor
。AS3.0以前的版本,就是LogCat所在的窗口,再切换一下tab页即可。AS3.0以后,进入 android-sdk/tools/
路径,运行以下命令:
monitor
虽然 Android Device Monitor 的 DDMS 也有 File Explorer ,但是未 root 的手机,查看不到上述路径,因此只能将 .trace 文件保存到电脑查看。
在 Android Device Monitor 中,依次点击 File - Open File
,选择 .trace 文件路径即可打开:
内容与AS打开时类似,相差较大的主要是图标部分,没有AS的 Call Chart 直观形象。
其中也有4个概念:
**Cpu Time:**相当于AS中的 Thread time。
**Real Time:**相当于AS中的Wall Clock Time。
**Inclusive Time:**同AS一样。
**Exclusive Time:**同AS一样。
这个就见仁见智了,根据我个人使用的感觉来看,建议使用AS查看。原因有二:
AS更简单。不需要单独打开ADM,更不需要将 .trace 文件保存到电脑。
AS的调用图( Call Chart )更加直观,cpu时间的消耗一目了然。
Call Chart 的水平轴表示函数调用(或调用方)的时间段和时间,并沿垂直轴显示其被调用者。 下图展示了一个调用图表示例,并描绘了给定函数的 self time、children time 以及总时间的概念。
最后需要注意一点,跟踪分析过程中,应用的运行速度会减慢。所以,通过 traceview 得到的分析数据并不能精确反应某个方法在实际执行时的绝对时间。关于这一点,在最后的注意事项中再做详细分析。
Google还提供了基于样本的分析方式,以减少分析对运行时性能的影响。要启用样本分析,需调用 Debug.startMethodTracingSampling() 方法(而非 Debug.startMethodTracing() 方法)。系统会定期收集样本,直至调用 stopMethodTracing() 。
使用 CPU Profiler 进行函数跟踪比 traceview 更简单。不需要做任何代码上的植入,下面做一个简单的介绍:
首先,通过
View - Tool Windows - Android Profiler 打开 Android Profiler 。手机连接电脑后运行应用,在 Android Profiler 中会看到以下视图:
左上角可以选择设备和进程,点击 CPU 区域,即可进入CPU Profiler视图:
最后看一下《Android框架体系架构(高级UI+FrameWork源码)》学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!
需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!
[外链图片转存中…(img-xcRgTzm5-1644029535791)]