Android Perfiler 性能分析工具(三)CPU Trace抓取与分析-- Android APP 性能追踪与分析工具

1,099 阅读4分钟

创作不易,希望能一键三连哦~点赞👍、收藏🌟、加关注➕,随用随学不迷路~

接上篇 Android Perfiler 性能分析工具(二)CPU性能分析与优化--介绍-- Android APP 性能追踪与分析工具 - 掘金 (juejin.cn)在学习了如何使用Perfiler分析CPU的性能后接下来我们就要对完整的 System Trace 进行分析,来确定APP的优化方向。

如何找到工具,参照:Android Perfiler 性能分析工具(一)如何使用-- Android APP 性能追踪与分析工具 - 掘金 (juejin.cn)

案例教学

CPU性能分析与优化

进入CPU性能追踪详情页

  • Callstack Sample(调用堆栈案例)
  • System Trace (系统追踪)
  • Java/Kotlin Method Trace (Java/Kotlin 方法追踪)
  • Java/Kotlin Method Sample(Java/Kotlin 方法示例)
image.png
一、Sample(调用堆栈案例)
  • 选中 Callstack Sample,点击Record按钮,可以看到CPU波动区域会将接下来的数据区域进行选中,这时候表示Perfiler开始记录方法的执行顺序了。

  • 点击APP中的图片压缩按钮,待执行完毕后,点击Stop按钮体制录制。将会得到如下图所示的解析记录: image.png

  • ⚠️注意:这里可能会出现一些耗时很短的方法没有被采样到,是正常现象,因为采样使用的间隔采样记录,当一些方法耗时很短时候,再次采样时候,方法已经执行完成了。

  • 通过分析可以看到方法在线程中的执行顺序和内部的过程。这将有助于我们对程序的性能进行分析,通过优化耗时长的方法来解决常见的,渲染卡顿、ANR、CPU消耗过大等问题。 image.png

二、System Trace (系统追踪)
  • 选中System Trace,点击Record按钮,可以看到CPU波动区域会将接下来的数据区域进行选中,这时候表示Perfiler开始记录方法的执行顺序了。

  • 点击APP中的图片压缩按钮,待执行完毕后,点击Stop按钮体制录制。将会得到如下图所示的解析记录,可以看到VSYNC、APP进程、RenderThread、GPU completion等: image.png

  • 通过分析可以看到在主线程中的耗时操作都集中在黄色区域 decodeBitmap,由于是在主线程,从而导致页面卡顿无法进行触摸事件交互,查看Android源码发现,此操作是在decodeStream使用Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap");Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);进行的记录,即对应到我们的代码是zipBitMap()中的BitmapFactory.decodeResource(resources, R.drawable.adventure_time, options)image.png

  • 找到代码进行优化处理,添加工作线程工作协程进行耗时的图片压缩处理,再重复上面的操作看下是否还有卡顿的问题。结果如下图所示,黄色区域 decodeBitmap耗时区域从主线程剥离出来进入了DefaultDispatcher工作线程,这个时候再进行触摸交互都是不会卡顿的。

// 创建主线程调度器
private val mMainScope = MainScope()
override fun onClick(v: View?) {
        if (v!!.id === R.id.opencvSampleButton) {
            // 切换到 IO 协程
            mMainScope.launch(Dispatchers.IO) {
                // 压缩图片
                val resultBitmap = zipBitMap()
                //  切换到主线程
                mMainScope.launch(Dispatchers.Main) {
                    // 设置压缩后图片显示
                    binding.opencvSampleImageView.setImageBitmap(resultBitmap)
                    // Toast提示
                    Toast.makeText(applicationContext, "ok", Toast.LENGTH_SHORT).show()
                    // 修改按钮文字
                    binding.opencvSampleButton.text = "zipBitMap After"
                }
            }
        }
  }
image.png
三、Java/Kotlin Method Trace (Java/Kotlin 方法追踪)
  • 选中Java/Kotlin Method Trace,点击Record按钮,可以看到CPU波动区域会将接下来的数据区域进行选中,这时候表示Perfiler开始记录方法的执行顺序了。

  • 点击APP中的图片压缩按钮,待执行完毕后,点击Stop按钮体制录制。将会得到如下图所示的解析记录,Main Thread、DefaultDispatcher、RenderThread等:

    image.png
  • 这里对比上面的System Trace (系统追踪)上面呈现的内容是由Trace.traceBeginTrace.traceEnd所标记起来的信息,内容相对较少,也无法直接跳转到调用的方法内。而这里呈现的内容是真实的方法调用,可以通过双击``、右击(Jump Source)等方式进入到对应的代码中,方便定位代码进行调试。

四、 Java/Kotlin Method Sample(Java/Kotlin 方法示例)同Java/Kotlin Method Trace (Java/Kotlin 方法追踪)

创作不易,希望能一键三连哦~点赞👍、收藏🌟、加关注➕,随用随学不迷路~