From b5aff15919cbbddab7e6927e2e7d06e8c4a61802 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 14 Apr 2022 16:51:24 +0800 Subject: [PATCH] Skip duplicate scopes for module process (#1845) Fix #1844 --- .../org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java | 10 +++++----- .../java/org/lsposed/lspd/service/ConfigManager.java | 4 +++- external/lsplant | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java index 949155da..05df199d 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java @@ -40,7 +40,6 @@ import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class LoadedApkGetCLHooker extends XC_MethodHook { - private final LoadedApk loadedApk; private final String packageName; private final String processName; @@ -64,7 +63,7 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { } try { - Hookers.logD("LoadedApk#getClassLoader starts"); + Hookers.logD("LoadedApk#getClassLoader starts: isFirst=" + isFirstApplication); Object mAppDir = XposedHelpers.getObjectField(loadedApk, "mAppDir"); ClassLoader classLoader = (ClassLoader) param.getResult(); @@ -76,11 +75,11 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam( XposedBridge.sLoadedPackageCallbacks); - lpparam.packageName = this.packageName; - lpparam.processName = this.processName; + lpparam.packageName = packageName; + lpparam.processName = processName; lpparam.classLoader = classLoader; lpparam.appInfo = loadedApk.getApplicationInfo(); - lpparam.isFirstApplication = this.isFirstApplication; + lpparam.isFirstApplication = isFirstApplication; IBinder moduleBinder = serviceClient.requestModuleBinder(lpparam.packageName); if (moduleBinder != null) { @@ -94,6 +93,7 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { } finally { if (unhook != null) { unhook.unhook(); + unhook = null; } } } diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java index bd04598b..ca6ae22f 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -604,6 +604,7 @@ public class ConfigManager { continue; } var module = cachedModule.get(modulePackageName); + assert module != null; for (ProcessScope processScope : processesScope) { cachedScope.computeIfAbsent(processScope, ignored -> new LinkedList<>()).add(module); @@ -612,6 +613,7 @@ public class ConfigManager { var appId = processScope.uid % PER_USER_RANGE; for (var user : UserService.getUsers()) { var moduleUid = user.id * PER_USER_RANGE + appId; + if (moduleUid == processScope.uid) continue; // skip duplicate var moduleSelf = new ProcessScope(processScope.processName, moduleUid); cachedScope.computeIfAbsent(moduleSelf, ignored -> new LinkedList<>()).add(module); @@ -637,7 +639,7 @@ public class ConfigManager { return; } } - Log.d(TAG, "cached Scope"); + Log.d(TAG, "cached scope"); cachedScope.forEach((ps, modules) -> { Log.d(TAG, ps.processName + "/" + ps.uid); modules.forEach(module -> Log.d(TAG, "\t" + module.packageName)); diff --git a/external/lsplant b/external/lsplant index 3d2e1f5f..20413748 160000 --- a/external/lsplant +++ b/external/lsplant @@ -1 +1 @@ -Subproject commit 3d2e1f5fc73ae09ebe889f2c6ddfc49c57dda2c9 +Subproject commit 20413748f0bac79ca480909cdce48723f600ff90