diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b238358b..9ecfd3a5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -24,7 +24,6 @@ import java.nio.file.Paths import java.time.Instant plugins { - id("org.gradle.idea") id("com.android.application") id("androidx.navigation.safeargs") } diff --git a/core/src/main/aidl/org/lsposed/lspd/models/ModuleConfig.aidl b/core/src/main/aidl/org/lsposed/lspd/models/ModuleConfig.aidl index cce31280..e8e01890 100644 --- a/core/src/main/aidl/org/lsposed/lspd/models/ModuleConfig.aidl +++ b/core/src/main/aidl/org/lsposed/lspd/models/ModuleConfig.aidl @@ -1,5 +1,6 @@ package org.lsposed.lspd.models; parcelable ModuleConfig { - SharedMemory[] preLoadedDexes; + List preLoadedDexes; + List moduleClassNames; } diff --git a/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl b/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl index c99e9353..38477b5f 100644 --- a/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl +++ b/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl @@ -5,7 +5,6 @@ import org.lsposed.lspd.models.Module; interface ILSPApplicationService { IBinder requestModuleBinder(String name); - //TODO: after array copy bug fixed, use array instead of list boolean requestManagerBinder(String packageName, String path, out List binder); boolean isResourcesHookEnabled(); diff --git a/core/src/main/aidl/org/lsposed/lspd/service/ILSPSystemServerService.aidl b/core/src/main/aidl/org/lsposed/lspd/service/ILSPSystemServerService.aidl index 25d6a72f..a6963007 100644 --- a/core/src/main/aidl/org/lsposed/lspd/service/ILSPSystemServerService.aidl +++ b/core/src/main/aidl/org/lsposed/lspd/service/ILSPSystemServerService.aidl @@ -3,5 +3,5 @@ package org.lsposed.lspd.service; import org.lsposed.lspd.service.ILSPApplicationService; interface ILSPSystemServerService { - ILSPApplicationService requestApplicationService(int uid, int pid, String processName, IBinder heartBeat) = 1; + ILSPApplicationService requestApplicationService(int uid, int pid, String processName, IBinder heartBeat); } diff --git a/core/src/main/aidl/org/lsposed/lspd/service/ILSPosedService.aidl b/core/src/main/aidl/org/lsposed/lspd/service/ILSPosedService.aidl index 1cd19c28..df10b2f2 100644 --- a/core/src/main/aidl/org/lsposed/lspd/service/ILSPosedService.aidl +++ b/core/src/main/aidl/org/lsposed/lspd/service/ILSPosedService.aidl @@ -3,7 +3,7 @@ package org.lsposed.lspd.service; import org.lsposed.lspd.service.ILSPApplicationService; interface ILSPosedService { - ILSPApplicationService requestApplicationService(int uid, int pid, String processName, IBinder heartBeat) = 1; + ILSPApplicationService requestApplicationService(int uid, int pid, String processName, IBinder heartBeat); - oneway void dispatchSystemServerContext(in IBinder activityThread, in IBinder activityToken) = 4; + oneway void dispatchSystemServerContext(in IBinder activityThread, in IBinder activityToken); } diff --git a/core/src/main/java/de/robv/android/xposed/XposedInit.java b/core/src/main/java/de/robv/android/xposed/XposedInit.java index b05432c3..622e797d 100644 --- a/core/src/main/java/de/robv/android/xposed/XposedInit.java +++ b/core/src/main/java/de/robv/android/xposed/XposedInit.java @@ -57,6 +57,7 @@ import java.lang.ref.WeakReference; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -355,7 +356,7 @@ public final class XposedInit { * in assets/xposed_init. */ @SuppressLint("PrivateApi") - private static boolean loadModule(String name, String apk, SharedMemory[] dexes) { + private static boolean loadModule(String name, String apk, List dexes) { Log.i(TAG, "Loading module " + name + " from " + apk); if (!new File(apk).exists()) { 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 6af06168..f71e2da7 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java @@ -91,7 +91,7 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { hookNewXSP(lpparam); } - var binder = new ArrayList(); + var binder = new ArrayList(1); var blocked = false; var info = loadedApk.getApplicationInfo(); if (info != null) { diff --git a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java index a5f0a09b..34f3a2c7 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -201,7 +201,7 @@ public class ConfigManager { private final Map> cachedScope = new ConcurrentHashMap<>(); // apkPath, dexes - private final Map cachedDexes = new ConcurrentHashMap<>(); + private final Map> cachedDexes = new ConcurrentHashMap<>(); // appId, packageName private final Map cachedModule = new ConcurrentHashMap<>(); @@ -547,7 +547,7 @@ public class ConfigManager { }); } - private SharedMemory[] loadModuleDexes(String path) { + private List loadModuleDexes(String path) { var sharedMemories = new ArrayList(); try (var apkFile = new ZipFile(path)) { int secondary = 2; @@ -567,10 +567,10 @@ public class ConfigManager { } catch (IOException e) { Log.e(TAG, "Can not open " + path, e); } - return sharedMemories.toArray(new SharedMemory[0]); + return sharedMemories; } - private SharedMemory[] getModuleDexes(String path) { + private List getModuleDexes(String path) { return cachedDexes.computeIfAbsent(path, this::loadModuleDexes); } @@ -579,7 +579,7 @@ public class ConfigManager { var path = entry.getKey(); var dexes = entry.getValue(); if (!new File(path).exists()) { - Arrays.stream(dexes).parallel().forEach(SharedMemory::close); + dexes.stream().parallel().forEach(SharedMemory::close); return true; } return false; @@ -856,8 +856,7 @@ public class ConfigManager { } public boolean shouldBlock(String packageName) { - return packageName.equals("io.github.lsposed.manager") || - packageName.equals(BuildConfig.DEFAULT_MANAGER_PACKAGE_NAME); + return packageName.equals("io.github.lsposed.manager") || isManager(packageName); } public String getPrefsPath(String fileName, int uid) { diff --git a/core/src/main/java/org/lsposed/lspd/util/LspModuleClassLoader.java b/core/src/main/java/org/lsposed/lspd/util/LspModuleClassLoader.java index 1a961b03..4704381a 100644 --- a/core/src/main/java/org/lsposed/lspd/util/LspModuleClassLoader.java +++ b/core/src/main/java/org/lsposed/lspd/util/LspModuleClassLoader.java @@ -177,10 +177,10 @@ public final class LspModuleClassLoader extends ByteBufferDexClassLoader { } public static LspModuleClassLoader loadApk(File apk, - SharedMemory[] dexes, + List dexes, String librarySearchPath, ClassLoader parent) { - var dexBuffers = Arrays.stream(dexes).parallel().map(dex -> { + var dexBuffers = dexes.stream().parallel().map(dex -> { try { return dex.mapReadOnly(); } catch (ErrnoException e) { @@ -197,7 +197,7 @@ public final class LspModuleClassLoader extends ByteBufferDexClassLoader { cl.initNativeLibraryDirs(librarySearchPath); } Arrays.stream(dexBuffers).parallel().forEach(SharedMemory::unmap); - Arrays.stream(dexes).parallel().forEach(SharedMemory::close); + dexes.stream().parallel().forEach(SharedMemory::close); return cl; } }