Android Perfiler 性能分析工具(二)CPU性能分析与优化--介绍-- Android APP 性能追踪与分析工具

729 阅读2分钟

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

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

如何找到工具,参照: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

image.png

在执行了图片压缩算法后,进行结束录制,右击,选择 Stop recording

image.png

进入详细分析页面

image.png

检索过滤目标方法,选中Top Down->输入onClick->在时序图中找到要分析的方法(w-放大、s-缩小、a-左移动、d-右移动)

image.png

image.png

放大onClick方法对应的范围

image.png

image.png

  • 通过上面的时序图可以看到,用户触摸按钮后,先执行了performClick(),在其内部执行了图片压缩zipBitMap()方法,然后执行了opencvSampleImageView.setImageBitmap(bitmap),后面在主线程执行了doTraversal()对View进行更新 ,至此完整的由用户触发对图片进行压缩更新的流程就执行完毕。
  • 我们可以通过概览信息看到onClick()方法执行总耗时为:2815ms,其中zipBitMap()方法执行耗时为:2810ms,造成了页面卡顿,需要进行优化。
  • 双击zipBitMap()对应的区域即可跳转到对应的代码类,找到方法进行优化即可。在案例代码中我们只需要将循环代码去掉即可,优化zipBitMap()的耗时降为了26ms,压缩体验变得顺滑了很多。

image.png

以上通过小的案例,描述了如何使用Android Perfiler针对CPU性能分析与优化。希望对大家以后的APP性能调优有所帮助。

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