0

我是 Java 新手,这就是我认为 XPosed 的工作原理:

  1. 在zygote_init之前,钩住所有的api,插入xposed_before_xxx和xposed_after_xxx方法(其中xxx是api的名字)。
  2. 加载模块。加载钩子类,实现它并保存在zygote的内存中。对于每个注入方法,将其添加到 xposed_before/after_xxx 的私有列表中。
  3. 当一个新的应用程序加载(从 zygote 派生)时,它也派生了钩子类和钩子方法。
  4. 当应用调用 xxx 时,它实际上是先运行 xposed_before_xxx,而后者调用其私有列表中的每个注入方法。然后调用原始的api。然后调用 xposed_after_xxx,处理自己的列表。

因此,对于每个应用程序,从 zygote 分叉后的钩子类都是单独的。因此,静态成员不共享。因为每个钩子类在应用程序中只有一个实例,静态成员的行为与非静态成员相同。我对吗?

感谢您阅读我冗长而糟糕的英语...

4

1 回答 1

2

不,静态成员不跨进程共享。它们充当应用程序内的静态成员,而不是跨应用程序。

每个应用程序都在自己的 VM 上运行,因此进程之间不会共享任何内容。

这同样适用于 Xposed 挂钩,您可以为一个应用程序而不是其他应用程序挂钩一个静态方法。

即使您将模块设置为在所有应用程序上应用挂钩,这些挂钩也将是不同 VM 中的不同实例。

于 2015-06-19T11:49:23.193 回答