From 6609105eb5b80019a1a94ed4874450e6db6a6a8e Mon Sep 17 00:00:00 2001 From: Artur Satayev Date: Mon, 11 Jan 2021 16:19:58 +0000 Subject: [PATCH] Enable @TestApi access for instrumentation. Since introduction of ALLOW_TEST_API_ACCESS, it is now possible to grant access to test apis for the whole UID, instead of just a starting process. This resolves the issue, where a forked test process cannot access @TestApi's. Bug: 147113465 Test: atest CameraEvictionTest#testBasicCamera2ActivityEviction Change-Id: I8dd3bbacdb263a3e30539f43d8081f6d78e80155 --- cmds/am/src/com/android/commands/am/Am.java | 5 ---- .../server/am/ActivityManagerService.java | 23 +++++++++++++++++++ 2 files changed, 23 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 ebe6199690f79..4e46aa3f42d56 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -174,10 +174,6 @@ 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")) { - // TODO(satayev): remove this option, only kept for backwards compatibility with - // cached tradefed instance - instrument.disableTestApiChecks = false; } else if (opt.equals("--no-test-api-access")) { instrument.disableTestApiChecks = false; } else if (opt.equals("--no-isolated-storage")) { @@ -200,7 +196,6 @@ public class Am extends BaseCommand { } instrument.componentNameArg = nextArgRequired(); - instrument.run(); } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c1ab5b6a315ef..b40dcd6f2d3c6 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -180,6 +180,7 @@ import android.app.usage.UsageEvents.Event; import android.app.usage.UsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetManager; +import android.compat.Compatibility; import android.content.AutofillOptions; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; @@ -303,6 +304,7 @@ import com.android.internal.app.IAppOpsService; import com.android.internal.app.ProcessMap; import com.android.internal.app.SystemUserHomeActivity; import com.android.internal.app.procstats.ProcessStats; +import com.android.internal.compat.CompatibilityChangeConfig; import com.android.internal.content.PackageHelper; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; @@ -14394,6 +14396,8 @@ public class ActivityManagerService extends IActivityManager.Stub if (disableHiddenApiChecks || disableTestApiChecks) { enforceCallingPermission(android.Manifest.permission.DISABLE_HIDDEN_API_CHECKS, "disable hidden API checks"); + + enableTestApiAccess(ii.packageName); } // TODO(b/158750470): remove @@ -14566,6 +14570,25 @@ public class ActivityManagerService extends IActivityManager.Stub app.userId, "finished inst"); } + + disableTestApiAccess(app.info.packageName); + } + + private void enableTestApiAccess(String packageName) { + if (mPlatformCompat != null) { + Compatibility.ChangeConfig config = new Compatibility.ChangeConfig( + Collections.singleton(166236554L /* VMRuntime.ALLOW_TEST_API_ACCESS */), + Collections.emptySet()); + CompatibilityChangeConfig override = new CompatibilityChangeConfig(config); + mPlatformCompat.setOverridesForTest(override, packageName); + } + } + + private void disableTestApiAccess(String packageName) { + if (mPlatformCompat != null) { + mPlatformCompat.clearOverrideForTest(166236554L /* VMRuntime.ALLOW_TEST_API_ACCESS */, + packageName); + } } public void finishInstrumentation(IApplicationThread target,