You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());
    }
};

关键说明

  1. 进程独立性:每个Android应用都是独立进程,TextView类会被每个进程的类加载器单独加载,必须在每个进程中执行Hook逻辑才能覆盖所有调用场景。
  2. 避免重复Hook:静态变量sInitialized在每个进程内只会初始化一次,不会重复Hook同一个类的方法。
  3. 性能优化:遍历所有方法会增加系统开销,建议直接Hook你实际需要拦截的目标方法,减少不必要的Hook操作。

内容的提问来源于stack exchange,提问作者itapi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:37:44