性能测试工具 [腾讯 TMQ] GT3.1 简化您的 App 性能测试 (3)——原理讲解,溯本求源续

匿名 · 2018年03月15日 · 最后由 子非鱼 回复于 2018年06月05日 · 1366 次阅读

导读

在上一章的内容中,GT 君为大家介绍了 CPU、内存、流量、流畅度等不同维度检测的实现原理。在本章中 GT 君将继续从页面启动时长维度、布局的构建与绘制维度、数据库操作维度为大家讲解这些功能的作用和实现原理。

1 页面启动时长检测

1.1 页面启动时长

Activity 启动时长就是唤醒 Activityy 到 Activity 在前台进行第一次绘制的时间,配合 “绘帧检测” 中定位的掉帧区间,可以直观的展示卡顿问题。
Fragment 启动时长就是唤醒 Fragment 到 Fragment 执行 onResume 的完成时间。

1.2 实现原理

对 Activity 和 Fragment 生命周期的监控: Android 4.0 以上的版本可以利用 ActivityLifecycleCallbacks 来实现对生命周期的监听,但此方法无法得到每个生命周期函数的执行时长。因此我们采用 Hook 的方式来监控 Activity 和 Fragment 的生命周期,这里介绍一下最佳 Hook 节点:

Activity 最佳 Hook 节点:

Fragment 最佳 Hook 节点:

关于数据的整理:我们都知道,页面分为冷启动和热启动(页面从 startActivity 开始则是冷启动,如果从 onStart 或 onResume 开始,则是热启动),我们可以维护一个页面列表 pageList,然后通过 hashCode 和生命周期函数的执行时间来归类数据,并可以对页面的冷热启动进行分析。

页面开始启动我们知道了,那么什么时候才算是页面启动结束呢?

事实上页面从开始到绘制完第一帧的这个时间,既是页面从启动开始到结束的所有时间。而对 View 绘制的监控,只需要 Hook ViewGroup 的 dispatchDraw 方法即可。

但由于 ViewGroup 的执行是递归的,所以我们发明了一种递归压栈归类法(将当前绘制节点进行压栈和弹栈操作),而且通过最大栈深可以得知 View 的绘制深度。

直到 dispatchDraw 的栈深弹光,就说明一次绘制完成了。

2 布局检测

2.1 View 构建时长

View 构建是通过调用 Inflate 函数实现的,setContentView 的原理也是通过 Inflate 函数构建 View,这里介绍一下最佳 Hook 节点:

Hook 数据的结果:

2.2 View 绘制深度

通过我们上文提到的递归压栈归类法(将当前绘制节点进行压栈和弹栈操作),而且通过最大栈深就可以得知 View 的绘制深度:

其次是将 viewDraw 信息匹配给 Activity:

3 DB 检测

对于数据库的检测方面,Hook 的关键函数为 android.database.sqlite.SQLiteDatabase 包下的方法:

DB 检测分析截图如下:

结语

文章至此,GT3.1 版本的大部分更新的功能及原理已经介绍完毕。总而言之,新版本的 GT 在测试移动应用的维度方面更加全面,统计分析的数据专业可靠,能够让大家完全了解自己的应用,锁定优化范围,进一步提升效率。在之后的版本更新中,我们团队也将尽力为大家带来更好更便利的更新。

全文终!

项目开源地址:
https://github.com/Tencent/GT

版权所属,禁止转载!

扫描下方二维码,关注微信公众号:腾讯移动品质中心 TMQ,获取更多测试干货!

共收到 1 条回复 时间 点赞

响应时间的这种方案,对于有跑马灯效果或者游戏不适用吧

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册