Android IO监控 | 性能监控系列

背景

公司的一款app最近在上架厂商的过程中,被对方指出了IO读写过于频繁,然后不给上架。但是IO读写的操作非常零散,而且很多第三方框架内都会有写入操作,所以就变得非常难以监控和修改,有没有一种非常简单的方式可以帮助我们去定位这个问题呢?

之后我参考了下腾讯的MatrixIOCanary监控组件,其原理是通过hook(ELF hook)的机制,hook 了 IO的读取/写入的操作,然后打印出调用堆栈,从而帮助开发同学定位问题。

一般来说,一套Apm(Application Performance Monitor)系统是要分成多个部分的,比如开发阶段工具,测试阶段工具以及线上收集数据等等。而IO监控则是其中的开发测试阶段工具。

IOCanary 原理分析

在开始接介绍IOCanary之前,我们要先介绍一些奇怪的黑科技,通过这些东西我们才能完成IO监控系统,而且能讲明白到底IOCanary是如何实现的。

动态Hook

提到这个的话,大家可能以为我要写什么Aop切片啥的。但是不好意思你猜错了,还有很多别的手段可以去做无插入式的Hook代码调用的操作的。Aop切片毕竟还是要做字节码修改操作,同时作为一个调试工具的话,的确是有点太复杂了。

简单的介绍下动态Hook,我们可以通过Art虚拟机的机制,在一个方法调用的前后进行钩子操作,然后进行我们所需要的一些动态的监控的操作,已达到我们对于代码的动态监控能力。由于Hook在的是虚拟机层面,所以能监控的就不仅仅只是我们自己的代码,所有第三方库甚至源代码的调用都可以进行Hook。

比如Xposed,但是这套框架依赖于手机的Root。另外Epic也可以做到在安卓上的动态Hook, ,而听说腾讯的IOCanary则是参考了爱奇艺的xHook的原理。

从上面讲述的ART方法调用原理可以得到一种很自然的Hook办法————直接替换entrypoint。通过把原方法对应的ArtMethod对象的entrypoint替换为目标方法的entrypoint,可以使得原方法被调用过程中取entrypoint的时候拿到的是目标方法的entry,进而直接跳转到目标方法的code段;从而达到Hook的目的。

上述是对Epic的介绍啊,有兴趣的可以直接看下这篇文章。我为Dexposed续一秒——论ART上运行时 Method AOP实现。这篇文章是作者自己分享的,有对其中的原理进行了一次介绍,但是这部分我并没有看懂。作为一个菜逼Android,我还是采取了OOP思想,毕竟这方面门槛太高了,而我则是能用就行了(手动狗头保命)。

IOCanary监控

监控IO是不是意味着只需要有方法能监控到文件的写入读取流就可以了呢?我们先简单的看下腾讯的Matrix的IOCanary是如何实现的。

采用 hook(ELF hook) 的方案收集IO信息,代码无侵入,从而使得开发者可以无感知接入。方案主要通过 hook os posix 的四个关键的文件操作接口:

int open(const char *pathname, int flags, mode_t mode);//成功时返回值就是fd
ssize_t read(int fd, void *buf, size_t size);
ssize_t write(int fd, const void *buf, size_t size);
int close(int fd);

以上看到,通过 hook 这几个接口,可以拿到大部分关键操作信息。这里举 open 的例子介绍下原理,简单起见,只结合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值