获取Android界面性能数据的快捷方法

 更新时间:2021年04月22日 08:28:00   作者:vivo祁同伟  
这篇文章主要介绍了获取Android界面性能数据的快捷方法,帮助大家更好的理解和学习使用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界面性能数据的资料请关注脚本之家其它相关文章!

相关文章

  • Android引入OpenCV的示例

    Android引入OpenCV的示例

    本篇文章主要介绍了Android引入OpenCV的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Android HorizontalScrollView内子控件横向拖拽实例代码

    Android HorizontalScrollView内子控件横向拖拽实例代码

    本文主要介绍Android HorizontalScrollView的使用,这里给大家一个实例来展示HorizontalScrollView内子控件横向拖拽的效果实现,有需要的小伙伴可以参考下
    2016-07-07
  • android panellistview 圆角实现代码

    android panellistview 圆角实现代码

    android panellistview 圆角是每一个android开发者都具备的一项,对于新手朋友来说可能有点难度,接下来将详细介绍,需要了解的朋友可以参考下
    2012-12-12
  • Android入门之IntentService的使用教程详解

    Android入门之IntentService的使用教程详解

    IntentService的生命周期中有一个非常好的方法-onHandleIntent方法,它是一个abstract方法,开发者在实现IntentService时可以覆盖它来处理“长事务”。本文就来聊聊IntentService的使用,需要的可以参考一下
    2022-12-12
  • Android实现带有指示器的进度条

    Android实现带有指示器的进度条

    这篇文章主要介绍了Android实现带有指示器的进度条的示例代码,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-05-05
  • Android实战项目之实现一个简单计算器

    Android实战项目之实现一个简单计算器

    随着移动互联网的普及,手机应用程序已经成为人们生活中不可或缺的一部分,计算器是一类被广泛使用的应用程序之一,这篇文章主要给大家介绍了关于Android实战项目之实现一个简单计算器的相关资料,需要的朋友可以参考下
    2023-10-10
  • Android手势滑动实现两点触摸缩放图片

    Android手势滑动实现两点触摸缩放图片

    这篇文章主要介绍了Android手势滑动实现两点触摸缩放图片的相关资料,需要的朋友可以参考下
    2016-02-02
  • Android下通过httpClient发送GET和POST请求的实例代码

    Android下通过httpClient发送GET和POST请求的实例代码

    这篇文章介绍了Android下通过httpClient发送GET和POST请求的实例代码,有需要的朋友可以参考一下
    2013-08-08
  • Flutter 中 Dart的Mixin示例详解

    Flutter 中 Dart的Mixin示例详解

    这篇文章主要介绍了Flutter 中 Dart的Mixin的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Android 简单的实现滑块拼图验证码功能

    Android 简单的实现滑块拼图验证码功能

    这篇文章主要介绍了Android 简单的实现滑块拼图验证码功能,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-03-03

最新评论