我试图了解Xposed如何处理挂钩部分,它为用户提供了一个非常容易挂钩任何方法的API。
我已经浏览了Xposed Bridge的源代码,这个jar文件在每个进程启动时驻留在每个进程中。 我还发现他们使用java反射来获取类方法,参数等,以通过JNI将它传递给Native方法。
有一点,我无法弄清楚Xposed如何挂钩进程并能够完全控制进程。
我试图找出挂钩发生在XposedBridge jar文件内的Java端,或者它发生在Native代码的ART级别。
答案 0 :(得分:1)
好问题。 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中的本机类结构。为您尝试挂钩的特定类定义,以便重定向您尝试挂钩到新替换方法的方法的方法指针。