Android JankStats 发布 Alpha 版本啦

举报
GSYTech 发表于 2022/06/01 23:21:18 2022/06/01
【摘要】 原文链接: https://medium.com/androiddevelopers/jankstats-goes-alpha-8aff942255d5 Jank 一般指的是糟糕的应用性能,可...

原文链接: https://medium.com/androiddevelopers/jankstats-goes-alpha-8aff942255d5

Jank 一般指的是糟糕的应用性能,可能会导致丢失帧、不连续的 UI 动画和糟糕的用户体验等等

调试性能问题一直以来都很难, 主要是不清楚从哪里开始,要使用什么工具,用户遇到什么问题,或者说这些问题如何在用户的设备上体现出来。

Android 团队在过去几年中提供了很多的工具来调试各种开发中的问题:

所有这些都可以用于开发时的测试,帮助调试和修复在本地运行时看到的问题,同时 Google Play 的 Android VitalsFirebase 都提供 dashboards,开发人员可以在其中查看他们的应用在用户设备上的运行情况。

但是这样仍然很难知道应用在实际情况中可能存在的问题,尤其是在用户设备上发生的问题dashboards 会有所帮助,但它们不一定可以满足用户在遇到问题时,你想知道的发生了什么情况的详细程度。

所以 JankStats 来了:第一个专门用于检测和报告应用在用户设备上的性能问题而构建的 AndroidX 库。

JankStats 是一个相对较轻的库,主要有三个目标:

  • 捕获每帧性能信息;
  • 可以运行在用户设备上;
  • 在应用程序出现性能问题时启用检测和报告发生的情况;

每帧性能

Android 平台其实已经提供过获取帧性能数据的方法。例如可以从 API 24 开始使用 FrameMetrics, 如果在早期版本上运行时,也有多种方法可以获得相对应的信息,但是不太准确。

因此,如果想让自己的 frame-duration 逻辑适用于所有版本,则需要在不同 API 版本中实现这些机,但是现在你可以使用统一的 JankStats API,它会为你完成这件事,还可以提供更多的功能

JankStats 通过提供统一的 API 来报告 per-frame durations,并在内部通过适当的机制(FrameMetrics在 API 24+ 等)来简化这一点,这里你不必关心这些数据来自哪里,只需让 JankStats 告诉你事件花费了多长时间,然后你就会在回调里收到对应的信息。

创建和侦听 JankStats 数据本质上很简单:创建它,然后坐下来(好吧,是你的代码坐下来)并listen

以下是 JankStats 的 Demo JankLoggingActivity 中步骤的示例:

val jankFrameListener = JankStats.OnFrameListener { frameData -> 
  // 真正的应用程序会做一些比记录这个更有趣的事情... 
  Log.v("JankStatsSample", frameData.toString()) 
}jankStats = JankStats.createAndTrack(
    窗口,
    Dispatchers.Default.asExecutor(),
    jankFrameListener,
)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里的 Log.v() 调用是只是为了示例目的,实际情况下你可能会选择 聚合、存储或者上传数据以供以后分析,而不是仅仅将其发布到日志中。

以下是它在 API 30 模拟器上运行时产生的示例(为了清楚起见,删除了一些 logcat 并添加了空白行):

JankStats.OnFrameListener: FrameData(frameStartNanos=827233150542009, frameDurationUiNanos=27779985, frameDurationCpuNanos=31296985, isJank=false, states=[活动: JankLoggingActivity])JankStats.OnFrameListener: 

FrameData(frameStartNanos=827314067288736, frameDurationUiNanos=89903592, frameDurationCpuNanos=94582592, isJank=true, states=[RecyclerView: Dragging, Activity: JankLoggingActivity])JankStats.OnFrameListener: 

FrameData(frameStartNanos=827314167288732, frameDurationUiNanos=88641926, frameDurationCpuNanos=91526926, isJank=true, states=[RecyclerView: Settling, RecyclerView: Dragging, Activity: 

JankLoggingActivity])JankStats.OnFrameListener: FrameData(frameStartNanos=827314183945923, frameDurationUiNanos=4731405, frameDurationCpuNanos=8283405, isJank=false, states=[RecyclerView: Settling, Activity: JankLoggingActivity])

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

