前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GT3.1 简化您的App性能测试(3)——原理讲解,溯本求源续

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

作者头像
腾讯移动品质中心TMQ
修改2018-03-20 16:36:36
9600
修改2018-03-20 16:36:36
举报

导读

在上一章的内容中,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

您还有什么好的建议,可以在下方给我们留言,感谢。

版权所属,禁止转载!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯移动品质中心TMQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档