获取Android界面性能数据的快捷方法
探测 界面绘制性能
获取界面的绘制性能有很多种方法,比如说 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)
}
}
看下运行结果:
可以根据log的结果 来 估算页面的渲染性能。类似于这种》=16ms 才layoutMeasure一次的,显然是界面有了卡顿
谷歌原文
界面首次绘制完成时间
通常而言,我们有时候还希望获取到界面启动 到“界面绘制完成” 的时间 为什么要加引号? 因为 往往 ActivityTaskManager: Displayed 展示出来的结果 仅仅是
表示了从启动应用到系统认为其 "已启动" 所花费的时间,其中包括绘制第一帧 (所以是 "已显示" 的状态)
但大部分的情况是我们界面启动以后 还会做一些业务上的操作 比如去io获取一些重要的信息 然后刷新ui 怎么获取到 界面启动 到这个时间点的耗时?
大部分人都是在在onCreate里面 获取一个时间戳 然后在业务操作完成的时间点 再获取一个时间戳 然后算一下 差额,
其实现在就有更简便的写法
reportFullyDrawn
在你认为合适的地方 调用这个函数 然后观测如下日志:
这是一种更为简便的观测方法
更快捷的获取activity的启动时间
有时候我们喜欢观察如下日志:
来获取activity的启动时间
但其实有时候 这样也挺不方便的,尤其是需要频繁测试一个页面的启动性能
老是靠手点 很不方便,其实可以用 shell 命令来完成:
adb shell am start-activity -W -n 包名/activity名称
也可以对脚本的执行结果 进行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
效果如下:
以上就是获取Android界面性能数据的快捷方法的详细内容,更多关于获取Android界面性能数据的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341