From efe0869390aa9fdeeaa1a8cb43c1c34e53f46d85 Mon Sep 17 00:00:00 2001 From: Victor Tseng Date: Tue, 24 Mar 2020 00:35:44 +0800 Subject: [PATCH] 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... --- .../edxp/_hooker/impl/LoadedApkGetCL.java | 4 +- .../riru/edxp/config/BaseEdxpConfig.java | 16 ++++- .../riru/edxp/config/ConfigManager.java | 9 +-- .../riru/edxp/config/InstallerChooser.java | 61 ------------------- .../edxp/hooker/XposedInstallerHooker.java | 4 +- .../riru/edxp/util/FileUtils.java | 18 ++---- .../src/main/cpp/main/src/config_manager.cpp | 6 +- .../src/main/cpp/main/src/config_manager.h | 11 +--- .../cpp/main/src/jni/edxp_config_manager.cpp | 16 ++++- .../edxp/sandhook/core/SandHookEdxpImpl.java | 4 -- .../riru/edxp/whale/core/WhaleEdxpImpl.java | 5 -- .../riru/edxp/yahfa/core/YahfaEdxpImpl.java | 4 -- .../riru/edxp/config/EdxpConfig.java | 6 +- .../de/robv/android/xposed/XposedInit.java | 2 +- 14 files changed, 57 insertions(+), 109 deletions(-) delete mode 100644 edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/InstallerChooser.java diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkGetCL.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkGetCL.java index 870548ef..8e71b7c4 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkGetCL.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkGetCL.java @@ -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)) { diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java index 493b910e..7cc3f974 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java @@ -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 diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java index 4d456c16..389b1b43 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java @@ -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 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); } diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/InstallerChooser.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/InstallerChooser.java deleted file mode 100644 index bd0aa1e9..00000000 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/InstallerChooser.java +++ /dev/null @@ -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"); - } -} diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java index 617a2af4..0ae5f617 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java @@ -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"; diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/FileUtils.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/FileUtils.java index d7802db0..968f73bb 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/FileUtils.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/FileUtils.java @@ -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(); } } diff --git a/edxp-core/src/main/cpp/main/src/config_manager.cpp b/edxp-core/src/main/cpp/main/src/config_manager.cpp index 45085fc7..5baf2895 100644 --- a/edxp-core/src/main/cpp/main/src/config_manager.cpp +++ b/edxp-core/src/main/cpp/main/src/config_manager.cpp @@ -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; }; diff --git a/edxp-core/src/main/cpp/main/src/config_manager.h b/edxp-core/src/main/cpp/main/src/config_manager.h index 28a2f15c..3af359e0 100644 --- a/edxp-core/src/main/cpp/main/src/config_manager.h +++ b/edxp-core/src/main/cpp/main/src/config_manager.h @@ -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 diff --git a/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp b/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp index f3b5eddc..f9b91d3a 100644 --- a/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp +++ b/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp @@ -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"), }; diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookEdxpImpl.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookEdxpImpl.java index 4ec3f91a..5464a5a3 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookEdxpImpl.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookEdxpImpl.java @@ -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(); } } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java index 5f645b77..be000b0c 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java @@ -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(); } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/core/YahfaEdxpImpl.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/core/YahfaEdxpImpl.java index da225aa7..8a05b27d 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/core/YahfaEdxpImpl.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/core/YahfaEdxpImpl.java @@ -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(); } diff --git a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java index 15e82020..a2044e48 100644 --- a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java +++ b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java @@ -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(); diff --git a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java index 7ca6e40f..c763fb2e 100644 --- a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java +++ b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java @@ -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");