Activity
首次inflate
耗时统计Activity
首次渲染耗时- 页面网络请求耗时监控
具体统计时机如下图:
最终输出的效果如下:
应用启动测速
页面启动测速
网络耗时测速
使用方法
整个测速组件实现的思路主要是:利用Gradle插件在应用编译时动态注入监控代码。因此使用时需要在应用的build.gradle
中应用插件:
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 {
@Override
protected 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()
方法完成时记录下这个时间点来作为渲染耗时:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/cd08e0b150713f617b52a155917bc3f7.jpeg)
写在最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
lr-1713248115694)]
【延伸Android必备知识点】
[外链图片转存中…(img-Ly11KV0j-1713248115695)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!