Android 性能优化 之 插桩日志分析

为了更加精确的追踪方法调用,优化性能,可以通过 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

导出操作如下图:
trace文件截图

2. 然后打开 Profiler 面板,点击 “+” 号,选择 “Load from file…”,将上述文件导入,完成后就可以进行日志分析了

导入trace文件示意图


3. 导入成功后图例

  • 左边红框中截选了主线程 main 中的方法调用轨迹图
  • 右边红框对应的是主线程 main 中的方法调用明细数据

trace文件导入成功后的图例


4. 分析数据

  • 从下图中,可以看到方法调用的执行轨迹,从上到下,分发事件,响应按钮点击,最后执行 ProfilerViewModel 的 sleepOnMainThread() 方法,可以看到右边的时间明细为2s。

数据分析

  • 现在我们按照如下修改,将模拟的耗时操作放在子线程中,重新 run 生成日志

fun sleepOnWorkThread() {
    
    
    thread {
    
    
        kotlin.runCatching {
    
    
            Thread.sleep(2000)
        }
    }
}

  • 通过重新生成的日志数据,可以观察到点击操作的耗时缩短到了 2.23ms

新生成的日志截图

以上只是一个简单的示例。在实际复杂场景中,我们可以在需要的地方加入插桩日志,这样就能更方便直观的分析性能,从而改善应用体验。


附 Github 源码

DebugUtil.kt

ProfilerActivity.kt

猜你喜欢

转载自blog.csdn.net/java_android_man/article/details/126474771