解读AspectHook

当前环境 Xcode11.1 Demo: https://github.com/zColdWater/aspectDemo/tree/master

初衷

最新在看 iOS Hook 相关的一些东西,我寻思正好 我就好好看下,把一些常见的库的使用和原理做一个整理,方便以后自己看和其他人查看。

使用

如何使用 Aspect 库来实现 Hook 一些函数。

首先引入 Aspect 支持 Cocoapds 安装,添加 pod "Aspects" 即可。

这里需要说明的是 Aspect 维护了一个黑名单的方法是不允许 hook 的,名单如下: ["retain" "release" "autorelease" "forwardInvocation:"],这个名单下的方法是不允许 hook 的。

示例代码:

原理

说实话,我一开始是想看别人的原理解读,再来自己看原理的,后来发现,大部分文章太啰嗦,讲了一堆没有说核心部分,我想为了以后我自己再看不懵逼,也为了帮助别人去了解,我准备用图解的方式,直接了当的方式来表达核心实现原理。

这里我来阐明它能工作最核心的原理,其余一些逻辑我就不放在这里了,并且我会附上一个 Demo,在这里 Demo 中必要源码我基本都有注解。

未使用 Aspect Hook

这没啥说的正常结构,主要是下面使用 Aspect 后的结构。

使用 Aspect Hook

下图描述的是他的核心功能如何实现的,其实还包括很多铺垫,比如检查方法 hook 的 block 方法签名与被 hook 的方法签名能否兼容,参数类型等,还有一些吧,在我都看完的情况下,如果全部展开会让大家感觉很难看下去,因为文字组织确实需要一些功力的,否则后面自己看都费劲,所以就可核心的展示,剩下注释我都写在 Demo 中,有兴趣可以看下。

步骤 1.1 / 1.2:

步骤 2.1 / 2.2:

核心逻辑 ASPECTS_ARE_BEING_CALLED 方法

总结

希望可以通过图解的形式最直观的给大家展示 aspect 的实现原理,一些其他细节可以查看本篇文章 DemoDemo 中有对其他方法的详细注释。

最后更新于

这有帮助吗?