【问题标题】:Is there a condition for xposed method replacement replaceHookedMethod?xposed方法替换replaceHookedMethod有条件吗?
【发布时间】:2016-06-29 13:39:17
【问题描述】:

我对 xposed 开发还很陌生,我被困住了:

我挂钩一个方法,检查一些东西,然后我想决定是用return true; 替换它还是让它运行。但是我还没有找到设置条件来替换HookedMethod(..)

我知道我可以在 afterHookedMethod 或 beforeHookedMethod 中设置返回值,但这并不妨碍方法运行。

这是我的简短示例:

private static boolean flag;

...

findAndHookMethod(Activity.class, "onKeyDown", int.class, KeyEvent.class, new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
        //check some stuff here and set flag = true or flag = false
    }

    protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
        //this methode should only be called if the flag is true
        return true;
    }
};

有什么想法/建议吗? 提前致谢!

【问题讨论】:

    标签: java android xposed-framework xposed


    【解决方案1】:

    您可以使用XC_MethodHookbeforeHookedMethod(..) 轻松实现您想要的:

    如果你在beforeHookedMethod(..)中调用param.setResult(..)param.setThrowable(..),你原来hook的方法不会被执行。

    不难猜到在之前/之后执行 原始方法。您可以使用“之前”方法 评估/操作方法调用的参数(通过 param.args) 甚至阻止对原始方法的调用(发送您自己的 结果)。 https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

    我检查了XC_MethodReplacement 的源代码,它证实了我在此答案开头所做的陈述。它在内部扩展了 XC_methodHook 并使用以下实现:

        protected final void beforeHookedMethod(MethodHookParam param) throws Throwable {
            try {
                Object result = replaceHookedMethod(param);
                param.setResult(result);
            } catch (Throwable t) {
                param.setThrowable(t);
            }
        }
    

    因此,如果要替换方法,您可以简单地检查 beforeHookedMethod 中的条件并设置结果。

    【讨论】:

    • 感谢您的回答!我以为我可以使用 beforeHookedMethod(...) 来实现它,但是当我设置结果时它并没有覆盖挂钩的方法。但我想这是我实现的问题,因为它在我设置的另一个测试项目中工作
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多