Xposed - возвращает конструктор класса

Декомпилированный метод:

private static l c(String str, String str2, String str3, String str4) {
    l lVar;
    k kVar = (k) m.get(str);
    j jVar = (j) l.get(str);
    if (kVar != null) {
        lVar = new l(kVar, str2, str3);
    } else if (jVar != null) {
        lVar = new l(jVar, str2, str3);
    } else {
        lVar = new l(j.GENERIC, str2, str3);
    }
    lVar.a(str4);
    return lVar;
}

Как использовать Xposed для возврата нового l (jVar, str2, str3) с его конкретными значениями? Начало кода у меня есть:

    try {
        findAndHookMethod("com.xiaomi.hm.health.ui.smartplay.h", lpparam.classLoader, "c", String.class, String.class, String.class, String.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) {
                String pkg = (String) param.args[0];
                if (pkg == "com.perm.kate_new_6"){
                    return ???;
                }
            }
        });
    } catch (Throwable t) {
        t.printStackTrace();
    }

1 ответ

XC_MethodHook "s afterHookedMethod метод должен вернуть void. То есть, возвращение подключенного метода должно быть установлено с помощью метода setResult XC_MethodHook вместо.

Внутренне это устанавливает returnEarly в true который проверяется в XposedBridge, предотвращая выполнение исходного кода метода, а также любые другие хуки метода.

Если вы просто хотите получить доступ к тому, что метод первоначально собирался вернуть, тогда getResult() должен сделать.

Если вам нужно вернуть что-то еще, вы можете использовать отражение или помощники Xposed ( findClass), чтобы получить классы l, k и j, повторить код, если это необходимо, создать новый экземпляр и вернуть его через setResult, В качестве альтернативы вы можете использовать XC_MethodReplacement подключите вместо этого, так как вы, вероятно, в любом случае будете копировать его функциональность

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