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
подключите вместо этого, так как вы, вероятно, в любом случае будете копировать его функциональность