BlockCanary源码分析

BlockCanary是一个Android性能监控组件,通过非侵入式的方式检测主线程卡慢问题。它利用Looper.loop中的logging机制,通过自定义Printer获取UI事件处理时间,当超过阈值时,捕获调用栈和CPU信息。本文分析了BlockCanary的安装、工作原理和关键代码,包括BlockCanary.install、LooperMonitor以及StackSampler和CpuSampler的实现。
摘要由CSDN通过智能技术生成

BlockCanary是一个Android平台的非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。(作者原述)

很敬佩作者能够写出这么高质量的代码,BlockCanary的代码设计简洁明了,结构清晰,从第一行代码install走下去,很快就能了解到整个框架的思路。去网上搜了下作者,发现作者12年毕业,自己很汗颜。
本文主要介绍BlockCanary的实现原理和源码设计。

项目地址

https://github.com/markzhai/AndroidPerformanceMonitor

设计思路

首先我们确定一个事实,所有的UI操作都要经过Looper和Handler的处理。如图所示。这里写图片描述
ActivityThread是个android私有类,在应用层无法直接访问(通过反射可以访问),Handler是一个应用层经常自定义的类。Looper是个公开类,而且被final修饰,所以无法被继承,这样就给了应用层分析的机会。下面是Looper.loop的代码:
这里写图片描述
从代码中可以看到,在dispatchMessage的前后,Looper都做了一次logging的判断,进行log的打印。非常幸运的是,android提供了一个公开的接口,允许各app自定义这个Printer。该接口是:
这里写图片描述
大家应该都知道主线程默认会生成一个Looper,这个Looper其实就是在ActivityThread中被创建的,在创建之后,也写了setMessageLogging的代码,只不过if(false)了。
这里写图片描述
BlockCanary的关键代码就在Looper. setMessageLogging上,通过注册自己的Printer,得到UI事件的开始处理时间和结束处理时间,若时间超过block阈值,则提取主线程的调用栈信息和cpu使用信息。

下图是作者绘制的流程图,非常明了的展示了BlockCanary的工作方式。一个额外注意的地方就是在dispatchMessage的同时,会执行一个计时器,如果超过了某个阈值,就会后台dump主线程的调用栈和cpu使用信息、内存使用信息。
这里写图片描述
接下来就开始代码分析吧。

源码分析

BlockCanary号称APP一行代码即可搞定。
这里写图片描述
就从BlockCanary.install这个方法开始吧。

BlockCanary.install

public static BlockCanary install(Context context, BlockCanaryContext blockCanaryContext) {
    BlockCanaryContext.init(context, blockCanaryContext);
    setEnabled(context, DisplayActivity.class, BlockCanaryContext.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值