android jankstats

news/2024/4/17 6:46:03/文章来源:https://blog.csdn.net/qq_32671919/article/details/129123207

能力

JankStats 库可帮助您跟踪和分析应用程序中的性能问题。Jank 是指渲染时间过长的应用程序帧,JankStats 库提供有关应用程序卡顿统计信息的报告。

JankStats 建立在现有 Android 平台功能之上,包括 Android 7(API 级别 24)及更高版本上的FrameMetrics API或早期版本上的OnPreDrawListener 。这些机制可以帮助应用程序跟踪完成帧需要多长时间。

用法

添加依赖

implementation "androidx.metrics:metrics-performance:1.0.0-alpha03"

初始化

class JankLoggingActivity : AppCompatActivity() {private lateinit var jankStats: JankStatsoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// ...// metrics state holder can be retrieved regardless of JankStats initializationval metricsStateHolder = PerformanceMetricsState.getHolderForHierarchy(binding.root)// 初始化JankStats jankFrameListener在用于将信息从平台传递到内部 JankStats 的同一线程上调用jankStats = JankStats.createAndTrack(window, jankFrameListener)//这个因子乘以当前的刷新率来计算帧持续时间,超过这个时间的帧被认为有jank,默认是2jankStats.jankHeuristicMultiplier = 3.0f;// 添加状态metricsStateHolder.state?.putState("Activity", javaClass.simpleName)// ...}JankLoggingActivity.kt

开启和关闭控制

override fun onResume() {super.onResume()jankStats.isTrackingEnabled = true
}override fun onPause() {super.onPause()jankStats.isTrackingEnabled = false
}

反馈异常

private val jankFrameListener = JankStats.OnFrameListener { frameData ->// A real app could do something more interesting, like writing the info to local storage and later on report it.Log.v("JankStatsSample", frameData.toString())
}JankLoggingActivity.kt

产物

FrameData(frameStartNanos=36648326900279, frameDurationUiNanos=209972875, frameDurationCpuNanos=211467511, isJank=true, states=[Navigation: Args(null), Destination(com.example.jankstats:id/messageRecycler) label=Message List class=com.example.jankstats.MessageListFragment])

侦听器提供有关对象卡顿的每帧信息 FrameData。这包含有关所请求帧的以下信息:

  • isjank:一个布尔标志,指示帧中是否发生卡顿。

  • frameDurationUiNanos:帧的持续时间(以纳秒为单位)。

  • frameStartNanos:帧开始的时间(以纳秒为单位)。

