From f51e71d8588f62a5c0ff020aeb9c3829b2fe3bf1 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Tue, 15 Dec 2020 15:38:53 +0800 Subject: [PATCH] Remove confs of modules when uninstalled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "再改一下" --- .../riru/edxp/proxy/NormalProxy.java | 26 +++-------- .../src/main/cpp/main/src/config_manager.cpp | 10 +---- edxp-core/template_override/post-fs-data.sh | 2 +- .../riru/edxp/service/PackageReceiver.java | 45 +++++++++++++------ 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/NormalProxy.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/NormalProxy.java index c1bc257a..107778d9 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/NormalProxy.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/NormalProxy.java @@ -2,6 +2,7 @@ package com.elderdrivers.riru.edxp.proxy; import com.elderdrivers.riru.edxp.config.ConfigManager; import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter; +import com.elderdrivers.riru.edxp.util.Utils; import de.robv.android.xposed.SELinuxHelper; import de.robv.android.xposed.XposedInit; @@ -22,14 +23,6 @@ public class NormalProxy extends BaseProxy { } public void forkAndSpecializePost(int pid, String appDataDir, String niceName) { - SELinuxHelper.initOnce(); - mRouter.initResourcesHook(); - // call this to ensure the flag is set to false ASAP - mRouter.prepare(false); - PrebuiltMethodsDeopter.deoptBootMethods(); // do it once for secondary zygote - // install bootstrap hooks for secondary zygote - mRouter.installBootstrapHooks(false); - // TODO consider processes without forkAndSpecializePost being called forkPostCommon(pid, false, appDataDir, niceName); } @@ -38,27 +31,22 @@ public class NormalProxy extends BaseProxy { } public void forkSystemServerPost(int pid) { - SELinuxHelper.initOnce(); - mRouter.initResourcesHook(); - // set startsSystemServer flag used when loadModules - mRouter.prepare(true); - PrebuiltMethodsDeopter.deoptBootMethods(); // do it once for main zygote - // install bootstrap hooks for main zygote as early as possible - // in case we miss some processes not forked via forkAndSpecialize - // for instance com.android.phone - mRouter.installBootstrapHooks(true); - // in system_server process forkPostCommon(pid, true, getDataPathPrefix() + "android", "system_server"); } private void forkPostCommon(int pid, boolean isSystem, String appDataDir, String niceName) { + SELinuxHelper.initOnce(); + mRouter.initResourcesHook(); + mRouter.prepare(isSystem); + PrebuiltMethodsDeopter.deoptBootMethods(); // do it once for secondary zygote + mRouter.installBootstrapHooks(isSystem); ConfigManager.appDataDir = appDataDir; ConfigManager.niceName = niceName; XposedInit.prefsBasePath = ConfigManager.getPrefsPath(""); - mRouter.prepare(isSystem); mRouter.onEnterChildProcess(); + Utils.logI("Loading modules for " + niceName); mRouter.loadModulesSafely(true); } 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 c33c552f..2dfdd287 100644 --- a/edxp-core/src/main/cpp/main/src/config_manager.cpp +++ b/edxp-core/src/main/cpp/main/src/config_manager.cpp @@ -312,14 +312,8 @@ namespace edxp { fs::permissions(conf_path, fs::perms::owner_all | fs::perms::group_all); fs::permissions(log_path, fs::perms::owner_all | fs::perms::group_all); if (pkg_name == "android") uid = -1; - if (const auto &[r_uid, r_gid] = path_own(conf_path); - (uid != -1 && r_uid != uid) || r_gid != 1000u) { - path_chown(conf_path, uid, 1000u, true); - } - if (const auto &[r_uid, r_gid] = path_own(log_path); - (uid != -1 && r_uid != uid) || r_gid != 1000u) { - path_chown(log_path, uid, 1000u, true); - } + path_chown(conf_path, uid, 1000u, true); + path_chown(log_path, uid, 1000u, true); if (pkg_name == kPrimaryInstallerPkgName) { auto installer_pkg_name_path = GetConfigPath("installer"); diff --git a/edxp-core/template_override/post-fs-data.sh b/edxp-core/template_override/post-fs-data.sh index 041bb9ab..5b24c807 100644 --- a/edxp-core/template_override/post-fs-data.sh +++ b/edxp-core/template_override/post-fs-data.sh @@ -11,7 +11,7 @@ grep_prop() { MODDIR=${0%/*} RIRU_PATH="/data/adb/riru" -RIRU_PROP="/data/adb/modules/riru-core/module.prop" +RIRU_PROP="$(magisk --path)/.magisk/modules/riru-core/module.prop" TARGET="${RIRU_PATH}/modules" [[ "$(getenforce)" == "Enforcing" ]] && ENFORCE=true || ENFORCE=false diff --git a/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java b/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java index e179a3a4..2ff2ff29 100644 --- a/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java +++ b/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java @@ -81,14 +81,13 @@ public class PackageReceiver { File enabledModules = new File(CONFIG_PATH, uid + "/" + ENABLED_MODULES_LIST_FILENAME); if (!enabledModules.exists()) return result; Scanner scanner = new Scanner(enabledModules); - if (scanner.hasNextLine()) { + while (scanner.hasNextLine()) { String packageName = scanner.nextLine(); PackageInfo info = getPackageInfo(packageName); - if (info != null && isXposedModule(info.applicationInfo)) { + if (info != null && isXposedModule(info.applicationInfo)) result.put(packageName, info.applicationInfo.sourceDir); - } else { - Utils.logW(String.format("remove obsolete package %s", packageName)); - } + else if (info == null) + result.put(packageName, null); } } catch (Throwable e) { Utils.logE("Unable to read enabled modules", e); @@ -96,25 +95,43 @@ public class PackageReceiver { return result; } - private void updateModuleList(int uid, String packageName) { + private boolean updateModuleList(int uid, String packageName) { Map enabledModules = loadEnabledModules(uid); - if(packageName != null && !enabledModules.containsKey(packageName)) return; + if (!enabledModules.containsKey(packageName)) return false; try { File moduleListFile = new File(CONFIG_PATH, uid + "/" + MODULES_LIST_FILENAME); - moduleListFile.createNewFile(); + File enabledModuleListFile = new File(CONFIG_PATH, uid + "/" + ENABLED_MODULES_LIST_FILENAME); + if (moduleListFile.exists() && !moduleListFile.canWrite()) { + moduleListFile.delete(); + moduleListFile.createNewFile(); + } + if (enabledModuleListFile.exists() && !enabledModuleListFile.canWrite()) { + enabledModuleListFile.delete(); + enabledModuleListFile.createNewFile(); + } PrintWriter modulesList = new PrintWriter(moduleListFile); - PrintWriter enabledModulesList = new PrintWriter(new File(CONFIG_PATH, uid + "/" + ENABLED_MODULES_LIST_FILENAME)); + PrintWriter enabledModulesList = new PrintWriter(enabledModuleListFile); for (Map.Entry module : enabledModules.entrySet()) { - modulesList.println(module.getValue()); - enabledModulesList.println(module.getKey()); + String apkPath = module.getValue(); + if (apkPath != null) { + modulesList.println(module.getValue()); + enabledModulesList.println(module.getKey()); + } else { + Utils.logI(String.format("remove obsolete package %s", packageName)); + File prefsDir = new File(CONFIG_PATH, uid + "/prefs/" + packageName); + for (File childFile : prefsDir.listFiles()) { + childFile.delete(); + } + } } modulesList.close(); enabledModulesList.close(); } catch (Throwable e) { Utils.logE("Fail to update module list", e); } + return true; } @Override @@ -152,12 +169,14 @@ public class PackageReceiver { @SuppressLint("DiscouragedPrivateApi") Method m = UserManager.class.getDeclaredMethod("getUsers"); m.setAccessible(true); + boolean res = false; for (Object uh : (List) m.invoke(um)) { int uid = (int) uh.getClass().getDeclaredField("id").get(uh); Utils.logI("updating uid: " + uid); - updateModuleList(uid, pkgInfo == null ? null : packageName); + res = res || updateModuleList(uid, packageName); } - Toast.makeText(context, "EdXposed: Updated " + packageName, Toast.LENGTH_SHORT).show(); + if (res) + Toast.makeText(context, "EdXposed: Updated " + packageName, Toast.LENGTH_SHORT).show(); } catch (Throwable e) { Utils.logW("update failed", e); }