diff --git a/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java b/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java index 4bbe9395..5c5d3fa3 100644 --- a/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java +++ b/core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java @@ -10,10 +10,10 @@ import androidx.annotation.Nullable; import org.lsposed.lspd.service.ILSPInjectedModuleService; import org.lsposed.lspd.service.IRemotePreferenceCallback; +import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; @SuppressWarnings("unchecked") @@ -21,8 +21,7 @@ public class LSPosedRemotePreferences implements SharedPreferences { private final Map mMap = new ConcurrentHashMap<>(); - private static final Object CONTENT = new Object(); - final WeakHashMap mListeners = new WeakHashMap<>(); + final HashSet mListeners = new HashSet<>(); IRemotePreferenceCallback callback = new IRemotePreferenceCallback.Stub() { @Override @@ -42,7 +41,7 @@ public class LSPosedRemotePreferences implements SharedPreferences { } synchronized (mListeners) { for (var key : changes) { - mListeners.keySet().forEach(listener -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key)); + mListeners.forEach(listener -> listener.onSharedPreferenceChanged(LSPosedRemotePreferences.this, key)); } } } @@ -117,7 +116,7 @@ public class LSPosedRemotePreferences implements SharedPreferences { @Override public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { synchronized (mListeners) { - mListeners.put(listener, CONTENT); + mListeners.add(listener); } } 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 6eb6695f..470b45b7 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -215,6 +215,11 @@ public class ConfigManager { var module = new Module(); module.apkPath = cursor.getString(apkPathIdx); module.packageName = cursor.getString(pkgNameIdx); + var cached = cachedModule.get(module.packageName); + if (cached != null) { + modules.add(cached); + continue; + } var statPath = toGlobalNamespace("/data/user_de/0/" + module.packageName).getAbsolutePath(); try { module.appId = Os.stat(statPath).st_uid; @@ -229,7 +234,7 @@ public class ConfigManager { } catch (PackageParser.PackageParserException e) { Log.w(TAG, "failed to parse " + module.apkPath, e); } - module.service = new LSPInjectedModuleService(module); + module.service = new LSPInjectedModuleService(module.packageName); modules.add(module); } } @@ -548,7 +553,6 @@ public class ConfigManager { var module = new Module(); module.packageName = packageName; module.apkPath = apkPath; - module.service = new LSPInjectedModuleService(module); modules.add(module); } @@ -590,6 +594,7 @@ public class ConfigManager { } m.appId = pkgInfo.applicationInfo.uid; m.applicationInfo = pkgInfo.applicationInfo; + m.service = oldModule != null ? oldModule.service : new LSPInjectedModuleService(m.packageName); return true; }).forEach(m -> { var file = ConfigFileManager.loadModule(m.apkPath, dexObfuscate); diff --git a/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java b/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java index bfa975c9..ae1f6e80 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java @@ -21,12 +21,12 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub { private static final String TAG = "LSPosedInjectedModuleService"; - private final Module loadedModule; + private final String mPackageName; Map> callbacks = new ConcurrentHashMap<>(); - LSPInjectedModuleService(Module module) { - loadedModule = module; + LSPInjectedModuleService(String packageName) { + mPackageName = packageName; } @Override @@ -38,7 +38,7 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub { public Bundle requestRemotePreferences(String group, IRemotePreferenceCallback callback) { var bundle = new Bundle(); var userId = Binder.getCallingUid() / PER_USER_RANGE; - bundle.putSerializable("map", ConfigManager.getInstance().getModulePrefs(loadedModule.packageName, userId, group)); + bundle.putSerializable("map", ConfigManager.getInstance().getModulePrefs(mPackageName, userId, group)); if (callback != null) { var groupCallbacks = callbacks.computeIfAbsent(group, k -> ConcurrentHashMap.newKeySet()); groupCallbacks.add(callback); @@ -56,7 +56,7 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub { ConfigFileManager.ensureModuleFilePath(path); var userId = Binder.getCallingUid() / PER_USER_RANGE; try { - var dir = ConfigFileManager.resolveModuleDir(loadedModule.packageName, FILES_DIR, userId, -1); + var dir = ConfigFileManager.resolveModuleDir(mPackageName, FILES_DIR, userId, -1); return ParcelFileDescriptor.open(dir.resolve(path).toFile(), ParcelFileDescriptor.MODE_READ_ONLY); } catch (Throwable e) { throw new RemoteException(e.getMessage()); @@ -67,7 +67,7 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub { public String[] getRemoteFileList() throws RemoteException { var userId = Binder.getCallingUid() / PER_USER_RANGE; try { - var dir = ConfigFileManager.resolveModuleDir(loadedModule.packageName, FILES_DIR, userId, -1); + var dir = ConfigFileManager.resolveModuleDir(mPackageName, FILES_DIR, userId, -1); var files = dir.toFile().list(); return files == null ? new String[0] : files;