Есть ли условие для замены метода xposed replaceHookedMethod?

Я довольно новичок в разработке 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;
    }
};

Есть идеи / предложения? Заранее спасибо!

1 ответ

Решение

Вы можете просто достичь того, что вы хотите, используя XC_MethodHook а также beforeHookedMethod(..):

Исходный метод, который вы подключили, не будет выполнен, если вы вызовете param.setResult(..) или же param.setThrowable(..) в beforeHookedMethod(..),

Нетрудно догадаться, что они выполняются до / после оригинального метода. Вы можете использовать метод before перед тем, как оценивать / манипулировать параметрами вызова метода (через 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 и установить результат, если вы хотите заменить метод.

Другие вопросы по тегам