Android应用测速组件实现原理,这篇看完还不懂跟我去摆地摊,全网首发
apply plugin: 'rabbit-tracer-transform'
为了支持网络监控功能,需要在OkHttpClient
初始化时插入拦截器(目前只支持OkHttp的网络监控):
OkHttpClient.Builder().addInterceptor(Rabbit.getApiTracerInterceptor())
后面会考虑把
Interceptor
的初始化做成AOP的方式。
除此之外Rabbit
的测速功能不需要其他的初始化代码,接下来就大概过一下上面功能的实现原理:
应用onCreate耗时统计
实现思路:
- 编译应用时在
Application.attachBaseContext()开始
和Application.onCreate()结束
方法中插入耗时统计代码。 - SDK收集测速数据,然后展示。
对于编译时的字节码插入本文就不做详细实现分析,具体实现可以参考
Rabbit
源码中的实现,最终插入效果如下:
public class CustomApplication extends Application {protected void attachBaseContext(Context base) {AppStartTracer.recordApplicationCreateStart();super.attachBaseContext(base);}public void onCreate() {super.onCreate();Rabbit.init(this);AppStartTracer.recordApplicationCreateEnd();}
}
页面渲染耗时统计
什么时候才算页面渲染完成呢?
Rabbit
定义Activity
的ContentView
绘制完成就是页面渲染完成,我们可以通过监听ViewGroup.dispatchDraw()
来监听Activity.ContentView
绘制完成。
具体实现思路是: 手动为Activity.setContentView()
设置的View添加一层自定义父View,用于计算绘制完成的时间
public class ActivitySpeedMonitor extends FrameLayout {@Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);RabbitTracerEventNotifier.eventNotifier.activityDrawFinish(getContext(), System.currentTimeMillis());}public static void wrapperViewOnActivityCreateEnd(Activity activity) {FrameLayout contentView = activity.findViewById(android.R.id.content);ViewGroup contentViewParent = (ViewGroup) contentView.getParent();if (contentView != null && contentViewParent != null) {ActivitySpeedMonitor newParent = new ActivitySpeedMonitor(contentView.getContext());if (contentView.getLayoutParams() != null) {newParent.setLayoutParams(contentView.getLayoutParams());}contentViewParent.removeView(contentView);newParent.addView(contentView);contentViewParent.addView(newParent);}}
}
上面ActivitySpeedMonitor.wrapperViewOnActivityCreateEnd()
代码会在编译时插入在Activity.onCreate
方法中:
public class TransformTestActivity extends AppCompatActivity {protected void onCreate(Bundle savedInstanceState) {ActivitySpeedMonitor.activityCreateStart(this);super.onCreate(savedInstanceState);this.setContentView(2131296286);ActivitySpeedMonitor.wrapperViewOnActivityCreateEnd(this);}}
Activity首次inflate耗时统计
我们知道ViewGroup.dispatchDraw()
方法在ViewTree
发生改变时就会调用,而一般第一次会导致dispatchDraw()
被调用代码是:
setContentView(R.layout.activity_transform_test);
因此Rabbit
将Activity
的第一dispatchDraw()
方法完成时间当做Activity首次Inflate
结束时间点。
其实这个时间的长短可以代表
Activity
的布局复杂度。
Activity首次渲染耗时
这个耗时统计的时间结束点为: 页面发起网络请求拿到数据,并完成页面渲染
举个例子,比如你的应用首页有3个接口,这3个接口的数据组成了整个首页的UI, 首页的渲染耗时就是3个接口完成请求,并且数据渲染完成。
Rabbit
中对页面的渲染耗时统计需要配置,即配置一个页面哪些接口完成才算页面渲染完成, 具体配置约定为在assest
文件夹下提供rabbit_speed_monitor.json
文件:
{"home_activity": "MainActivity", "page_list": [{"page": "MainActivity","api": ["xxx/api/getHomePageRecPosts","xxx/api/getAvailablePreRegistrations","xxxx/api/appHome"]}...]
}
home_activity
配置统计应用冷启动耗时。
page_list
配置需要统计渲染耗时的页面。
Rabbit
会在指定的所有接口都完成并且ViewGroup.dispatchDraw()
方法完成时记录下这个时间点来作为渲染耗时:
RabbitAppSpeedMonitor.java
fun activityDrawFinish(activity: Any, drawFinishTime: Long) {val apiStatus = pageApiStatusInfo[currentPageName]if (apiStatus != null) {if (apiStatus.allApiRequestFinish()) { //所有请求已经完成pageSpeedCanRecord = false //只统计一次### 写在最后今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套**腾讯、头条、阿里、美团等公司的面试题**,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含**知识脉络 + 诸多细节**,由于篇幅有限,这里以图片的形式给大家展示一部分。还有 **高级架构技术进阶脑图、Android开发面试专题资料**,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://codechina.csdn.net/m0_60958482/android_p7)****【Android核心高级技术PDF文档,BAT大厂面试真题解析】**![](https://img-blog.csdnimg.cn/img_convert/459e6e60de0a75728a8164cda74060e7.png)**【算法合集】**![](https://img-blog.csdnimg.cn/img_convert/ed8cd47abc8f7aa86f75da5bfb42f13b.png)**【延伸Android必备知识点】****【Android核心高级技术PDF文档,BAT大厂面试真题解析】**[外链图片转存中...(img-aq4Wtlwg-1631003901734)]**【算法合集】**[外链图片转存中...(img-vd44dJoz-1631003901736)]**【延伸Android必备知识点】**![](https://img-blog.csdnimg.cn/img_convert/9f676ecc970e26fe7871dc20e730bbd8.png)
Android应用测速组件实现原理,这篇看完还不懂跟我去摆地摊,全网首发相关推荐
- Android进阶必备:滑动冲突解决与事件分发机制(附视频讲解)这篇看完还不懂请寄刀片
1.前言 Android学习一段时间,需求做多了必然会遇到滑动冲突问题,比如在一个ScrollView中要嵌套一个地图View,这时候触摸移动地图或者放大缩小地图就会变得不太准确甚至没有反应,这就是遇 ...
- 面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘
本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘 JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Developme ...
- android webview测速,学习分享,echarts模拟宽带测速效果 附Demo演示地址!!
相信大家在平时的开发过程中经常会需要和图形图标打交道,最近接到一个需求,制作一个类似宽带测速的界面,要求使用仪表盘表示宽带下载速度,折线图表示上传速度并用柱状图跳动表示每一秒由客户端向各大媒体网站百度 ...
- 安卓wifi测速android,WiFi测速管家
WIFI测速管家是一款专业手机性能优化助手,集信号强度分析.无线网络测速.实时流量监控三大功能合一,是简单好用的高颜值工具产品. 软件介绍 专业手机性能优化助手! WiFi测速管家是一款集信号强度分析 ...
- 电脑测速软件_康佳电视免费看直播,如何安装第三方软件?2个方法值得收藏...
电视是每个家庭客厅娱乐的首选智能产品,每天吃完饭坐在沙发上看一下新闻.电视剧,或者通过电视高歌一曲,也不是不能满足,康佳作为电视的传统品牌之一,一直深受大众信赖,那么购买了康佳品牌的电视应该怎么看电视 ...
- 各种机械原理动态图,看完脑洞大开,绝对涨姿势!
全世界只有3.14 % 的人关注了 爆炸吧知识 1.钥匙开锁 2.撬锁 3.汽车换挡 4.手枪上膛发射 5.炮弹发射原理 6.手雷爆炸 7.洗衣机 8.缝纫机 9.心脏 10. 近视眼手术:原理其实很 ...
- 【JVM系列3】方法重载和方法重写原理分析,看完这篇终于彻底搞懂了
深入分析Java虚拟机中方法执行流程及方法重载和方法重写原理 前言 思考 栈帧 局部变量表(Local Variables) 操作数栈(Operand Stacks) 动态连接(Dynamic Lin ...
- Android 适配Dark Theme(暗黑模式),看完跪了
Force Dark自动适配 Android 10 提供 Force Dark 功能.此功能可让开发者快速实现深色主题背景,只需要在 style.xml 中的应用主题中添加这一行代码android:f ...
- Android程序员必备的六大顶级开发工具,快加入你的清单,看完没有不懂的
如果你认为B4A仅适用于对Android应用开发不太了解的新手,请再想一想.你可以用B4A做几乎所有用Java做的事情,加分项是它比Java快. ###LEAKCANARY LeakCanary帮助指 ...
最新文章
- 案例详解Python变量的作用域是怎么使用的,面试必学
- 利用python爬虫(案例2)--X凰的一天
- PPR data model
- android 设备名称_如何更改您的Android TV的设备名称
- OpenPBS 脚本
- 【Java】基于IDE的JUnit软件测试入门
- 字符串不替代_【数据挖掘】MySQL中的字符串数据类型
- IP 和子网掩码(干货)
- JFinal 源码导读第四天(3) initRender
- vue PC项目实现 支付宝支付(跳转至支付界面)
- CCF计算机职业资格认证考试资料 部分题目答案 题库
- Xshell“所选的用户密钥未在远程主机上注册”解决办法
- pt-osc在线重建表导致死锁的分析及对应的优化方案
- python11——随机点名
- 机顶盒抓包(无法连接WIFI的设备)
- vue3+ts实现todolist功能
- Springboot WEBOJ项目—— Nginx部署
- 队列练习之Example005-Q 是一个队列,S 是一个空栈,实现将队列中的元素逆置的算法
- TeXstudio编译提示缺少.sty文件
- C语言编程练习:用pow()函数实现求x的y次方的值
热门文章
- 游戏开发程序员可能会遇到的英文单词
- 【已解决】Activity MainActivity has leaked window PhoneWindow$DecorView@ that was originally added here
- 4.OC仿写知乎客户端
- 链改价值节点,构建区块链命运共同体
- 编译原理实验二-逆波兰式生成程序
- 【ubuntu】笔记本合上盖子不休眠
- html背景视频如何自动播放,使用视频作为网页背景的技术探讨
- 请回答数据结构【二叉搜索树】
- [FirefoxOS_开发环境]Linux和Ubuntu环境下B2G(Firefox OS)安装、编译、测试教程集合
- 利用计算机打开电视盒子,原来还可以把旧笔记本电脑当电视盒子用!