Support EdXposed Manager and Xposed Installer.
Priority: EdXposed Installer > EdXposed Manager > Xposed Installer
This commit is contained in:
parent
56d8126202
commit
6eae86eb0f
|
|
@ -4,17 +4,17 @@ import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import de.robv.android.xposed.SELinuxHelper;
|
import de.robv.android.xposed.SELinuxHelper;
|
||||||
import de.robv.android.xposed.XposedInit;
|
|
||||||
|
|
||||||
import static de.robv.android.xposed.XposedInit.INSTALLER_PACKAGE_NAME;
|
import static com.elderdrivers.riru.xposed.config.InstallerChooser.INSTALLER_DATA_BASE_DIR;
|
||||||
|
import static com.elderdrivers.riru.xposed.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
||||||
|
|
||||||
public class ConfigManager {
|
public class ConfigManager {
|
||||||
|
|
||||||
private static final String BLACK_LIST_PATH = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/blacklist/";
|
private static final String BLACK_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/blacklist/";
|
||||||
private static final String WHITE_LIST_PATH = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/whitelist/";
|
private static final String WHITE_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/whitelist/";
|
||||||
private static final String COMPAT_LIST_PATH = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/compatlist/";
|
private static final String COMPAT_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/compatlist/";
|
||||||
private static final String USE_WHITE_LIST = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/usewhitelist";
|
private static final String USE_WHITE_LIST = INSTALLER_DATA_BASE_DIR + "conf/usewhitelist";
|
||||||
private static final String DYNAMIC_MODULES = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/dynamicmodules";
|
private static final String DYNAMIC_MODULES = INSTALLER_DATA_BASE_DIR + "conf/dynamicmodules";
|
||||||
private static final Set<String> WHITE_LIST = Collections.singleton(INSTALLER_PACKAGE_NAME);
|
private static final Set<String> WHITE_LIST = Collections.singleton(INSTALLER_PACKAGE_NAME);
|
||||||
private static final boolean IS_DYNAMIC_MODULES;
|
private static final boolean IS_DYNAMIC_MODULES;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
package com.elderdrivers.riru.xposed.config;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.os.Build;
|
||||||
|
|
||||||
|
import com.elderdrivers.riru.xposed.util.Utils;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.SELinuxHelper;
|
||||||
|
import de.robv.android.xposed.services.BaseService;
|
||||||
|
|
||||||
|
public class InstallerChooser {
|
||||||
|
|
||||||
|
private static final AtomicBoolean hasSet = new AtomicBoolean(false);
|
||||||
|
private static final String DATA_DIR_PATH_PREFIX =
|
||||||
|
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? "/data/user_de/0/" : "/data/data/";
|
||||||
|
|
||||||
|
|
||||||
|
public static final String PRIMARY_INSTALLER_PACKAGE_NAME = "com.solohsu.android.edxp.manager";
|
||||||
|
public static final String SECONDARY_INSTALLER_PACKAGE_NAME = "org.meowcat.edxposed.manager";
|
||||||
|
public static final String LEGACY_INSTALLER_PACKAGE_NAME = "de.robv.android.xposed.installer";
|
||||||
|
|
||||||
|
public static String INSTALLER_PACKAGE_NAME = PRIMARY_INSTALLER_PACKAGE_NAME;
|
||||||
|
@SuppressLint("SdCardPath")
|
||||||
|
public static String INSTALLER_DATA_BASE_DIR = DATA_DIR_PATH_PREFIX + INSTALLER_PACKAGE_NAME + "/";
|
||||||
|
|
||||||
|
|
||||||
|
public static void setup() {
|
||||||
|
if (!hasSet.compareAndSet(false, true)) {
|
||||||
|
// init once
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String dataBaseDir;
|
||||||
|
if (checkDataDirValid(dataBaseDir = DATA_DIR_PATH_PREFIX + PRIMARY_INSTALLER_PACKAGE_NAME + "/")) {
|
||||||
|
INSTALLER_PACKAGE_NAME = PRIMARY_INSTALLER_PACKAGE_NAME;
|
||||||
|
INSTALLER_DATA_BASE_DIR = dataBaseDir;
|
||||||
|
Utils.logI("using " + PRIMARY_INSTALLER_PACKAGE_NAME + "as installer app");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (checkDataDirValid(dataBaseDir = DATA_DIR_PATH_PREFIX + SECONDARY_INSTALLER_PACKAGE_NAME + "/")) {
|
||||||
|
INSTALLER_PACKAGE_NAME = SECONDARY_INSTALLER_PACKAGE_NAME;
|
||||||
|
INSTALLER_DATA_BASE_DIR = dataBaseDir;
|
||||||
|
Utils.logI("using " + SECONDARY_INSTALLER_PACKAGE_NAME + "as installer app");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (checkDataDirValid(dataBaseDir = DATA_DIR_PATH_PREFIX + LEGACY_INSTALLER_PACKAGE_NAME + "/")) {
|
||||||
|
INSTALLER_PACKAGE_NAME = LEGACY_INSTALLER_PACKAGE_NAME;
|
||||||
|
INSTALLER_DATA_BASE_DIR = dataBaseDir;
|
||||||
|
Utils.logI("using " + LEGACY_INSTALLER_PACKAGE_NAME + "as installer app");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Utils.logE("no supported installer app found");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For some reason checkFileExists(dirPath) is not reliable when forkSystemServerPre
|
||||||
|
*/
|
||||||
|
private static boolean checkDataDirValid(String dirPath) {
|
||||||
|
BaseService fileService = SELinuxHelper.getAppDataFileService();
|
||||||
|
return fileService.checkFileExists(dirPath + "code_cache")
|
||||||
|
|| fileService.checkFileExists(dirPath + "cache");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,8 +2,7 @@ package com.elderdrivers.riru.xposed.entry;
|
||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.elderdrivers.riru.xposed.Main;
|
import com.elderdrivers.riru.xposed.config.InstallerChooser;
|
||||||
import com.elderdrivers.riru.xposed.config.ConfigManager;
|
|
||||||
import com.elderdrivers.riru.xposed.core.HookMain;
|
import com.elderdrivers.riru.xposed.core.HookMain;
|
||||||
import com.elderdrivers.riru.xposed.entry.bootstrap.AppBootstrapHookInfo;
|
import com.elderdrivers.riru.xposed.entry.bootstrap.AppBootstrapHookInfo;
|
||||||
import com.elderdrivers.riru.xposed.entry.bootstrap.SysBootstrapHookInfo;
|
import com.elderdrivers.riru.xposed.entry.bootstrap.SysBootstrapHookInfo;
|
||||||
|
|
@ -21,6 +20,7 @@ public class Router {
|
||||||
public static void prepare(boolean isSystem) {
|
public static void prepare(boolean isSystem) {
|
||||||
// this flag is needed when loadModules
|
// this flag is needed when loadModules
|
||||||
XposedInit.startsSystemServer = isSystem;
|
XposedInit.startsSystemServer = isSystem;
|
||||||
|
InstallerChooser.setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkHookState(String appDataDir) {
|
public static void checkHookState(String appDataDir) {
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,11 @@ import com.elderdrivers.riru.xposed.util.Utils;
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
|
||||||
|
import static com.elderdrivers.riru.xposed.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
||||||
import static com.elderdrivers.riru.xposed.entry.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
import static com.elderdrivers.riru.xposed.entry.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
||||||
import static com.elderdrivers.riru.xposed.util.ClassLoaderUtils.replaceParentClassLoader;
|
import static com.elderdrivers.riru.xposed.util.ClassLoaderUtils.replaceParentClassLoader;
|
||||||
import static de.robv.android.xposed.XposedHelpers.getObjectField;
|
import static de.robv.android.xposed.XposedHelpers.getObjectField;
|
||||||
import static de.robv.android.xposed.XposedHelpers.setObjectField;
|
import static de.robv.android.xposed.XposedHelpers.setObjectField;
|
||||||
import static de.robv.android.xposed.XposedInit.INSTALLER_PACKAGE_NAME;
|
|
||||||
import static de.robv.android.xposed.XposedInit.loadedPackagesInProcess;
|
import static de.robv.android.xposed.XposedInit.loadedPackagesInProcess;
|
||||||
import static de.robv.android.xposed.XposedInit.logD;
|
import static de.robv.android.xposed.XposedInit.logD;
|
||||||
import static de.robv.android.xposed.XposedInit.logE;
|
import static de.robv.android.xposed.XposedInit.logE;
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,9 @@ import de.robv.android.xposed.XC_MethodHook;
|
||||||
import de.robv.android.xposed.XSharedPreferences;
|
import de.robv.android.xposed.XSharedPreferences;
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
||||||
|
import static com.elderdrivers.riru.xposed.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
||||||
import static com.elderdrivers.riru.xposed.util.FileUtils.IS_USING_PROTECTED_STORAGE;
|
import static com.elderdrivers.riru.xposed.util.FileUtils.IS_USING_PROTECTED_STORAGE;
|
||||||
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
|
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
|
||||||
import static de.robv.android.xposed.XposedInit.INSTALLER_PACKAGE_NAME;
|
|
||||||
|
|
||||||
public class XposedBlackListHooker {
|
public class XposedBlackListHooker {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,20 +10,19 @@ import de.robv.android.xposed.XC_MethodHook;
|
||||||
import de.robv.android.xposed.XC_MethodReplacement;
|
import de.robv.android.xposed.XC_MethodReplacement;
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
||||||
|
import static com.elderdrivers.riru.xposed.config.InstallerChooser.LEGACY_INSTALLER_PACKAGE_NAME;
|
||||||
import static de.robv.android.xposed.XposedHelpers.callStaticMethod;
|
import static de.robv.android.xposed.XposedHelpers.callStaticMethod;
|
||||||
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
|
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
|
||||||
import static de.robv.android.xposed.XposedHelpers.findClass;
|
import static de.robv.android.xposed.XposedHelpers.findClass;
|
||||||
import static de.robv.android.xposed.XposedHelpers.getObjectField;
|
import static de.robv.android.xposed.XposedHelpers.getObjectField;
|
||||||
import static de.robv.android.xposed.XposedHelpers.setObjectField;
|
import static de.robv.android.xposed.XposedHelpers.setObjectField;
|
||||||
import static de.robv.android.xposed.XposedInit.INSTALLER_LEGACY_PACKAGE_NAME;
|
|
||||||
import static de.robv.android.xposed.XposedInit.INSTALLER_PACKAGE_NAME;
|
|
||||||
|
|
||||||
public class XposedInstallerHooker {
|
public class XposedInstallerHooker {
|
||||||
|
|
||||||
public static void hookXposedInstaller(ClassLoader classLoader) {
|
public static void hookXposedInstaller(ClassLoader classLoader) {
|
||||||
try {
|
try {
|
||||||
final String xposedAppClass = INSTALLER_LEGACY_PACKAGE_NAME + ".XposedApp";
|
final String xposedAppClass = LEGACY_INSTALLER_PACKAGE_NAME + ".XposedApp";
|
||||||
final Class InstallZipUtil = findClass(INSTALLER_LEGACY_PACKAGE_NAME
|
final Class InstallZipUtil = findClass(LEGACY_INSTALLER_PACKAGE_NAME
|
||||||
+ ".util.InstallZipUtil", classLoader);
|
+ ".util.InstallZipUtil", classLoader);
|
||||||
findAndHookMethod(xposedAppClass, classLoader, "getActiveXposedVersion",
|
findAndHookMethod(xposedAppClass, classLoader, "getActiveXposedVersion",
|
||||||
XC_MethodReplacement.returnConstant(XposedBridge.getXposedVersion()));
|
XC_MethodReplacement.returnConstant(XposedBridge.getXposedVersion()));
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@ import dalvik.system.DexFile;
|
||||||
import dalvik.system.PathClassLoader;
|
import dalvik.system.PathClassLoader;
|
||||||
import de.robv.android.xposed.services.BaseService;
|
import de.robv.android.xposed.services.BaseService;
|
||||||
|
|
||||||
|
import static com.elderdrivers.riru.xposed.config.InstallerChooser.INSTALLER_DATA_BASE_DIR;
|
||||||
|
import static com.elderdrivers.riru.xposed.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
||||||
import static com.elderdrivers.riru.xposed.entry.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
import static com.elderdrivers.riru.xposed.entry.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
||||||
import static de.robv.android.xposed.XposedHelpers.closeSilently;
|
import static de.robv.android.xposed.XposedHelpers.closeSilently;
|
||||||
import static de.robv.android.xposed.XposedHelpers.findClass;
|
import static de.robv.android.xposed.XposedHelpers.findClass;
|
||||||
|
|
@ -38,12 +40,6 @@ public final class XposedInit {
|
||||||
public static boolean startsSystemServer = false;
|
public static boolean startsSystemServer = false;
|
||||||
private static final String startClassName = ""; // ed: no support for tool process anymore
|
private static final String startClassName = ""; // ed: no support for tool process anymore
|
||||||
|
|
||||||
public static final String INSTALLER_PACKAGE_NAME = "com.solohsu.android.edxp.manager";
|
|
||||||
public static final String INSTALLER_LEGACY_PACKAGE_NAME = "de.robv.android.xposed.installer";
|
|
||||||
@SuppressLint("SdCardPath")
|
|
||||||
public static final String INSTALLER_DATA_BASE_DIR = Build.VERSION.SDK_INT >= 24
|
|
||||||
? "/data/user_de/0/" + INSTALLER_PACKAGE_NAME + "/"
|
|
||||||
: "/data/data/" + INSTALLER_PACKAGE_NAME + "/";
|
|
||||||
private static final String INSTANT_RUN_CLASS = "com.android.tools.fd.runtime.BootstrapApplication";
|
private static final String INSTANT_RUN_CLASS = "com.android.tools.fd.runtime.BootstrapApplication";
|
||||||
// TODO not supported yet
|
// TODO not supported yet
|
||||||
private static boolean disableResources = true;
|
private static boolean disableResources = true;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue