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:
Victor Tseng 2020-03-24 00:35:44 +08:00 committed by Jim Wu
parent 5446571664
commit efe0869390
14 changed files with 57 additions and 109 deletions

View File

@ -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)) {

View File

@ -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

View File

@ -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);
}

View File

@ -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");
}
}

View File

@ -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";

View File

@ -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();
}
}

View File

@ -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;
};

View File

@ -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

View File

@ -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"),
};

View File

@ -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();
}
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();

View File

@ -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");