作者:虫虫爸

团队:腾讯移动品质中心 TMQ

无奈

大家在做 Android 项目时,是否对以下一幕感到很熟悉?

正如上图所示,我们在版本发布前,一般都会做一些性能测试,其中会包含流畅度测试。然而即使在本地测试流畅度性能指标非常的好,但还是会有不少用户会反馈出现卡顿,这究竟是为啥呢?

有人曾诙谐的把发版前的测试数据比作汽车的 “官方油耗”。汽车官方油耗对用户其实没有多大指导意义,用户在实际驾驶汽车时的油耗往往高于官方油耗。同样的道理,用户使用时的情况往往会比测试结果差,主要有三方面原因。

第一,测试时使用的手机一般是在少量的机型上进行,线上用户的机器千差万别,所以测试数据覆盖不了所有用户机型。

第二,用户使用场景的环境复杂,各种因素影响较大。而测试的环境较稳定,影响因素较少。

第三,性能测试由于需要每个版本执行,往往是通过自动化测试来实施,那覆盖的场景一般是用户的主要场景,覆盖面较小。

因此,实验室环境的测试数据可以用作一个指标使用,但不能迷信这个数据。

线上用户的反馈更能反映产品的质量。

那么问题又来了,用户反馈是反映出了实际的情况,但也仅仅是说明产品质量有问题,对我们性能改善毫无用处。由于用户发生卡顿可能是在较偶然的场景,本次出现卡顿,下一次不一定能复现,当联系上用户时,他们往往又说不卡了。此外,用户反馈了问题,他们即使能很清楚的将问题描述出来,开发同事也很难定位和修复问题。

曙光

我们是否能通过线上的数据来解决用户的问题呢?

显然是可以的,不过在这之前需要解决以下问题:

这些问题在我们的方案中得到了较好的解决,该方案是结合穿山甲系统来实现的。

卡顿上报方案

我们的卡顿上报的思路如下图所示,我们希望在灰度阶段通过上报发生卡顿时的堆栈来定位和修复问题,并在下一个灰度期间验证问题的修复情况。

在数据上报前首先需要定义什么是卡顿,可能不同的项目组对卡顿定义是不一样的。

我们项目组将卡顿定义为当画面连续 n 毫秒出现丟帧,导致用户能感知到画面不流畅。这个 n 在穿山甲 SDK 初始化时设定,可以根据实际需要调整。该值越大卡顿上报条件越严苛,产品质量越低;该值越小则上报条件越低,产品质量越高。

目前我们项目组的 n 定为 100 毫秒,也就是说连续丢 6 帧会认为是出现卡顿。对卡顿的监控穿山甲 SDK 通过实现 FrameCallback 来实现监控。

以前在测试流畅度的时候,提供了帧率的数据给开发同事。大家可以想象一下当开发同事被告知他的代码存在卡顿,但得到的信息只是一个帧率数字时会是什么样的表情。

那提供什么数据才能让开发同事更加快速的定位和修复卡顿问题呢?

我们认为开发同事最希望告诉他们哪个位置的代码卡,甚至是具体的代码行,他们去修那段代码就行。鉴于此,穿山甲的方案采用了上报卡顿画面主线程堆栈的方法。既在发现屏幕连续丢帧时,将当时正在运行的代码的堆栈上报到服务器。

然而在项目实施时发现上报的卡顿日志很多,数量多达近 6 万个,如果让开发同事去一一确认显然是不可能的。为了提升卡顿问题的处理效率,穿山甲后台分析系统对上报的堆栈进行了以下的处理。

最后由于卡顿问题都是线上用户的设备上报的,卡顿问题修复后,通过本地测试是不好验证的。穿山甲的验证方法是看下一轮灰度上报的数据中,是否还存在已修复问题的堆栈来进行验证的。

系统页面展示

系统中对卡顿堆栈数据,经过分析后展示的画面如下面两个图所示。这两个页面主要展示了上报的卡顿堆栈的数量和上报机型数量,在详情页展示具体的卡顿堆栈信息。


在详情页下部还对上报卡顿的设备信息进行了简单分析,如下图所示。

除此之外,穿山甲的分析还有一个很独特的分析功能,就是用户操作路径分析。我们利用时间序列分析对卡顿发生前最近的 10 步的用户操作行为进行分析,可以知道用户发生卡顿时主要都做了什么操作,能让开发更加准确的定位出问题所在。用户操作的分析用操作的公共路径如下图所示。

前面也提到了卡顿问题的验证方法,我们验证问题是否修复有两个方面,首先不再上报被认为是完全修复了;另外如果上报率有下降,则认为有一定的优化,也算有进步,不过还需努力优化;如果上报率未减少甚至上升则认为问题没有修复。下图展示了问题验证的画面。

该方案的优点

本方案主要好处有以下四点:

成果

在我们项目组实施了卡顿上报方案后,效果还是非常明显的,借用一张开发同事的数据汇总列表如下,卡顿反馈数量下降约 70%。

未来

穿山甲系统的卡顿上报方案可以让线上卡顿的问题用类似于 Crash 上报的方式来解决,让卡顿的效率得到很大的提升,但穿山甲系统希望未来能更进一步。

目前我们正在做一件事,就是尝试从大量上报上来的卡顿堆栈中学习总结出引起卡顿的原因,形成经验库。再利用经验对开发的代码进行扫描,争取能在代码开发过程中就发现类似的卡顿问题,起到预防的作用,提升我们的生产效率。

关注微信公众号:腾讯移动品质中心 TMQ,获取更多测试干货!


↙↙↙阅读原文可查看相关链接,并与作者交流