  • states:您的应用程序在帧中的状态。

原理

初始化 JankStats:传染当前activity的window和监听器

JankStats.createAndTrack(window, jankFrameListener)

init {val decorView: View? = window.peekDecorView()if (decorView == null) {throw IllegalStateException("window.peekDecorView() is null: " +"JankStats can only be created with a Window that has a non-null DecorView")}//创建holder,用来保存状态holder = PerformanceMetricsState.create(decorView)//根据版本初始化对应的implementation =JankStats,获取帧率的方式不同when {Build.VERSION.SDK_INT >= 31 -> {JankStatsApi31Impl(this, decorView, window)}Build.VERSION.SDK_INT >= 26 -> {JankStatsApi26Impl(this, decorView, window)}Build.VERSION.SDK_INT >= 24 -> {JankStatsApi24Impl(this, decorView, window)}Build.VERSION.SDK_INT >= 22 -> {JankStatsApi22Impl(this, decorView)}Build.VERSION.SDK_INT >= 16 -> {JankStatsApi16Impl(this, decorView)}else -> {JankStatsBaseImpl(this)}}//设置监听回调implementation.setupFrameTimer(true)}

>= api16 setupFrameTimer

//创建ViewTreeObserver.OnPreDrawListener添加到viewTreeObserver

//在OnPreDrawListener中获取当前帧开始时间,当前时间,帧预期耗时

//调用OnFrameListenerDelegate的onFrame(开始时间,now - 开始时间,预期时间)方法

//在onFrame中判断是不是jank

 override fun setupFrameTimer(enable: Boolean) {val decorView = decorViewRef.get()decorView?.let {if (enable) {//通过ViewTreeObserver.OnPreDrawListene来计算当前帧的耗时         val delegates = decorView.getOrCreateOnPreDrawListenerDelegator()delegates.add(onFrameListenerDelegate)} else {decorView.removeOnPreDrawListenerDelegate(onFrameListenerDelegate)}}}

端上注册了jankStats.logFrameData监听

private val onFrameListenerDelegate = object : OnFrameListenerDelegate() {override fun onFrame(startTime: Long, uiDuration: Long, expectedDuration: Long) {jankStats.logFrameData(getFrameData(startTime, uiDuration,(expectedDuration * jankStats.jankHeuristicMultiplier).toLong()))}}
internal open fun getFrameData(startTime: Long,uiDuration: Long,expectedDuration: Long): FrameData {metricsStateHolder.state?.getIntervalStates(startTime, startTime + uiDuration,stateInfo)//判断是不是jankval isJank = uiDuration > expectedDurationframeData.update(startTime, uiDuration, isJank)return frameData}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72313.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第六天 |哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集 、202. 快乐数、 1. 两数之和

打卡第六天,补昨天的卡 今日任务 哈希表理论基础242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和 哈希表理论基础 哈希表是根据关键码的值而直接进行访问的数据结构。 哈希表能解决什么问题呢? 一般哈希表都是用来快速判断一个元素是否出现集合里。 …

Tr0ll1靶机训练

信息收集 主机探测 端口扫描 21,22,80端口开放通过浏览器访问并进行指纹识别,并没没有发现什么有用信息 测试 观察发现21端口开放(ftp)尝试进行匿名登录发现其中存在一个流量文件将其下载 并将文件用wirwshark打开,追踪其TCP流(…

BEV感知:DETR3D

3D检测:DETR3D前言MethodImage Feature Extracting2D-to-3D Feature TransformationLoss实验结果前言 在这篇paper,作者提出了一个更优雅的2D与3D之间转换的算法在自动驾驶领域,它不依赖于深度信息的预测,这个框架被称之为DETR3D…

【C进阶】数据的存储

文章目录:star:1. 数据类型:star:2. 整形在内存中的存储2.1 存储规则2.2 存储模式2.3 验证大小端模式:star:3. 数据范围3.1 整形溢出3.2 数据范围的求解3.3 练习:star:4. 浮点型在内存中的存储4.1 浮点数的存储规则4.2 练习5. :star::star:总结(思维导图)⭐️1. 数据类型 在了…

Android - 代码生成远程依赖库(阿里云)

一、注册 没有注册过阿里云且没有实名认证的点这里:阿里云官网 二、查看库 阿里云制品仓库Packages (注:如果没有创建企业或个人使用,按照提示,选个人使用) 三、选择类型 选择其中一个(两…

传统巨头生“变”,中国毫米波雷达市场战火再升级

进入2023年,中国车载毫米波雷达市场战火明显升级。 一方面,愈演愈烈的份额抢夺战不仅仅存在于几大传统巨头之间,也快速转移到与国产供应商之间;随着部分外资巨头的本土化战略深入落地,同时对国产供应商造成了压力。 …

ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置gazebo仿真环境 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的rviz仿真环境后,现在来配置一下对…

MySQL数据库————MVCC

MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表,事务B修改了id2的name字段为李老四,但是没有提交,事务A查询id2的数据,得到name为李老四;事务B发生回滚,id2的数据的name又变回李四&…

性能测试知多少?怎样开展性能测试

看到好多新手,在性能需求模糊的情况下,随便找一个性能测试工具,然后就开始进行性能测试了,在这种情况下得到的性能测试结果很难体现系统真实的能力,或者可能与系统真实的性能相距甚远。 与功能测试相比,性能…

【Spring Boot 原理分析】- 自动配置

【Spring Boot 原理分析】- 自动配置 Condition 注解 Condition 是 Spring 4.0 增加的条件判断功能,通过这个功能可以实现选择的创建 Bean 操作 👑 我们在使用 Spring 的时候,只需导入某个依赖的坐标,就可以直接通过 Autwired 注…

堆,堆构建,堆排序,PriorityQueue和TopN问题

零. 前言 堆作为一种重要的数据结构,在面笔试中经常出现,排序问题中,堆排序作为一种重要的排序算法经常被问道,大顶堆小顶堆的应用经常出现,经典的问题TopN问题也是堆的重要应用,因此,了解并掌握…

Mac - Spotlight(聚焦)

文章目录一、Mac 中 Spotlight 的使用1、调用/打开 Spotlight2、执行搜索3、Spotlight 设置二、Mac 上的 Spotlight 开发1、关于 Spotlight2、使用 NSMetadataQuery 搜索示例三、mds 和 fsevents四、命令行访问 Spotlight五、Core Spotlight Framework六、Spotlight 插件相关资…

CSS预处理器sass和less

文章目录CSS预处理器什么是CSS预处理器Sass和LESS背景介绍Sass背景介绍LESS的背景介绍Sass安装Sass下载Ruby安装文件安装Ruby安装Sass编译Sass命令行编译命令行编译配置选项四种编译排版演示nested 编译排版格式expanded 编译排版格式compact 编译排版格式compressed 编译排版格…

登录逻辑漏洞整理集合

目录一、任意用户注册1.未验证邮箱/手机号2、不安全验证邮箱/手机号3.批量注册4.个人信息伪造5.前端验证审核绕过6.用户名覆盖二、任意用户登录1、万能密码2、验证码、密码回显3、登录检测不安全三、任意账号重置1、重置账号名2、验证码3、MVC数据对象自动绑定4、Unicode字符处…

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了,我上周末研究了两天 AI 画图,现在用 Ai 做图太强了,上周又升级 Stable Diffusion 玩了一下,和我去年试的时候相比强大了好多,而且插件LoRA模型玩法都还在快速迭代&#xff0c…

强化学习DQN之俄罗斯方块

强化学习DQN之俄罗斯方块强化学习DQN之俄罗斯方块算法流程文件目录结构模型结构游戏环境训练代码测试代码结果展示强化学习DQN之俄罗斯方块 算法流程 本项目目的是训练一个基于深度强化学习的俄罗斯方块。具体来说,这个代码通过以下步骤实现训练: 首先…

车机开发【Android SystemUI 架构音量控制详解】

SystemUI介绍 SystemUI摘要 在Android系统中SystemUI是以应用的形式运行在Android系统当中,即编译SystemUI模块会生产APK文件,源代码路径在frameworks/base/packages/SystemUI/,安装路径system/priv-app/-SystemUI。 什么是SystemUI 在前…

使用带有 Moveit 的深度相机来避免碰撞

文章目录 什么是深度相机?如何将 Kinect 深度相机添加到您的环境中在 Rviz 中可视化深度相机数据在取放场景中使用深度相机将深度相机与您的 Moveit 设置一起使用有很多优势。机器人可以避免未知环境中的碰撞,甚至可以对周围的变化做出反应。然而,将深度相机连接到您的设置并…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码,支持面向用户级别的行级数据访问控制,即特定用户只能访问授权过的行,隐藏未授权的行数据。此方案是实时领域Flink的解决方案,类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

数据分片(mycat)

1. 数据分片概念: 1.1. 分库分表 什么是分库分表: 将存放在一台数据库服务器中的数据,按照特定方式(指的是程序开发的算法)进行拆分,分散存放到多台数据库服务器中,以达到分散单台服务器负载的…