为了更加精确的追踪方法调用,优化性能,可以通过 Debug 类生成插桩日志,在 Profiler 面板中导入后进行分析。
一、生成插桩日志
1. 工具类封装
/**
* 在需要开始跟踪的地方调用如下代码,将生成的文件保存在指定目录中
* @param context 使用指定的上下文生成跟踪文件目录和名称
*/
fun startTrack(context: Context) {
val name = context.javaClass.simpleName
val path: String = context.filesDir.path + "/track-${
System.currentTimeMillis()}-$name.trace"
"path====> $path".logD()
Debug.startMethodTracing(path)
}
/**
* 结束跟踪
*/
fun stopTrack() {
Debug.stopMethodTracing()
}
2. 示例中调用
/** 点击界面上的一个按钮,开始追踪 */
viewBinding.button.setOnClickListener {
startTrack(this)
viewModel.sleepOnMainThread()
stopTrack()
}
3. 模拟耗时
/** 在主线程睡眠2秒,模拟耗时操作 */
fun sleepOnMainThread() {
kotlin.runCatching {
Thread.sleep(2000)
}
}
二. 导出日志,分析数据
1. 在 Device File Explorer 面板中找到自己的应用目录下的 xxx.trace 文件,右键 Save as 保存到自己指定的目录中,比如桌面
// 例如我在示例中生成的文件路径
/data/data/com.william.easykt/files/track-1661176701787-ProfilerActivity.trace
导出操作如下图:
2. 然后打开 Profiler 面板,点击 “+” 号,选择 “Load from file…”,将上述文件导入,完成后就可以进行日志分析了
3. 导入成功后图例
- 左边红框中截选了主线程 main 中的方法调用轨迹图
- 右边红框对应的是主线程 main 中的方法调用明细数据
4. 分析数据
- 从下图中,可以看到方法调用的执行轨迹,从上到下,分发事件,响应按钮点击,最后执行 ProfilerViewModel 的 sleepOnMainThread() 方法,可以看到右边的时间明细为2s。
- 现在我们按照如下修改,将模拟的耗时操作放在子线程中,重新 run 生成日志
fun sleepOnWorkThread() {
thread {
kotlin.runCatching {
Thread.sleep(2000)
}
}
}
- 通过重新生成的日志数据,可以观察到点击操作的耗时缩短到了 2.23ms