Remove unused installer hook

This commit is contained in:
tehcneko 2021-01-29 11:51:40 +08:00
parent 3b7502ca5a
commit ed2e19339c
1 changed files with 5 additions and 124 deletions

View File

@ -1,33 +1,18 @@
package io.github.lsposed.lspd.hooker;
import android.app.AndroidAppHelper;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import io.github.lsposed.lspd.BuildConfig;
import io.github.lsposed.lspd.config.ConfigManager;
import io.github.lsposed.lspd.config.LSPdConfigGlobal;
import io.github.lsposed.lspd.core.EdxpImpl;
import io.github.lsposed.lspd.core.Main;
import io.github.lsposed.lspd.util.Utils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
public class XposedInstallerHooker {
public static void hookXposedInstaller(final ClassLoader classLoader) {
String variant_ = "None";
String variant_;
switch (Main.getEdxpVariant()) {
case EdxpImpl.YAHFA:
variant_ = "YAHFA";
@ -80,113 +65,9 @@ public class XposedInstallerHooker {
return ConfigManager.getBaseConfigPath() + "/";
}
});
Utils.logD("Hooked LSPosed Manager R");
return;
} catch (Throwable t) {
Utils.logW("Could not hook LSPosed Manager R", t);
}
// LSPosed Manager and Xposed Installer
try {
final String xposedAppClass = "de.robv.android.xposed.installer.XposedApp";
final Class<?> InstallZipUtil = XposedHelpers.findClass("de.robv.android.xposed.installer.util.InstallZipUtil", classLoader);
XposedHelpers.findAndHookMethod(xposedAppClass, classLoader, "getActiveXposedVersion",
XC_MethodReplacement.returnConstant(XposedBridge.getXposedVersion())
);
XposedHelpers.findAndHookMethod(xposedAppClass, classLoader,
"reloadXposedProp", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
Utils.logD("before reloadXposedProp...");
final String propFieldName = "mXposedProp";
final Object thisObject = param.thisObject;
if (thisObject == null) {
return;
}
if (XposedHelpers.getObjectField(thisObject, propFieldName) != null) {
param.setResult(null);
Utils.logD("reloadXposedProp already done, skip...");
return;
}
//version=92.0-$version ($backend)
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("version=");
stringBuilder.append(XposedBridge.getXposedVersion());
stringBuilder.append(".0-");
stringBuilder.append(BuildConfig.VERSION_NAME);
stringBuilder.append(" (");
String variant = "None";
stringBuilder.append(variant);
stringBuilder.append(")");
try (ByteArrayInputStream is = new ByteArrayInputStream(stringBuilder.toString().getBytes())) {
Object props = XposedHelpers.callStaticMethod(InstallZipUtil,
"parseXposedProp", is);
synchronized (thisObject) {
XposedHelpers.setObjectField(thisObject, propFieldName, props);
}
Utils.logD("reloadXposedProp done...");
param.setResult(null);
} catch (IOException e) {
Utils.logE("Could not reloadXposedProp", e);
}
}
});
} catch (Throwable t) {
Utils.logW("Could not hook Xposed Installer or LSPosed Manager", t);
return;
}
// LSPosed Manager
deoptMethod(classLoader, "io.github.lsposed.manager.ModulesFragment", "onActivityCreated", Bundle.class);
deoptMethod(classLoader, "io.github.lsposed.manager.ModulesFragment", "showMenu", Context.class, View.class, ApplicationInfo.class);
deoptMethod(classLoader, "io.github.lsposed.manager.StatusInstallerFragment", "onCreateView", LayoutInflater.class, ViewGroup.class, Bundle.class);
deoptMethod(classLoader, "io.github.lsposed.manager.util.ModuleUtil", "updateModulesList", boolean.class, View.class);
try {
XposedHelpers.findAndHookMethod("io.github.lsposed.manager.XposedApp", classLoader, "onCreate", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedHelpers.setStaticObjectField(param.thisObject.getClass(), "BASE_DIR", ConfigManager.getBaseConfigPath() + "/");
XposedHelpers.setStaticObjectField(param.thisObject.getClass(), "ENABLED_MODULES_LIST_FILE", ConfigManager.getConfigPath("enabled_modules.list"));
}
});
XposedHelpers.findAndHookMethod("io.github.lsposed.manager.util.ModuleUtil", classLoader, "updateModulesList", boolean.class, View.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
final Object thisObject = param.thisObject;
synchronized (thisObject) {
XposedHelpers.setStaticObjectField(param.thisObject.getClass(), "MODULES_LIST_FILE", ConfigManager.getConfigPath("modules.list"));
}
}
});
XposedHelpers.findAndHookMethod("io.github.lsposed.manager.StatusInstallerFragment", classLoader, "getCanonicalFile", File.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
File arg = (File) param.args[0];
if (arg.equals(new File(AndroidAppHelper.currentApplicationInfo().deviceProtectedDataDir))) {
param.args[0] = new File(ConfigManager.getBaseConfigPath());
}
}
});
Utils.logD("Hooked LSPosed Manager");
} catch (Throwable t) {
Utils.logD("Hooked Xposed Installer");
Utils.logW("Could not hook LSPosed Manager", t);
}
}
private static void deoptMethod(ClassLoader cl, String className, String methodName, Class<?>... params) {
try {
Class<?> clazz = XposedHelpers.findClassIfExists(className, cl);
if (clazz == null) {
Utils.logE("Class " + className + " not found when deoptimizing LSPosed Manager");
return;
}
Object method = XposedHelpers.findMethodExact(clazz, methodName, params);
LSPdConfigGlobal.getHookProvider().deoptMethodNative(method);
} catch (Throwable t) {
Utils.logE("Error when deoptimizing " + className + ":" + methodName, t);
}
}
}