Android JankStats 发布 Alpha 版本啦
原文链接: https://medium.com/androiddevelopers/jankstats-goes-alpha-8aff942255d5
Jank
一般指的是糟糕的应用性能,可能会导致丢失帧、不连续的 UI 动画和糟糕的用户体验等等。
调试性能问题一直以来都很难, 主要是不清楚从哪里开始,要使用什么工具,用户遇到什么问题,或者说这些问题如何在用户的设备上体现出来。
Android 团队在过去几年中提供了很多的工具来调试各种开发中的问题:
- 从分析 startup performance 到测试specific code paths;
- 测试和优化特定用例的 macrobenchmark-intro;
- IDE 中的可视化分析器;
所有这些都可以用于开发时的测试,帮助调试和修复在本地运行时看到的问题,同时 Google Play 的 Android Vitals 和 Firebase 都提供 dashboards
,开发人员可以在其中查看他们的应用在用户设备上的运行情况。
但是这样仍然很难知道应用在实际情况中可能存在的问题,尤其是在用户设备上发生的问题,dashboards
会有所帮助,但它们不一定可以满足用户在遇到问题时,你想知道的发生了什么情况的详细程度。
所以 JankStats
来了:第一个专门用于检测和报告应用在用户设备上的性能问题而构建的 AndroidX 库。
JankStats
是一个相对较轻的库,主要有三个目标:
- 捕获每帧性能信息;
- 可以运行在用户设备上;
- 在应用程序出现性能问题时启用检测和报告发生的情况;
每帧性能
Android 平台其实已经提供过获取帧性能数据的方法。例如可以从 API 24
开始使用 FrameMetrics
, 如果在早期版本上运行时,也有多种方法可以获得相对应的信息,但是不太准确。
因此,如果想让自己的 frame-duration
逻辑适用于所有版本,则需要在不同 API 版本中实现这些机,但是现在你可以使用统一的 JankStats
API,它会为你完成这件事,还可以提供更多的功能。
JankStats
通过提供统一的 API 来报告 per-frame durations
,并在内部通过适当的机制(FrameMetrics
在 API 24+ 等)来简化这一点,这里你不必关心这些数据来自哪里,只需让 JankStats
告诉你事件花费了多长时间,然后你就会在回调里收到对应的信息。
创建和侦听 JankStat
s 数据本质上很简单:创建它,然后坐下来(好吧,是你的代码坐下来)并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 ,该 示例 AppJankLoggingActivity
可以在 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 中发生了什么。
例如你可能想要知道某个特定的
Activity
或Fragment
何时是否处于活动状态,或者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
- 点赞
- 收藏
- 关注作者
评论(0)