Fix magisk su request latency (#1159)

This commit is contained in:
LoveSy 2021-09-23 00:40:52 +08:00 committed by GitHub
parent d8ceb12b57
commit 3b230e2653
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 8 deletions

View File

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