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 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 {
|
||||
|
||||
private static final String BLACK_LIST_PATH = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/blacklist/";
|
||||
private static final String WHITE_LIST_PATH = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/whitelist/";
|
||||
private static final String COMPAT_LIST_PATH = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/compatlist/";
|
||||
private static final String USE_WHITE_LIST = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/usewhitelist";
|
||||
private static final String DYNAMIC_MODULES = XposedInit.INSTALLER_DATA_BASE_DIR + "conf/dynamicmodules";
|
||||
private static final String BLACK_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/blacklist/";
|
||||
private static final String WHITE_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/whitelist/";
|
||||
private static final String COMPAT_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/compatlist/";
|
||||
private static final String USE_WHITE_LIST = INSTALLER_DATA_BASE_DIR + "conf/usewhitelist";
|
||||
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 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 com.elderdrivers.riru.xposed.Main;
|
||||
import com.elderdrivers.riru.xposed.config.ConfigManager;
|
||||
import com.elderdrivers.riru.xposed.config.InstallerChooser;
|
||||
import com.elderdrivers.riru.xposed.core.HookMain;
|
||||
import com.elderdrivers.riru.xposed.entry.bootstrap.AppBootstrapHookInfo;
|
||||
import com.elderdrivers.riru.xposed.entry.bootstrap.SysBootstrapHookInfo;
|
||||
|
|
@ -21,6 +20,7 @@ public class Router {
|
|||
public static void prepare(boolean isSystem) {
|
||||
// this flag is needed when loadModules
|
||||
XposedInit.startsSystemServer = isSystem;
|
||||
InstallerChooser.setup();
|
||||
}
|
||||
|
||||
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.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.util.ClassLoaderUtils.replaceParentClassLoader;
|
||||
import static de.robv.android.xposed.XposedHelpers.getObjectField;
|
||||
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.logD;
|
||||
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.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 de.robv.android.xposed.XposedHelpers.findAndHookMethod;
|
||||
import static de.robv.android.xposed.XposedInit.INSTALLER_PACKAGE_NAME;
|
||||
|
||||
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.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.findAndHookMethod;
|
||||
import static de.robv.android.xposed.XposedHelpers.findClass;
|
||||
import static de.robv.android.xposed.XposedHelpers.getObjectField;
|
||||
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 static void hookXposedInstaller(ClassLoader classLoader) {
|
||||
try {
|
||||
final String xposedAppClass = INSTALLER_LEGACY_PACKAGE_NAME + ".XposedApp";
|
||||
final Class InstallZipUtil = findClass(INSTALLER_LEGACY_PACKAGE_NAME
|
||||
final String xposedAppClass = LEGACY_INSTALLER_PACKAGE_NAME + ".XposedApp";
|
||||
final Class InstallZipUtil = findClass(LEGACY_INSTALLER_PACKAGE_NAME
|
||||
+ ".util.InstallZipUtil", classLoader);
|
||||
findAndHookMethod(xposedAppClass, classLoader, "getActiveXposedVersion",
|
||||
XC_MethodReplacement.returnConstant(XposedBridge.getXposedVersion()));
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@ import dalvik.system.DexFile;
|
|||
import dalvik.system.PathClassLoader;
|
||||
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 de.robv.android.xposed.XposedHelpers.closeSilently;
|
||||
import static de.robv.android.xposed.XposedHelpers.findClass;
|
||||
|
|
@ -38,12 +40,6 @@ public final class XposedInit {
|
|||
public static boolean startsSystemServer = false;
|
||||
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";
|
||||
// TODO not supported yet
|
||||
private static boolean disableResources = true;
|
||||
|
|
|
|||
Loading…
Reference in New Issue