From e2ebc1be4bbc1c6fa2759fce5fc4d47bd4072ee1 Mon Sep 17 00:00:00 2001 From: Artur Satayev Date: Thu, 31 Oct 2019 12:07:55 +0000 Subject: [PATCH] Add --no-test-api-acces to am instrument. By default instrumented processed have access to @TestApis; however for certain CTS tests we want to disable access to test APIs, where this flag would be used. Test: manual Bug: 133832325 Change-Id: Id56ce3079bcea2632d4002edcf120d9d5c9e0a26 Merged-In: Id56ce3079bcea2632d4002edcf120d9d5c9e0a26 --- cmds/am/src/com/android/commands/am/Am.java | 2 ++ cmds/am/src/com/android/commands/am/Instrument.java | 5 +++++ core/java/android/app/ActivityManager.java | 6 ++++++ .../com/android/server/am/ActivityManagerService.java | 8 ++++---- .../android/server/am/ActivityManagerShellCommand.java | 5 ++++- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index 41d546f6d6038..22e1d0187f01c 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -174,6 +174,8 @@ public class Am extends BaseCommand { instrument.noWindowAnimation = true; } else if (opt.equals("--no-hidden-api-checks")) { instrument.disableHiddenApiChecks = true; + } else if (opt.equals("--no-test-api-checks")) { + instrument.disableTestApiChecks = true; } else if (opt.equals("--no-isolated-storage")) { instrument.disableIsolatedStorage = true; } else if (opt.equals("--user")) { diff --git a/cmds/am/src/com/android/commands/am/Instrument.java b/cmds/am/src/com/android/commands/am/Instrument.java index 4d7b5a79b4f77..6afd7c40c1c17 100644 --- a/cmds/am/src/com/android/commands/am/Instrument.java +++ b/cmds/am/src/com/android/commands/am/Instrument.java @@ -17,6 +17,7 @@ package com.android.commands.am; import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS; +import static android.app.ActivityManager.INSTR_FLAG_DISABLE_TEST_API_CHECKS; import static android.app.ActivityManager.INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL; import android.app.IActivityManager; @@ -85,6 +86,7 @@ public class Instrument { String logPath = null; public boolean noWindowAnimation = false; public boolean disableHiddenApiChecks = false; + public boolean disableTestApiChecks = false; public boolean disableIsolatedStorage = false; public String abi = null; public int userId = UserHandle.USER_CURRENT; @@ -506,6 +508,9 @@ public class Instrument { if (disableHiddenApiChecks) { flags |= INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS; } + if (disableTestApiChecks) { + flags |= INSTR_FLAG_DISABLE_TEST_API_CHECKS; + } if (disableIsolatedStorage) { flags |= INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL; } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 91b98c71a613b..752f3e3c6bbea 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -153,6 +153,12 @@ public class ActivityManager { */ public static final int INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL = 1 << 1; + /** + * Disable test API access for the newly started instrumentation. + * @hide + */ + public static final int INSTR_FLAG_DISABLE_TEST_API_CHECKS = 1 << 2; + static final class UidObserver extends IUidObserver.Stub { final OnUidImportanceListener mListener; final Context mContext; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7609632fd7dfb..e5c8ba5154460 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -24,6 +24,7 @@ import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.REMOVE_TASKS; import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND; import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS; +import static android.app.ActivityManager.INSTR_FLAG_DISABLE_TEST_API_CHECKS; import static android.app.ActivityManager.INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL; import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; @@ -15769,13 +15770,12 @@ public class ActivityManagerService extends IActivityManager.Stub boolean disableHiddenApiChecks = ai.usesNonSdkApi() || (flags & INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0; - if (disableHiddenApiChecks) { + boolean disableTestApiChecks = disableHiddenApiChecks + || (flags & INSTR_FLAG_DISABLE_TEST_API_CHECKS) != 0; + if (disableHiddenApiChecks || disableTestApiChecks) { enforceCallingPermission(android.Manifest.permission.DISABLE_HIDDEN_API_CHECKS, "disable hidden API checks"); } - // Allow instrumented processes access to test APIs. - // TODO(satayev): make this configurable via testing framework. - boolean disableTestApiChecks = true; final boolean mountExtStorageFull = isCallerShell() && (flags & INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL) != 0; diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 0c1388cc82d89..6e92e80424fa8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -3032,7 +3032,8 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" specified then send to all users."); pw.println(" --receiver-permission : Require receiver to hold permission."); pw.println(" instrument [-r] [-e ] [-p ] [-w]"); - pw.println(" [--user | current] [--no-hidden-api-checks]"); + pw.println(" [--user | current]"); + pw.println(" [--no-hidden-api-checks [--no-test-api-checks]]"); pw.println(" [--no-isolated-storage]"); pw.println(" [--no-window-animation] [--abi ] "); pw.println(" Start an Instrumentation. Typically this target is in the"); @@ -3052,6 +3053,8 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" --user | current: Specify user instrumentation runs in;"); pw.println(" current user if not specified."); pw.println(" --no-hidden-api-checks: disable restrictions on use of hidden API."); + pw.println(" --no-test-api-checks: disable restrictions to test APIs, if hidden"); + pw.println(" API checks are enabled."); pw.println(" --no-isolated-storage: don't use isolated storage sandbox and "); pw.println(" mount full external storage"); pw.println(" --no-window-animation: turn off window animations while running.");