创作不易,希望能一键三连哦~点赞👍、收藏🌟、加关注➕,随用随学不迷路~
接上篇 Android Perfiler 性能分析工具(二)CPU性能分析与优化--介绍-- Android APP 性能追踪与分析工具 - 掘金 (juejin.cn)在学习了如何使用Perfiler分析CPU的性能后接下来我们就要对完整的 System Trace 进行分析,来确定APP的优化方向。
- Perfetto 官方源码链接地址 github.com/google/perf…
- Perfetto UI 在线分析工具 ui.perfetto.dev/
- 也可用Android Studio自带工具Profiler进行分析(有🤏一点点卡,但方便不依赖网络)
- 本文案例源码:MartinDong/PerfettoDemo: Android 性能优化 (github.com)
如何找到工具,参照:Android Perfiler 性能分析工具(一)如何使用-- Android APP 性能追踪与分析工具 - 掘金 (juejin.cn)
案例教学
CPU性能分析与优化
进入CPU性能追踪详情页
- Callstack Sample(调用堆栈案例)
- System Trace (系统追踪)
- Java/Kotlin Method Trace (Java/Kotlin 方法追踪)
- Java/Kotlin Method Sample(Java/Kotlin 方法示例)
一、Sample(调用堆栈案例)
-
选中
Callstack Sample
,点击Record
按钮,可以看到CPU波动区域会将接下来的数据区域进行选中,这时候表示Perfiler开始记录方法的执行顺序了。 -
点击APP中的
图片压缩
按钮,待执行完毕后,点击Stop
按钮体制录制。将会得到如下图所示的解析记录: -
⚠️注意:这里可能会出现一些耗时很短的方法没有被采样到,是正常现象,因为采样使用的间隔采样记录,当一些方法耗时很短时候,再次采样时候,方法已经执行完成了。
-
通过分析可以看到方法在线程中的执行顺序和内部的过程。这将有助于我们对程序的性能进行分析,通过优化耗时长的方法来解决常见的,
渲染卡顿、ANR、CPU消耗过大等问题。
二、System Trace (系统追踪)
-
选中
System Trace
,点击Record
按钮,可以看到CPU波动区域会将接下来的数据区域进行选中,这时候表示Perfiler开始记录方法的执行顺序了。 -
点击APP中的
图片压缩
按钮,待执行完毕后,点击Stop
按钮体制录制。将会得到如下图所示的解析记录,可以看到VSYNC、APP进程、RenderThread、GPU completion等: -
通过分析可以看到在主线程中的耗时操作都集中在
黄色区域 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)
。 -
找到代码进行优化处理,添加
工作线程
或工作协程
进行耗时的图片压缩处理,再重复上面的操作看下是否还有卡顿的问题。结果如下图所示,黄色区域 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"
}
}
}
}
三、Java/Kotlin Method Trace (Java/Kotlin 方法追踪)
-
选中
Java/Kotlin Method Trace
,点击Record
按钮,可以看到CPU波动区域会将接下来的数据区域进行选中,这时候表示Perfiler开始记录方法的执行顺序了。 -
点击APP中的
图片压缩
按钮,待执行完毕后,点击Stop
按钮体制录制。将会得到如下图所示的解析记录,Main Thread、DefaultDispatcher、RenderThread等: -
这里对比上面的
System Trace (系统追踪)
上面呈现的内容是由Trace.traceBegin
和Trace.traceEnd
所标记起来的信息,内容相对较少,也无法直接跳转到调用的方法内。而这里呈现的内容是真实的方法调用,可以通过双击``、右击(Jump Source)
等方式进入到对应的代码
中,方便定位代码进行调试。
四、 Java/Kotlin Method Sample(Java/Kotlin 方法示例)同Java/Kotlin Method Trace (Java/Kotlin 方法追踪)
创作不易,希望能一键三连哦~点赞👍、收藏🌟、加关注➕,随用随学不迷路~