我试图了解 Xposed 如何进行挂钩部分,它为用户提供了 API 以非常容易地挂钩任何方法。
我已经浏览了 Xposed Bridge 的源代码,该 jar 文件在每个进程启动时驻留在其中。我还发现他们正在使用 java 反射来获取类方法、参数等,以通过 JNI 将其传递给 Native 方法。
有一件事,我无法弄清楚 Xposed 如何挂钩进程并能够完全控制它。
我试图弄清楚挂钩发生在 XposedBridge jar 文件内的 Java 端,或者它发生在本机代码的 ART 级别。
我试图了解 Xposed 如何进行挂钩部分,它为用户提供了 API 以非常容易地挂钩任何方法。
我已经浏览了 Xposed Bridge 的源代码,该 jar 文件在每个进程启动时驻留在其中。我还发现他们正在使用 java 反射来获取类方法、参数等,以通过 JNI 将其传递给 Native 方法。
有一件事,我无法弄清楚 Xposed 如何挂钩进程并能够完全控制它。
我试图弄清楚挂钩发生在 XposedBridge jar 文件内的 Java 端,或者它发生在本机代码的 ART 级别。
好问题。XPosed 通过修改 app_process 文件来工作,该文件是 ART VM,之前是 Dalvik VM。
这个新修改的 ART/Dalvik VM 将加载 XPosedBridge.jar 文件以及在执行时已在系统中注册的所有 xposed 模块。现在,这只会发生一次,因为 Android 的工作方式是从头开始创建一个 Java VM(称为 Zygote),然后每次应用程序启动时,这个 VM 都会被分叉,以便新应用程序拥有自己的 VM。
此外,这个修改后的 ART/Dalvik VM 将在 Zygote 的 fork 函数之后添加一个回调,以允许它触发所有拦截 packageOnLoad 事件的 xposed 模块代码。
最后,为了允许它拦截单个类的方法,XposedBridge 中的 hookMethod 功能(这是您在创建 xposed 模块时使用的库)将修改 VM 中为您尝试挂钩的特定类,以便将您尝试挂钩的方法的方法指针重定向到新的替换方法。