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

导读

在上一章的内容中,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,获取更多测试干货!

你可能感兴趣的:(精准测试,专项测试)