use paths in native ConfigManager
instead of duplicating them all over native and managed space... there are many of them and most of them are quite inconsistent...
This commit is contained in:
parent
5446571664
commit
efe0869390
|
|
@ -2,6 +2,7 @@ package com.elderdrivers.riru.edxp._hooker.impl;
|
|||
|
||||
import android.app.LoadedApk;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.hooker.SliceProviderFix;
|
||||
import com.elderdrivers.riru.edxp.hooker.XposedInstallerHooker;
|
||||
import com.elderdrivers.riru.edxp.util.Hookers;
|
||||
|
|
@ -11,7 +12,6 @@ import de.robv.android.xposed.XposedBridge;
|
|||
import de.robv.android.xposed.XposedHelpers;
|
||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
||||
import static com.elderdrivers.riru.edxp.hooker.SliceProviderFix.SYSTEMUI_PACKAGE_NAME;
|
||||
|
||||
public class LoadedApkGetCL extends XC_MethodHook {
|
||||
|
|
@ -60,7 +60,7 @@ public class LoadedApkGetCL extends XC_MethodHook {
|
|||
lpparam.isFirstApplication = this.isFirstApplication;
|
||||
XC_LoadPackage.callAll(lpparam);
|
||||
|
||||
if (this.packageName.equals(INSTALLER_PACKAGE_NAME)) {
|
||||
if (this.packageName.equals(ConfigManager.getInstallerPackageName())) {
|
||||
XposedInstallerHooker.hookXposedInstaller(lpparam.classLoader);
|
||||
}
|
||||
if (this.packageName.equals(SYSTEMUI_PACKAGE_NAME)) {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,22 @@
|
|||
package com.elderdrivers.riru.edxp.config;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
public class BaseEdxpConfig implements EdxpConfig {
|
||||
|
||||
@Override
|
||||
public String getInstallerBaseDir() {
|
||||
return InstallerChooser.INSTALLER_DATA_BASE_DIR;
|
||||
public String getInstallerConfigPath(String suffix) {
|
||||
return ConfigManager.getInstallerConfigPath(suffix != null ? suffix : "");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDataPathPrefix() {
|
||||
return ConfigManager.getDataPathPrefix();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInstallerPackageName() {
|
||||
return ConfigManager.getInstallerPackageName();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -4,15 +4,12 @@ import java.util.HashMap;
|
|||
|
||||
import de.robv.android.xposed.SELinuxHelper;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.config.InstallerChooser.INSTALLER_DATA_BASE_DIR;
|
||||
|
||||
public class ConfigManager {
|
||||
|
||||
public static String appDataDir = "";
|
||||
public static String niceName = "";
|
||||
public static String appProcessName = "";
|
||||
|
||||
private static final String COMPAT_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/compatlist/";
|
||||
private static final HashMap<String, Boolean> compatModeCache = new HashMap<>();
|
||||
|
||||
public static boolean shouldUseCompatMode(String packageName) {
|
||||
|
|
@ -21,7 +18,7 @@ public class ConfigManager {
|
|||
&& (result = compatModeCache.get(packageName)) != null) {
|
||||
return result;
|
||||
}
|
||||
result = isFileExists(COMPAT_LIST_PATH + packageName);
|
||||
result = isFileExists(getInstallerConfigPath("compatlist/" + packageName));
|
||||
compatModeCache.put(packageName, result);
|
||||
return result;
|
||||
}
|
||||
|
|
@ -42,5 +39,9 @@ public class ConfigManager {
|
|||
|
||||
public static native String getInstallerPackageName();
|
||||
|
||||
public static native String getInstallerConfigPath(String suffix);
|
||||
|
||||
public static native String getDataPathPrefix();
|
||||
|
||||
public static native boolean isAppNeedHook(String appDataDir);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,61 +0,0 @@
|
|||
package com.elderdrivers.riru.edxp.config;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.os.Build;
|
||||
|
||||
import com.elderdrivers.riru.edxp.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);
|
||||
@SuppressLint("SdCardPath")
|
||||
private static final String DATA_DIR_PATH_PREFIX =
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? "/data/user_de/0/" : "/data/user/0/";
|
||||
|
||||
|
||||
public static final String PRIMARY_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;
|
||||
public static String INSTALLER_DATA_BASE_DIR;
|
||||
|
||||
public static void setInstallerPackageName(String packageName) {
|
||||
INSTALLER_PACKAGE_NAME = packageName;
|
||||
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 + 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");
|
||||
}
|
||||
}
|
||||
|
|
@ -11,10 +11,10 @@ import de.robv.android.xposed.XC_MethodReplacement;
|
|||
import de.robv.android.xposed.XposedBridge;
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.config.InstallerChooser.LEGACY_INSTALLER_PACKAGE_NAME;
|
||||
|
||||
public class XposedInstallerHooker {
|
||||
|
||||
private static final String LEGACY_INSTALLER_PACKAGE_NAME = "de.robv.android.xposed.installer";
|
||||
|
||||
public static void hookXposedInstaller(ClassLoader classLoader) {
|
||||
try {
|
||||
final String xposedAppClass = LEGACY_INSTALLER_PACKAGE_NAME + ".XposedApp";
|
||||
|
|
|
|||
|
|
@ -1,10 +1,9 @@
|
|||
package com.elderdrivers.riru.edxp.util;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.os.Build;
|
||||
import android.os.Process;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
|
|
@ -12,12 +11,8 @@ import java.io.FileReader;
|
|||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.ProcessUtils.PER_USER_RANGE;
|
||||
|
||||
public class FileUtils {
|
||||
|
||||
public static final boolean IS_USING_PROTECTED_STORAGE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
|
||||
|
||||
/**
|
||||
* Delete a file or a directory and its children.
|
||||
*
|
||||
|
|
@ -52,8 +47,9 @@ public class FileUtils {
|
|||
|
||||
public static void writeLine(File file, String line) {
|
||||
try {
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
file.createNewFile();
|
||||
} catch (IOException ex) {
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
|
||||
writer.write(line);
|
||||
|
|
@ -75,11 +71,7 @@ public class FileUtils {
|
|||
return dataDir.substring(lastIndex + 1);
|
||||
}
|
||||
|
||||
// FIXME: Although multi-users is considered here, but compat mode doesn't support other users' apps on Oreo and later yet.
|
||||
@SuppressLint("SdCardPath")
|
||||
public static String getDataPathPrefix() {
|
||||
int userId = Process.myUid() / PER_USER_RANGE;
|
||||
String format = IS_USING_PROTECTED_STORAGE ? "/data/user_de/%d/" : "/data/user/%d/";
|
||||
return String.format(format, userId);
|
||||
return ConfigManager.getDataPathPrefix();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -172,10 +172,14 @@ namespace edxp {
|
|||
return deopt_boot_image_enabled_;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE std::string ConfigManager::GetInstallerPkgName() const {
|
||||
ALWAYS_INLINE std::string ConfigManager::GetInstallerPackageName() const {
|
||||
return installer_pkg_name_;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE std::string ConfigManager::GetDataPathPrefix() const {
|
||||
return data_path_prefix_;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE std::string ConfigManager::GetConfigPath(const std::string &suffix) const {
|
||||
return data_path_prefix_ + installer_pkg_name_ + "/conf/" + suffix;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -22,16 +22,14 @@ namespace edxp {
|
|||
}
|
||||
|
||||
bool IsBlackWhiteListEnabled() const;
|
||||
|
||||
bool IsDynamicModulesEnabled() const;
|
||||
|
||||
bool IsResourcesHookEnabled() const;
|
||||
|
||||
bool IsDeoptBootImageEnabled() const;
|
||||
|
||||
bool IsNoModuleLogEnabled() const;
|
||||
|
||||
std::string GetInstallerPkgName() const;
|
||||
std::string GetInstallerPackageName() const;
|
||||
std::string GetDataPathPrefix() const;
|
||||
std::string GetConfigPath(const std::string &suffix) const;
|
||||
|
||||
bool IsAppNeedHook(const std::string &app_data_dir) const;
|
||||
|
||||
|
|
@ -64,10 +62,7 @@ namespace edxp {
|
|||
void SnapshotBlackWhiteList();
|
||||
|
||||
std::string RetrieveInstallerPkgName() const;
|
||||
|
||||
std::string GetConfigPath(const std::string &suffix) const;
|
||||
};
|
||||
|
||||
|
||||
} // namespace edxp
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,19 @@ namespace edxp {
|
|||
}
|
||||
|
||||
static jstring ConfigManager_getInstallerPackageName(JNI_START) {
|
||||
return env->NewStringUTF(ConfigManager::GetInstance()->GetInstallerPkgName().c_str());
|
||||
return env->NewStringUTF(ConfigManager::GetInstance()->GetInstallerPackageName().c_str());
|
||||
}
|
||||
|
||||
static jstring ConfigManager_getDataPathPrefix(JNI_START) {
|
||||
return env->NewStringUTF(ConfigManager::GetInstance()->GetDataPathPrefix().c_str());
|
||||
}
|
||||
|
||||
static jstring ConfigManager_getInstallerConfigPath(JNI_START, jstring jSuffix) {
|
||||
const char *suffix = env->GetStringUTFChars(jSuffix, JNI_FALSE);
|
||||
auto result = ConfigManager::GetInstance()->GetConfigPath(suffix);
|
||||
env->ReleaseStringUTFChars(jSuffix, suffix);
|
||||
return env->NewStringUTF(result.c_str());
|
||||
|
||||
}
|
||||
|
||||
static jboolean ConfigManager_isAppNeedHook(JNI_START, jstring appDataDir) {
|
||||
|
|
@ -44,6 +56,8 @@ namespace edxp {
|
|||
NATIVE_METHOD(ConfigManager, isDeoptBootImageEnabled, "()Z"),
|
||||
NATIVE_METHOD(ConfigManager, isNoModuleLogEnabled, "()Z"),
|
||||
NATIVE_METHOD(ConfigManager, getInstallerPackageName, "()Ljava/lang/String;"),
|
||||
NATIVE_METHOD(ConfigManager, getDataPathPrefix, "()Ljava/lang/String;"),
|
||||
NATIVE_METHOD(ConfigManager, getInstallerConfigPath, "(Ljava/lang/String;)Ljava/lang/String;"),
|
||||
NATIVE_METHOD(ConfigManager, isAppNeedHook, "(Ljava/lang/String;)Z"),
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@ package com.elderdrivers.riru.edxp.sandhook.core;
|
|||
|
||||
import android.os.Build;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.config.InstallerChooser;
|
||||
import com.elderdrivers.riru.edxp.core.BaseEdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.Main;
|
||||
|
|
@ -36,9 +34,7 @@ public class SandHookEdxpImpl extends BaseEdxpImpl {
|
|||
Yahfa.init(Build.VERSION.SDK_INT);
|
||||
HookMethodResolver.init();
|
||||
getRouter().injectConfig();
|
||||
InstallerChooser.setInstallerPackageName(ConfigManager.getInstallerPackageName());
|
||||
SandHookXposedBridge.init();
|
||||
|
||||
setInitialized();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,12 +2,9 @@ package com.elderdrivers.riru.edxp.whale.core;
|
|||
|
||||
import android.os.Build;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.config.InstallerChooser;
|
||||
import com.elderdrivers.riru.edxp.core.BaseEdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.Main;
|
||||
import com.elderdrivers.riru.edxp.core.Proxy;
|
||||
import com.elderdrivers.riru.edxp.core.Yahfa;
|
||||
import com.elderdrivers.riru.edxp.core.yahfa.HookMethodResolver;
|
||||
import com.elderdrivers.riru.edxp.proxy.Router;
|
||||
|
|
@ -36,8 +33,6 @@ public class WhaleEdxpImpl extends BaseEdxpImpl {
|
|||
Yahfa.init(Build.VERSION.SDK_INT);
|
||||
HookMethodResolver.init();
|
||||
getRouter().injectConfig();
|
||||
InstallerChooser.setInstallerPackageName(ConfigManager.getInstallerPackageName());
|
||||
|
||||
setInitialized();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@ package com.elderdrivers.riru.edxp.yahfa.core;
|
|||
|
||||
import android.os.Build;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.config.InstallerChooser;
|
||||
import com.elderdrivers.riru.edxp.core.BaseEdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.Main;
|
||||
|
|
@ -34,8 +32,6 @@ public class YahfaEdxpImpl extends BaseEdxpImpl {
|
|||
Yahfa.init(Build.VERSION.SDK_INT);
|
||||
HookMethodResolver.init();
|
||||
getRouter().injectConfig();
|
||||
InstallerChooser.setInstallerPackageName(ConfigManager.getInstallerPackageName());
|
||||
|
||||
setInitialized();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,11 @@ package com.elderdrivers.riru.edxp.config;
|
|||
|
||||
public interface EdxpConfig {
|
||||
|
||||
String getInstallerBaseDir();
|
||||
String getInstallerConfigPath(String suffix);
|
||||
|
||||
String getDataPathPrefix();
|
||||
|
||||
String getInstallerPackageName();
|
||||
|
||||
boolean isDynamicModulesMode();
|
||||
|
||||
|
|
|
|||
|
|
@ -312,7 +312,7 @@ public final class XposedInit {
|
|||
return false;
|
||||
}
|
||||
synchronized (moduleLoadLock) {
|
||||
final String filename = EdXpConfigGlobal.getConfig().getInstallerBaseDir() + "conf/modules.list";
|
||||
final String filename = EdXpConfigGlobal.getConfig().getInstallerConfigPath("modules.list");
|
||||
BaseService service = SELinuxHelper.getAppDataFileService();
|
||||
if (!service.checkFileExists(filename)) {
|
||||
Log.e(TAG, "Cannot load any modules because " + filename + " was not found");
|
||||
|
|
|
|||
Loading…
Reference in New Issue