你可以在日志中看到 frameData 的一些有趣的内容:

  • 有一些框架带有 isJank=true , 该日志来自示例 App ,该 示例 App JankLoggingActivity 可以在 JankStatsSample查看,该应用程序会强制执行一些长帧(Thread.sleep()!),这会导致 JankStats 上报卡顿;

  • frame duration 信息带有 UI 和 CPU 数据,在 API 24(FrameMetrics )之前,只有 UI 持续时间;

  • 该日志是从我开始滑动 RecyclerView 时获取, 当 RecyclerView 开始移动(“Dragging”)和 RecyclerView 滚动(“Settling”)时,我们可以在开始之前看到关于 UI 的状态信息(仅列出状态)。

真实数据

与最近的基准测试库不同,创建 JankStats 是为了提供来自用户设备的数据,如果 App 仅仅是开发机器上调试得非常好,但这对于您的 App 被在其他不同的设备上、不同的约束条件下使用的情况无济于事。

JankStats 提供了一个 API 来检测 App 以提供需要的性能数据和报告,以便你可以获取该数据进行离线上传和分析。

心态

最后,JankStats 提供了一种方法来了解发生性能问题时 App 中实际发生的情况

我们经常听到的抱怨是:现有的工具、dashboards 和方法没有提供足够的 上下文 来解决用户可能遇到的性能问题。

例如,FrameMetrics API(在 API 24 中引入,并在 JankStats 内部使用)可以告诉你绘制帧需要多长时间,你可以从中获取 jank 信息,但它无法告诉你当时 App 中发生了什么。当你尝试检测代码并将其与 FrameMetrics 或其他性能测量工具集成时,这个问题需要开发者自己解决。但是其实每个人都有许多工作要做,而不是在内部构建这种基础架构,因此 jank 通常无法衡量仍然存在的性能问题。

同样,Android Vitals 可以告诉你 App 存在性能问题,但它无法告诉你当这些问题发生时,你的应用程序正在做什么。所以很难知道如何处理这些信息。

JankStats 引入了一组简单的 API,允许通过成对的 PerformanceMetricsState 随时告诉你 App 中发生了什么

例如你可能想要知道某个特定的 ActivityFragment 何时是否处于活动状态,或者RecyclerView 是否在滚动。

例如,下面是 JankStats 示例中的代码就展示了如何检测 RecyclerView 以向 JankStats 提供此信息:

val scrollListener = object : RecyclerView.OnScrollListener() { 
  override fun onScrollStateChanged(recyclerView: RecyclerView, 
                                    newState: Int) 
  { 
    val metricsState = metricsStateHolder?.state ?: return 
      when (newState) { 
        RecyclerView.SCROLL_STATE_DRAGGING -> { 
          metricsState.addState(" RecyclerView", "Dragging") 
        } 
        RecyclerView.SCROLL_STATE_SETTLING -> { 
          metricsState.addState("RecyclerView", "Settling") 
        } 
        else -> { 
          metricsState.removeState("RecyclerView") 
        } 
     } 
  } 
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这个状态可以从你的 App 的任何地方(甚至从另一个库)注入,它会在 JankStats 报告结果时获取

这样当你从 JankStats 获得报告时,不仅会可以知道每帧花费了多长时间,还可以发现用户在该帧期间做了什么。

资源

这里有一些资源供你更详细了解有关 JankStats 的更多信息:

  • AndroidX 项目JankStats 在 AndroidX 的 androidx.metrics 库中 。

  • 文档:开发者网站有一个新的开发者指南,描述了如何使用 JankStats

  • Demo:该 JankStatsSample 项目展示了如何实例化和侦听 JankStats 对象,以及如何使用 UI 状态信息来监测 App:

performance-samples: https://github.com/android/performance-samples/tree/main/JankStatsSample

错误、错误、错误:如果您对库有任何问题,或有 API 请求,请提交错误

Alpha -> 1.0

JankStats 刚刚发布了它的第一个 alpha 版, 未来我们还想用 JankStats 做其他事情,包括添加某种聚合机制,甚至与现有的上传服务同步。

但我们希望通过基本推出第一个版本,看看大家如何使用它以及还想看到什么,我们希望它在当前是有用的。

文章来源: carguo.blog.csdn.net,作者:恋猫de小郭,版权归原作者所有,如需转载,请联系作者。

原文链接:carguo.blog.csdn.net/article/details/122886425

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。