Java 安卓系统中的钩子是如何暴露的

Java 安卓系统中的钩子是如何暴露的,java,android,java-native-interface,native-code,xposed,Java,Android,Java Native Interface,Native Code,Xposed,我试图理解Xposed是如何完成挂钩部分的,它为用户提供了API,让用户可以非常轻松地挂钩任何方法 我已经阅读了xposedbridge的源代码,它是一个jar文件,每当进程启动时,它都驻留在每个进程中。 我还发现他们正在使用java反射来获取类方法、参数等,以便通过JNI将其传递给本机方法 有一件事,我无法弄清楚的是,Xposed是如何连接进程并能够完全控制进程的 我试图弄清楚挂接是发生在xposedbridgejar文件的Java端,还是发生在本机代码的艺术级。好问题。XPosed通过修改a

我试图理解Xposed是如何完成挂钩部分的,它为用户提供了API,让用户可以非常轻松地挂钩任何方法

我已经阅读了xposedbridge的源代码,它是一个jar文件,每当进程启动时,它都驻留在每个进程中。 我还发现他们正在使用java反射来获取类方法、参数等,以便通过JNI将其传递给本机方法

有一件事,我无法弄清楚的是,Xposed是如何连接进程并能够完全控制进程的


我试图弄清楚挂接是发生在xposedbridgejar文件的Java端,还是发生在本机代码的艺术级。

好问题。XPosed通过修改app_进程文件来工作,该文件是ART-VM,以前是Dalvik-VM

这个新修改的ART/Dalvik虚拟机将加载XPosedBridge.jar文件以及执行时在系统中注册的所有xposed模块。现在,这种情况只发生一次,因为Android的工作方式是,有一个Java虚拟机是从头创建的(称为Zygote),然后每次应用程序启动时,这个虚拟机都会分叉,让新应用程序拥有自己的虚拟机

此外,这个修改过的ART/Dalvik VM将在Zygote的fork函数之后添加一个回调函数,以允许它触发拦截packageOnLoad事件的所有xposed模块代码

最后,为了允许它截取单个类的方法,XposedBridge中的hookMethod功能(创建xposed模块时使用的库)将修改VM中为要挂接的特定类定义的本机类结构,以便将要挂接的方法的方法指针重定向到新的替换方法