Merge "Add flag to AMS.startInstrumentation() to disable hidden API checks"
This commit is contained in:
@@ -167,6 +167,8 @@ public class Am extends BaseCommand {
|
|||||||
} else if (opt.equals("--no_window_animation")
|
} else if (opt.equals("--no_window_animation")
|
||||||
|| opt.equals("--no-window-animation")) {
|
|| opt.equals("--no-window-animation")) {
|
||||||
instrument.noWindowAnimation = true;
|
instrument.noWindowAnimation = true;
|
||||||
|
} else if (opt.equals("--no-hidden-api-checks")) {
|
||||||
|
instrument.disableHiddenApiChecks = true;
|
||||||
} else if (opt.equals("--user")) {
|
} else if (opt.equals("--user")) {
|
||||||
instrument.userId = parseUserArg(nextArgRequired());
|
instrument.userId = parseUserArg(nextArgRequired());
|
||||||
} else if (opt.equals("--abi")) {
|
} else if (opt.equals("--abi")) {
|
||||||
|
|||||||
@@ -52,12 +52,17 @@ public class Instrument {
|
|||||||
public boolean rawMode = false;
|
public boolean rawMode = false;
|
||||||
public boolean proto = false;
|
public boolean proto = false;
|
||||||
public boolean noWindowAnimation = false;
|
public boolean noWindowAnimation = false;
|
||||||
|
public boolean disableHiddenApiChecks = false;
|
||||||
public String abi = null;
|
public String abi = null;
|
||||||
public int userId = UserHandle.USER_CURRENT;
|
public int userId = UserHandle.USER_CURRENT;
|
||||||
public Bundle args = new Bundle();
|
public Bundle args = new Bundle();
|
||||||
// Required
|
// Required
|
||||||
public String componentNameArg;
|
public String componentNameArg;
|
||||||
|
|
||||||
|
// Disable hidden API checks for the newly started instrumentation.
|
||||||
|
// Must be kept in sync with ActivityManagerService.
|
||||||
|
private static final int INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS = 1 << 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct the instrument command runner.
|
* Construct the instrument command runner.
|
||||||
*/
|
*/
|
||||||
@@ -416,7 +421,8 @@ public class Instrument {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Start the instrumentation
|
// Start the instrumentation
|
||||||
if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId,
|
int flags = disableHiddenApiChecks ? INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS : 0;
|
||||||
|
if (!mAm.startInstrumentation(cn, profileFile, flags, args, watcher, connection, userId,
|
||||||
abi)) {
|
abi)) {
|
||||||
throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
|
throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -533,6 +533,10 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
// How long we wait until we timeout on key dispatching during instrumentation.
|
// How long we wait until we timeout on key dispatching during instrumentation.
|
||||||
static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT = 60*1000;
|
static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT = 60*1000;
|
||||||
|
|
||||||
|
// Disable hidden API checks for the newly started instrumentation.
|
||||||
|
// Must be kept in sync with Am.
|
||||||
|
private static final int INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS = 1 << 0;
|
||||||
|
|
||||||
// How long to wait in getAssistContextExtras for the activity and foreground services
|
// How long to wait in getAssistContextExtras for the activity and foreground services
|
||||||
// to respond with the result.
|
// to respond with the result.
|
||||||
static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
|
static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
|
||||||
@@ -3813,6 +3817,13 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
|
|
||||||
private final void startProcessLocked(ProcessRecord app, String hostingType,
|
private final void startProcessLocked(ProcessRecord app, String hostingType,
|
||||||
String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
|
String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
|
||||||
|
startProcessLocked(app, hostingType, hostingNameStr, false /* disableHiddenApiChecks */,
|
||||||
|
null /* abiOverride */, null /* entryPoint */, null /* entryPointArgs */);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final void startProcessLocked(ProcessRecord app, String hostingType,
|
||||||
|
String hostingNameStr, boolean disableHiddenApiChecks, String abiOverride,
|
||||||
|
String entryPoint, String[] entryPointArgs) {
|
||||||
long startTime = SystemClock.elapsedRealtime();
|
long startTime = SystemClock.elapsedRealtime();
|
||||||
if (app.pid > 0 && app.pid != MY_PID) {
|
if (app.pid > 0 && app.pid != MY_PID) {
|
||||||
checkTime(startTime, "startProcess: removing from pids map");
|
checkTime(startTime, "startProcess: removing from pids map");
|
||||||
@@ -3933,7 +3944,9 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES;
|
runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!app.info.isAllowedToUseHiddenApi() && !mHiddenApiBlacklist.isDisabled()) {
|
if (!app.info.isAllowedToUseHiddenApi() &&
|
||||||
|
!disableHiddenApiChecks &&
|
||||||
|
!mHiddenApiBlacklist.isDisabled()) {
|
||||||
// This app is not allowed to use undocumented and private APIs, or blacklisting is
|
// This app is not allowed to use undocumented and private APIs, or blacklisting is
|
||||||
// enabled. Set up its runtime with the appropriate flag.
|
// enabled. Set up its runtime with the appropriate flag.
|
||||||
runtimeFlags |= Zygote.ENABLE_HIDDEN_API_CHECKS;
|
runtimeFlags |= Zygote.ENABLE_HIDDEN_API_CHECKS;
|
||||||
@@ -12456,6 +12469,12 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
|
|
||||||
final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
|
final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
|
||||||
String abiOverride) {
|
String abiOverride) {
|
||||||
|
return addAppLocked(info, customProcess, isolated, false /* disableHiddenApiChecks */,
|
||||||
|
abiOverride);
|
||||||
|
}
|
||||||
|
|
||||||
|
final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
|
||||||
|
boolean disableHiddenApiChecks, String abiOverride) {
|
||||||
ProcessRecord app;
|
ProcessRecord app;
|
||||||
if (!isolated) {
|
if (!isolated) {
|
||||||
app = getProcessRecordLocked(customProcess != null ? customProcess : info.processName,
|
app = getProcessRecordLocked(customProcess != null ? customProcess : info.processName,
|
||||||
@@ -12487,8 +12506,8 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
|
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
|
||||||
mPersistentStartingProcesses.add(app);
|
mPersistentStartingProcesses.add(app);
|
||||||
startProcessLocked(app, "added application",
|
startProcessLocked(app, "added application",
|
||||||
customProcess != null ? customProcess : app.processName, abiOverride,
|
customProcess != null ? customProcess : app.processName, disableHiddenApiChecks,
|
||||||
null /* entryPoint */, null /* entryPointArgs */);
|
abiOverride, null /* entryPoint */, null /* entryPointArgs */);
|
||||||
}
|
}
|
||||||
|
|
||||||
return app;
|
return app;
|
||||||
@@ -20153,7 +20172,10 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
// Instrumentation can kill and relaunch even persistent processes
|
// Instrumentation can kill and relaunch even persistent processes
|
||||||
forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, false, userId,
|
forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, false, userId,
|
||||||
"start instr");
|
"start instr");
|
||||||
ProcessRecord app = addAppLocked(ai, defProcess, false, abiOverride);
|
boolean disableHiddenApiChecks =
|
||||||
|
(flags & INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0;
|
||||||
|
ProcessRecord app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
|
||||||
|
abiOverride);
|
||||||
app.instr = activeInstr;
|
app.instr = activeInstr;
|
||||||
activeInstr.mFinished = false;
|
activeInstr.mFinished = false;
|
||||||
activeInstr.mRunningProcesses.add(app);
|
activeInstr.mRunningProcesses.add(app);
|
||||||
|
|||||||
@@ -2729,7 +2729,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
|
|||||||
pw.println(" specified then send to all users.");
|
pw.println(" specified then send to all users.");
|
||||||
pw.println(" --receiver-permission <PERMISSION>: Require receiver to hold permission.");
|
pw.println(" --receiver-permission <PERMISSION>: Require receiver to hold permission.");
|
||||||
pw.println(" instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]");
|
pw.println(" instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]");
|
||||||
pw.println(" [--user <USER_ID> | current]");
|
pw.println(" [--user <USER_ID> | current] [--no-hidden-api-checks]");
|
||||||
pw.println(" [--no-window-animation] [--abi <ABI>] <COMPONENT>");
|
pw.println(" [--no-window-animation] [--abi <ABI>] <COMPONENT>");
|
||||||
pw.println(" Start an Instrumentation. Typically this target <COMPONENT> is in the");
|
pw.println(" Start an Instrumentation. Typically this target <COMPONENT> is in the");
|
||||||
pw.println(" form <TEST_PACKAGE>/<RUNNER_CLASS> or only <TEST_PACKAGE> if there");
|
pw.println(" form <TEST_PACKAGE>/<RUNNER_CLASS> or only <TEST_PACKAGE> if there");
|
||||||
@@ -2744,6 +2744,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
|
|||||||
pw.println(" test runners.");
|
pw.println(" test runners.");
|
||||||
pw.println(" --user <USER_ID> | current: Specify user instrumentation runs in;");
|
pw.println(" --user <USER_ID> | current: Specify user instrumentation runs in;");
|
||||||
pw.println(" current user if not specified.");
|
pw.println(" current user if not specified.");
|
||||||
|
pw.println(" --no-hidden-api-checks: disable restrictions on use of hidden API.");
|
||||||
pw.println(" --no-window-animation: turn off window animations while running.");
|
pw.println(" --no-window-animation: turn off window animations while running.");
|
||||||
pw.println(" --abi <ABI>: Launch the instrumented process with the selected ABI.");
|
pw.println(" --abi <ABI>: Launch the instrumented process with the selected ABI.");
|
||||||
pw.println(" This assumes that the process supports the selected ABI.");
|
pw.println(" This assumes that the process supports the selected ABI.");
|
||||||
|
|||||||
Reference in New Issue
Block a user