From 3b230e2653cb2769b1c0991bccd363d5d2c9ef8d Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 23 Sep 2021 00:40:52 +0800 Subject: [PATCH] Fix magisk su request latency (#1159) --- .../lspd/service/ActivityController.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/lsposed/lspd/service/ActivityController.java b/core/src/main/java/org/lsposed/lspd/service/ActivityController.java index 88545a19..c9ab5e8b 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ActivityController.java +++ b/core/src/main/java/org/lsposed/lspd/service/ActivityController.java @@ -20,6 +20,7 @@ import androidx.annotation.NonNull; import org.lsposed.lspd.BuildConfig; +import java.io.FileDescriptor; import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.Constructor; @@ -31,6 +32,7 @@ public class ActivityController extends IActivityController.Stub { private static Constructor myActivityControllerConstructor = null; private static Method myActivityControllerRunner = null; private static boolean inited = false; + private static int fdSize = -1; private static IActivityController controller = null; @@ -46,6 +48,10 @@ public class ActivityController extends IActivityController.Stub { myActivityControllerConstructor.setAccessible(true); myActivityControllerRunner = myActivityControllerClass.getDeclaredMethod("run"); myActivityControllerRunner.setAccessible(true); + var tmp = Parcel.obtain(); + tmp.writeFileDescriptor(FileDescriptor.in); + fdSize = tmp.dataPosition(); + tmp.recycle(); inited = true; } catch (Throwable e) { Log.e(TAG, "Failed to init ActivityController", e); @@ -65,14 +71,17 @@ public class ActivityController extends IActivityController.Stub { static boolean replaceShellCommand(IBinder am, Parcel data) { if (!inited) return false; try { - var in = data.readFileDescriptor(); - var out = data.readFileDescriptor(); - var err = data.readFileDescriptor(); + data.setDataPosition(fdSize * 3); String[] args = data.createStringArray(); - ShellCallback shellCallback = ShellCallback.CREATOR.createFromParcel(data); - ResultReceiver resultReceiver = ResultReceiver.CREATOR.createFromParcel(data); if (args.length > 0 && "monitor".equals(args[0])) { + data.setDataPosition(0); + var in = data.readFileDescriptor(); + var out = data.readFileDescriptor(); + var err = data.readFileDescriptor(); + data.createStringArray(); + ShellCallback shellCallback = ShellCallback.CREATOR.createFromParcel(data); + ResultReceiver resultReceiver = ResultReceiver.CREATOR.createFromParcel(data); new ShellCommand() { @Override public int onCommand(String cmd) { @@ -99,9 +108,6 @@ public class ActivityController extends IActivityController.Stub { } }.exec((Binder) am, in.getFileDescriptor(), out.getFileDescriptor(), err.getFileDescriptor(), args, shellCallback, resultReceiver); - if (in != null) in.detachFd(); - if (out != null) out.detachFd(); - if (err != null) err.detachFd(); return true; } } catch (Throwable e) {