Hook技术浅析

1. 什么是 Hook(钩子)

    Android 操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步地向下执行。而Hook的作用就是在事件传输的过程中,截获事件,然后可以处理一些自己特定的事件。

        注意:

            1、Hook 的选择点:静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。

            2、 对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。而且最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 

            3、 钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。

2、使用Hook对点击事件做一些自定义处理

    想,现在有个需求,需要在所有点击事件的时候,打印一些我们需要的东西。

    那么,我们进入setOnClickListener的内部。

发现,我们设置的OnClickListener赋值给了getListenerInfo().mOnClickListener,ok我们继续去getListenerInfo()去看看

发现这里返回的是一个ListenerInfo对象。我们去ListenerInfo这个类里看看,找到了OnClickListener这个成员变量了。


不过我们去看看OnClickListener是个什么

好吧,就一个接口。在这整个流程中,ListenerInfo我们发现它是一个静态变量。ok,Hook点找到了

ok,这下子我们通过反射就可以来加载我们的逻辑了。

实现方式:

这下子我们就可以打印出这个日志了。然后我们给我们的Button的点击事件之后加载这个方法

然后我们会发现,toast打印出来了,日志也打出来了~

你可能感兴趣的:(Hook技术浅析)