继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

几种获取android 界面性能数据的快捷方法

九州编程
关注TA
已关注
手记 475
粉丝 42
获赞 203

探测 界面绘制性能

获取界面的绘制性能有很多种方法,比如说 Systrace 但是这种方法 有一个不太好的地方就是使用起来较为复杂, 有没有一种 谷歌官方推荐 的方便一点的方法 ,其实是有的,只需要一个函数 就可以获得layout的时间 非常适合于 我们平时开发中 测试页面性能。

//调试界面性能时使用,可打印关键的layout耗时,使用完毕需删除
fun Activity.printPerformanceForLayout(tag: String = "performance") {
    val handlerThread = HandlerThread("FrameMetrics")
    handlerThread.start()
    val handler = Handler(handlerThread.looper)
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        window.addOnFrameMetricsAvailableListener({ _, frameMetrics, _ ->
            val frameMetricsCopy = FrameMetrics(frameMetrics)
            //返回的是纳秒
            val layoutMeasureDurationNs = frameMetricsCopy.getMetric(FrameMetrics.LAYOUT_MEASURE_DURATION)
            //多数情况下更习惯于ms
            val layoutMeasureDurationMs = layoutMeasureDurationNs.toDouble() / 1000000.toDouble()
            //如果有超过16ms的输出 那就要考虑你的界面是否需要进行优化了
            Log.v("wuyue", "layoutMeasureDurationMs:" + layoutMeasureDurationMs)
        }, handler)
    }
}
复制代码

看下运行结果:

image.png

可以根据log的结果 来 估算页面的渲染性能。类似于这种》=16ms 才layoutMeasure一次的,显然是界面有了卡顿

界面首次绘制完成时间

通常而言,我们有时候还希望获取到界面启动 到“界面绘制完成” 的时间 为什么要加引号? 因为 往往 ActivityTaskManager: Displayed 展示出来的结果 仅仅是

表示了从启动应用到系统认为其 “已启动” 所花费的时间,其中包括绘制第一帧 (所以是 “已显示” 的状态)

但大部分的情况是我们界面启动以后 还会做一些业务上的操作 比如去io获取一些重要的信息 然后刷新ui 怎么获取到 界面启动 到这个时间点的耗时?

大部分人都是在在onCreate里面 获取一个时间戳 然后在业务操作完成的时间点 再获取一个时间戳 然后算一下 差额,

其实现在就有更简便的写法

reportFullyDrawn

在你认为合适的地方 调用这个函数 然后观测如下日志:

image.png

这是一种更为简便的观测方法

更快捷的获取activity的启动时间

有时候我们喜欢观察如下日志:

image.png

来获取activity的启动时间

但其实有时候 这样也挺不方便的,尤其是需要频繁测试一个页面的启动性能

老是靠手点 很不方便,其实可以用 shell 命令来完成:

adb shell am start-activity -W -n 包名/activity名称
复制代码

image.png

也可以对脚本的执行结果 进行grep 只抽取你关键的total time 进行展示

adb shell am start-activity -W -n 包名/activity名称 | grep "TotalTime" | cut -d ' ' -f 2
复制代码
adb shell am start-activity -S -W -R 100 -n 包名/activity名称
复制代码

获取应用冷启动 性能

有时候我们需要统计app的冷启动性能,单次结果往往不准确 还需要多次统计以后 做平均值

也可以用如下脚本来实现, 注意不是单引号 而是 `

for i in `seq 1 100`
do
  adb shell am force-stop com.vivo.space
  sleep 2
  adb shell am start-activity -W -n 包名/activity名称 | grep "TotalTime" | cut -d ' ' -f 2
done
复制代码

效果如下:

image.png

作者:vivo祁同伟
链接:https://juejin.cn/post/6953221575860568077
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP