哎,这贴看下来真的觉得楼上太多人都对本地程序的开发没了解了
hook 这个词和翻译没关系,lz 明显没有做过原生类软件的开发,hook 不等于 callback,lz 搞错了这两者的区别了,所以对 hook 的理解有点偏差
HOOK 一般是用来形容软件开发中与 "截取" 有关的技术的词语。注意不是回调,而是截取,这里的截取尤其是指截取 API
比如在 Windows 下,你可以写个程序把自己的 dll 注入到目标进程中,这样每当目标程序调用系统的 API 或自己程序内部的函数的时候,你都可以直接截取到目标程序的 API 调用,你可以在程序调用 API 前随意修改传给系统的参数,也可以修改系统 API 返回给目标程序的数据。利用 HOOK 你可以在不修改目标程序的情况下,任意修改它的所有输入输出。这就叫 HOOK
Android 的 Xposed 框架就是个 HOOK 框架,可以不修改 app 任意 HOOK 安卓系统的 API,功能才如此强大
所以钩子这个词其实是非常形象且准确的,你把钩子扔进目标程序里(甚至直接扔到整个系统里都行),当对应的 API 被调用时候,就自动上钩了,上钩后执行你的程序,这就是“钩子”这个词的意思
框架里说的钩子同理,只不过框架的钩子是开发者事先就埋好的你可以随意调用。实现方式可能和回调很像,但并不等于回调
这个应该来源于设计模式中的模板模式和好莱坞准则,也就是上层定义一个未实现的方法(也就是钩子方法),留给下层实现,在需要的时候上层调用这个钩子方法
就好比二楼的住户在窗口放了一个篮子下楼,楼下的人把食物放到篮子上,当二楼的住户饿了就把篮子拉上去,如果不饿,那就在那放着。在这个比喻中,二楼就是上层实现,一楼是底层实现,篮子就是钩子方法,食物就是钩子的具体逻辑。低层组件将自己挂钩到系统上,高层组件决定什么时候和如何调用低层组件
"In computer programming, the term hooking covers a range of techniques used to alter or augment the behaviour of an operating system, of applications, or of other software components by intercepting function calls or messages or events passed between software components. Code that handles such intercepted function calls, events or messages is called a hook."