Xposed Hook设备所有TextView无回调:before/afterHookedMethod未触发
解决Xposed Hook系统框架TextView方法但回调不触发的问题
问题核心
你当前代码仅在packageName为android的系统框架进程里Hook了TextView的方法,但实际调用TextView方法的场景几乎都在各个应用进程中——这些进程的packageName并非android,导致你的Hook逻辑从未在方法执行的实际进程中生效,自然不会触发before/after回调。
解决方案
方案1:移除系统进程限制,Hook所有进程中的TextView
取消对lpparam.packageName.equals("android")的判断,让Hook逻辑在每个应用进程加载时执行,同时用进程内静态变量控制初始化,避免重复Hook:
private static boolean sInitialized = false; public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { if (lpparam == null||lpparam.packageName == null || lpparam.processName == null) return; XposedBridge.log("Hooked into process: " + lpparam.packageName); if (!sInitialized) { sInitialized = true; hookTextViewMethods(lpparam); } } private void hookTextViewMethods(XC_LoadPackage.LoadPackageParam lpparam) { final Class<?> textViewClass = XposedHelpers.findClass("android.widget.TextView", lpparam.classLoader); // 推荐直接Hook目标方法(比如setVisibility),避免遍历所有方法的性能损耗 try { Method setVisibilityMethod = textViewClass.getMethod("setVisibility", int.class); XposedBridge.hookMethod(setVisibilityMethod, methodHook); XposedBridge.log("Hooked setVisibility method"); } catch (NoSuchMethodException e) { XposedBridge.log("Failed to find setVisibility: " + e.getMessage()); } // 若确实需要Hook所有方法,保留以下代码(注意性能影响) /* for (final Method method : textViewClass.getDeclaredMethods()) { if (Modifier.isAbstract(method.getModifiers())) { XposedBridge.log("skip abstract:" + method.getName()); continue; } XposedBridge.log("----" + method.getName()); XposedBridge.hookMethod(method, methodHook); } */ } final XC_MethodHook methodHook = new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("before hook: " + param.method.getName()); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("after hook: " + param.method.getName()); } };
关键说明
- 进程独立性:每个Android应用都是独立进程,TextView类会被每个进程的类加载器单独加载,必须在每个进程中执行Hook逻辑才能覆盖所有调用场景。
- 避免重复Hook:静态变量
sInitialized在每个进程内只会初始化一次,不会重复Hook同一个类的方法。 - 性能优化:遍历所有方法会增加系统开销,建议直接Hook你实际需要拦截的目标方法,减少不必要的Hook操作。
内容的提问来源于stack exchange,提问作者itapi
相关产品推荐
相关产品推荐

