Skip duplicate scopes for module process (#1845)

Fix #1844
This commit is contained in:
LoveSy 2022-04-14 16:51:24 +08:00 committed by GitHub
parent 5d28c7ca6d
commit b5aff15919
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 7 deletions

View File

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

View File

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

2
external/lsplant vendored

@ -1 +1 @@
Subproject commit 3d2e1f5fc73ae09ebe889f2c6ddfc49c57dda2c9
Subproject commit 20413748f0bac79ca480909cdce48723f600ff90