我挂接的是Android框架本身,而不是一个特定的应用程序,这是我的代码:
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (lpparam == null||lpparam.packageName == null || lpparam.processName == null)
return;
if (lpparam.packageName.equals("android")) {
XposedBridge.log("Hooked into Android framework.");
if (!sInitialized) {
sInitialized = true;
hookSetVisibility(lpparam);
}
}
}
private void hookSetVisibility(XC_LoadPackage.LoadPackageParam lpparam) {
final Class<?> mViewGroup = XposedHelpers.findClass("android.widget.TextView", lpparam.classLoader);
for (final Method method : mViewGroup.getDeclaredMethods()) {
if (true == Modifier.isAbstract(method.getModifiers())) {
XposedBridge.log("skip abstract:" + method.getName());
continue;
}
XposedBridge.log("----" + method.getName());
XposedBridge.hookMethod(method, methodHook);
}
}
final StringBuilder sb = new StringBuilder();
XC_MethodHook methodHook = new XC_MethodHook() {
@Override
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
XposedBridge.log("before hook log");
}
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
//param.setResult(false);
XposedBridge.log("after hook log");
}
};
这个模块确实很好地打印了所有类的方法名,就像在android framework中看到的那样,但是BeforeHookedMethod
和afterHookMethod
从来没有被调用过。
1条答案
按热度按时间qybjjes11#
你的主要问题是,你试图限制挂钩的“Android框架”只会失败,因为Android框架不是一个单独的进程,但包括在每个应用程序进程,分别
TextView
元素是应用程序进程的一部分,他们显示在。据我所知,
handleLoadPackage
在每个应用程序进程中被调用一次,这允许你决定是否要在这个特定的应用程序进程中挂钩一些东西。但是,由于您希望在任何应用程序中挂钩某个UI元素,因此不应在此处应用过滤器。所以最后你应该删除过滤器(或者只过滤掉那些让你的钩子出现问题的应用),然后直接调用
hookSetVisibility
。