Support Android 14 DP1 (#2377)

Fix #2376
This commit is contained in:
LoveSy 2023-02-09 11:20:28 +08:00 committed by GitHub
parent e7c36afeb0
commit 731eae9f3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 30 additions and 5 deletions

View File

@ -45,8 +45,13 @@ public class ActivityController extends IActivityController.Stub {
Context ctx = ActivityThread.currentActivityThread().getSystemContext();
var systemClassLoader = ctx.getClassLoader();
@SuppressLint("PrivateApi") var myActivityControllerClass = Class.forName("com.android.server.am.ActivityManagerShellCommand$MyActivityController", false, systemClassLoader);
myActivityControllerConstructor = myActivityControllerClass.getDeclaredConstructor(IActivityManager.class, PrintWriter.class, InputStream.class,
String.class, boolean.class);
try {
myActivityControllerConstructor = myActivityControllerClass.getDeclaredConstructor(IActivityManager.class, PrintWriter.class, InputStream.class,
String.class, boolean.class);
} catch (NoSuchMethodException ignored) {
myActivityControllerConstructor = myActivityControllerClass.getDeclaredConstructor(IActivityManager.class, PrintWriter.class, InputStream.class,
String.class, boolean.class, boolean.class, String.class, boolean.class);
}
myActivityControllerConstructor.setAccessible(true);
myActivityControllerRunner = myActivityControllerClass.getDeclaredMethod("run");
myActivityControllerRunner.setAccessible(true);
@ -91,18 +96,33 @@ public class ActivityController extends IActivityController.Stub {
String opt;
String gdbPort = null;
boolean monkey = false;
boolean simpleMode = false;
String target = null;
boolean alwaysContinue = false;
while ((opt = getNextOption()) != null) {
if (opt.equals("--gdb")) {
gdbPort = getNextArgRequired();
} else if (opt.equals("-m")) {
monkey = true;
} else if (myActivityControllerConstructor.getParameterCount() > 5) {
switch (opt) {
case "-p":
target = getNextArgRequired();
break;
case "-s":
simpleMode = true;
break;
case "-c":
alwaysContinue = true;
break;
}
} else {
getErrPrintWriter().println("Error: Unknown option: " + opt);
return -1;
}
}
return replaceMyControllerActivity(pw, getRawInputStream(), gdbPort, monkey);
return replaceMyControllerActivity(pw, getRawInputStream(), gdbPort, monkey, simpleMode, target, alwaysContinue);
}
@Override
@ -141,7 +161,7 @@ public class ActivityController extends IActivityController.Stub {
return false;
}
static private int replaceMyControllerActivity(PrintWriter pw, InputStream stream, String gdbPort, boolean monkey) {
static private int replaceMyControllerActivity(PrintWriter pw, InputStream stream, String gdbPort, boolean monkey, boolean simpleMode, String target, boolean alwaysContinue) {
try {
InvocationHandler handler = (proxy, method, args1) -> {
if (method.getName().equals("setActivityController")) {
@ -155,7 +175,12 @@ public class ActivityController extends IActivityController.Stub {
};
var amProxy = Proxy.newProxyInstance(BridgeService.class.getClassLoader(),
new Class[]{myActivityControllerConstructor.getParameterTypes()[0]}, handler);
var ctrl = myActivityControllerConstructor.newInstance(amProxy, pw, stream, gdbPort, monkey);
Object ctrl;
if (myActivityControllerConstructor.getParameterCount() == 5) {
ctrl = myActivityControllerConstructor.newInstance(amProxy, pw, stream, gdbPort, monkey);
} else {
ctrl = myActivityControllerConstructor.newInstance(amProxy, pw, stream, gdbPort, monkey, simpleMode, target, alwaysContinue);
}
myActivityControllerRunner.invoke(ctrl);
return 0;
} catch (Throwable e) {