腾讯TMQGT3.1 简化您的App性能测试——原理讲解,溯本求源续
Posted 腾讯移动品质中心TMQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腾讯TMQGT3.1 简化您的App性能测试——原理讲解,溯本求源续相关的知识,希望对你有一定的参考价值。
导读
在上一章的内容中,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,获取更多测试干货!
以上是关于腾讯TMQGT3.1 简化您的App性能测试——原理讲解,溯本求源续的主要内容,如果未能解决你的问题,请参考以下文章
腾讯TMQGT3.1简化您的App性能测试——原理讲解,溯本求源