创作不易,希望能一键三连哦~点赞👍、收藏🌟、加关注➕,随用随学不迷路~
接上篇Android Perfiler 性能分析工具(一)如何使用-- Android APP 性能追踪与分析工具 - 掘金 (juejin.cn)在学习了如何打开Perfiler后接下来我们就要对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性能分析与优化
案例代码,代码是点击按钮后将图片压缩后再设置回原来的ImageView进行渲染显示
class SystraceActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var binding: ActivitySystraceBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySystraceBinding.inflate(layoutInflater)
setContentView(binding.root)
Trace.beginAsyncSection("onCreate", 111)
binding.opencvSampleButton.setOnClickListener(this)
}
override fun onClick(v: View?) {
if (v!!.id === R.id.opencvSampleButton) {
// 图片压缩
val bitmap = zipBitMap()
binding.opencvSampleImageView.setImageBitmap(bitmap)
// Toast提示
Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show()
// 替换原来图片进行渲染
binding.opencvSampleButton.text = "zipBitMap After"
}
}
/**
* 这里呈现的时序图是一个完整的大块,方便演示
*/
fun zipBitMap(): Bitmap {
var bitmap: Bitmap
val options = BitmapFactory.Options()
//只得到图片的宽和高
options.inJustDecodeBounds = true
//设置图片的压缩比例
options.inSampleSize = computSampleSize(options, 200, 320)
//设置完压缩比酷之后,必须将这个属性改为false
options.inJustDecodeBounds = false
// 尺寸压缩1/2
options.inSampleSize = 4
var i = 1
while (i < 200) { // 重复500次 模拟耗时操作
bitmap = BitmapFactory.decodeResource(resources, R.drawable.adventure_time, options)
i++
}
//得到传递过来的图片的信息
return BitmapFactory.decodeResource(resources, R.drawable.adventure_time, options)
}
private fun computSampleSize(options: BitmapFactory.Options, w: Int, h: Int): Int {
val width = options.outWidth
val height = options.outHeight
//图片的缩小比例,只要小于等于,就是保持原图片的大小不变
var inSqmpleSize = 1
if (width > w || height > h) {
val zipSizeWidth = Math.round((width / w).toFloat())
val zipSizeHeight = Math.round((height / h).toFloat())
inSqmpleSize = if (zipSizeWidth < zipSizeHeight) zipSizeWidth else zipSizeHeight
}
return inSqmpleSize
}
}
进入 CPU 单独的性能分析页面按照如图操作,右击,选择 Record CPU trace
在执行了图片压缩算法后,进行结束录制,右击,选择 Stop recording
进入详细分析页面
检索过滤目标方法,选中Top Down->输入onClick->在时序图中找到要分析的方法(w-放大、s-缩小、a-左移动、d-右移动)
放大onClick方法对应的范围
- 通过上面的时序图可以看到,用户触摸按钮后,先执行了
performClick(),在其内部执行了图片压缩zipBitMap()方法,然后执行了opencvSampleImageView.setImageBitmap(bitmap),后面在主线程执行了doTraversal()对View进行更新 ,至此完整的由用户触发对图片进行压缩更新的流程就执行完毕。 - 我们可以通过概览信息看到
onClick()方法执行总耗时为:2815ms,其中zipBitMap()方法执行耗时为:2810ms,造成了页面卡顿,需要进行优化。 - 双击
zipBitMap()对应的区域即可跳转到对应的代码类,找到方法进行优化即可。在案例代码中我们只需要将循环代码去掉即可,优化zipBitMap()的耗时降为了26ms,压缩体验变得顺滑了很多。
以上通过小的案例,描述了如何使用Android Perfiler针对CPU性能分析与优化。希望对大家以后的APP性能调优有所帮助。
创作不易,希望能一键三连哦~点赞👍、收藏🌟、加关注➕,随用随学不迷路~