在Android世界中,有两个流行的注入/劫持/钩子框架:Xposed和Android Substrate。Xposed的机制在一个开发教程中有描述。Android Substrate的作者在FAQ中比较了这两个框架,并在此处进行了比较,但他没有说它是如何工作的。我只是想知道:Android Substrate是如何工作的?
在这篇文章中,Jay Freeman(Saurik)(http://www.cydiasubstrate.com/id/34058d37-3198-414f-a696-73e97e0a80db/)讨论了Xposed和Substrate的区别,以及它们在工作方式上的差异。这是一篇很棒的阅读材料。
尽管这两个框架之间存在许多相似之处,但钩取进程的实际实现有所不同,因此您可以同时运行这两个框架。然而,我认为 Substrate 相对于 XPosed 的最大优势在于 XPosed 删除了 Java 安全模型,而 Substrate 则保留了它,并且具有等待类加载完成后再挂钩方法的能力,正如 @xmllmx 在关于“正交性”的回答中所描述的一样。为了让这变得更加容易,Xposed 提供了一组常见用例的助手:你可以在 VM 启动时、Zygote 接管时、特定包被加载时或命令行应用程序执行时挂钩。你需要知道其中哪个要使用,但仍不清楚如何挂钩通过动态运行时创建的类加载器加载的类(例如针对下载代码)。相比之下,Substrate 则摒弃了所有这些东西,因为它提供了 MS.hookClassLoad API,允许您等待任何时间从任何类加载器中加载特定类。这使您能够以较少受到更改的方式编写挂钩,比较少出现简单错误,并且不受目标应用程序的开发者决定如何加载其程序代码的限制。总之,在我看来,这两个框架非常相似,并且都是实现同一目标的可行选择。唯一重要的衡量因素是它们发布之间的时间跨度。XPosed已经存在了很长时间,并经过了试验和测试,在XPosed发布和Cydia Substrate for Android发布之间的中间时间内得到了验证。Jay Freeman(Saurik)公开承认这一点。尽管如此,Cydia Substrate是XPosed的一个强大而极具可行性的替代品。此外,您不必仅限于为其中一个框架开发,因为(如先前提到的)这两个框架可以在设备上安装而不会产生冲突,因此为两者开发或仅尝试均不会妨碍您使用当前安装的XPosed模块、包或扩展程序。