diff options
| -rw-r--r-- | api/test-current.txt | 7 | ||||
| -rw-r--r-- | api/test-lint-baseline.txt | 26 | ||||
| -rw-r--r-- | core/java/android/app/ActivityManager.java | 7 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManager.java | 22 | ||||
| -rw-r--r-- | core/java/android/view/IWindowManager.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/view/WindowManager.java | 5 | ||||
| -rw-r--r-- | core/java/android/view/WindowManagerImpl.java | 4 | ||||
| -rw-r--r-- | services/core/java/android/content/pm/TestUtilityService.java | 30 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 17 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 42 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 8 |
13 files changed, 149 insertions, 31 deletions
diff --git a/api/test-current.txt b/api/test-current.txt index edf860665fb6..82838ea605ff 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -84,7 +84,7 @@ package android.app { method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void addHomeVisibilityListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.HomeVisibilityListener); method public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName); method public long getTotalRam(); - method @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) public void holdLock(int); + method public void holdLock(android.os.IBinder, int); method public static boolean isHighEndGfx(); method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void removeHomeVisibilityListener(@NonNull android.app.HomeVisibilityListener); method @RequiresPermission(android.Manifest.permission.RESET_APP_ERRORS) public void resetAppErrors(); @@ -534,6 +534,7 @@ package android.content.pm { public abstract class PackageManager { method @Nullable public String getContentCaptureServicePackageName(); method @Nullable public String getDefaultTextClassifierPackageName(); + method @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) public android.os.IBinder getHoldLockToken(); method public abstract int getInstallReason(@NonNull String, @NonNull android.os.UserHandle); method @NonNull public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int); method @Nullable public abstract String[] getNamesForUids(int[]); @@ -542,7 +543,7 @@ package android.content.pm { method @NonNull public abstract String getSharedSystemSharedLibraryPackageName(); method @Nullable public String getSystemTextClassifierPackageName(); method @Nullable public String getWellbeingPackageName(); - method @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) public void holdLock(int); + method public void holdLock(android.os.IBinder, int); field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80 @@ -2036,7 +2037,7 @@ package android.view { } public interface WindowManager extends android.view.ViewManager { - method @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) public default void holdLock(int); + method public default void holdLock(android.os.IBinder, int); method public default void setShouldShowIme(int, boolean); method public default void setShouldShowSystemDecors(int, boolean); method public default void setShouldShowWithInsecureKeyguard(int, boolean); diff --git a/api/test-lint-baseline.txt b/api/test-lint-baseline.txt index 0440d1a95065..c0b40931f1e6 100644 --- a/api/test-lint-baseline.txt +++ b/api/test-lint-baseline.txt @@ -539,6 +539,8 @@ InternalField: android.telephony.ims.ImsConferenceState#mParticipants: KotlinOperator: android.os.WorkSource#get(int): +KotlinOperator: android.util.SparseArrayMap#get(int, K): + KotlinOperator: android.util.SparseArrayMap#get(int, String): @@ -594,17 +596,17 @@ MinMaxConstant: android.view.autofill.AutofillManager#MAX_TEMP_AUGMENTED_SERVICE MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setAttributeSet(android.util.AttributeSet): - android.app.ActivityView does not declare a `getAttributeSet()` method matching method android.app.ActivityView.Builder.setAttributeSet(android.util.AttributeSet) + MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setDefaultStyle(int): - android.app.ActivityView does not declare a `getDefaultStyle()` method matching method android.app.ActivityView.Builder.setDefaultStyle(int) + MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setDisableSurfaceViewBackgroundLayer(boolean): - android.app.ActivityView does not declare a `isDisableSurfaceViewBackgroundLayer()` method matching method android.app.ActivityView.Builder.setDisableSurfaceViewBackgroundLayer(boolean) + MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setSingleInstance(boolean): - android.app.ActivityView does not declare a `isSingleInstance()` method matching method android.app.ActivityView.Builder.setSingleInstance(boolean) + MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setUsePublicVirtualDisplay(boolean): - android.app.ActivityView does not declare a `isUsePublicVirtualDisplay()` method matching method android.app.ActivityView.Builder.setUsePublicVirtualDisplay(boolean) + MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setUseTrustedDisplay(boolean): - android.app.ActivityView does not declare a `isUseTrustedDisplay()` method matching method android.app.ActivityView.Builder.setUseTrustedDisplay(boolean) + MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setAttributionTag(String): MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setFlags(int): @@ -751,6 +753,8 @@ MissingNullability: android.app.ActivityManager#forceStopPackage(String) paramet MissingNullability: android.app.ActivityManager#getPackageImportance(String) parameter #0: +MissingNullability: android.app.ActivityManager#holdLock(android.os.IBinder, int) parameter #0: + MissingNullability: android.app.ActivityManager#removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener) parameter #0: MissingNullability: android.app.ActivityManager#scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int) parameter #0: @@ -935,8 +939,12 @@ MissingNullability: android.content.pm.LauncherApps#LauncherApps(android.content MissingNullability: android.content.pm.PackageInstaller.SessionParams#setGrantedRuntimePermissions(String[]) parameter #0: +MissingNullability: android.content.pm.PackageManager#getHoldLockToken(): + Missing nullability on method `BINDER` return MissingNullability: android.content.pm.PackageManager#getNamesForUids(int[]) parameter #0: +MissingNullability: android.content.pm.PackageManager#holdLock(android.os.IBinder, int) parameter #0: + MissingNullability: android.content.pm.ShortcutManager#ShortcutManager(android.content.Context) parameter #0: MissingNullability: android.content.res.AssetManager#getOverlayablesToString(String) parameter #0: @@ -2313,6 +2321,8 @@ MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>) parameter #2: +MissingNullability: android.view.WindowManager#holdLock(android.os.IBinder, int) parameter #0: + MissingNullability: android.view.WindowManager.LayoutParams#accessibilityTitle: MissingNullability: android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener#onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager) parameter #0: @@ -2893,6 +2903,10 @@ SetterReturnsThis: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyS +StartWithLower: android.content.pm.PackageManager#BINDER(): + Method name must start with lowercase char: BINDER + + StaticFinalBuilder: android.content.integrity.RuleSet.Builder: StaticFinalBuilder: android.hardware.display.BrightnessConfiguration.Builder: diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 250f2f0b2dc9..74da95f02c76 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -4812,13 +4812,14 @@ public class ActivityManager { /** * Holds the AM lock for the specified amount of milliseconds. * This is intended for use by the tests that need to imitate lock contention. + * The token should be obtained by + * {@link android.content.pm.PackageManager#getHoldLockToken()}. * @hide */ @TestApi - @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) - public void holdLock(int durationMs) { + public void holdLock(IBinder token, int durationMs) { try { - getService().holdLock(durationMs); + getService().holdLock(token, durationMs); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 357b26c3083d..c0e3019f4619 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -689,6 +689,8 @@ interface IActivityManager { /** * Holds the AM lock for the specified amount of milliseconds. * This is intended for use by the tests that need to imitate lock contention. + * The token should be obtained by + * {@link android.content.pm.PackageManager#getHoldLockToken()}. */ - void holdLock(in int durationMs); + void holdLock(in IBinder token, in int durationMs); } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index c32d34457889..106021e81ddc 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -794,5 +794,7 @@ interface IPackageManager { void grantImplicitAccess(int queryingUid, String visibleAuthority); - void holdLock(in int durationMs); + IBinder getHoldLockToken(); + + void holdLock(in IBinder token, in int durationMs); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 3fb9a9e924e7..602bd6c939ba 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -63,6 +63,7 @@ import android.net.wifi.WifiManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.UserHandle; @@ -8462,15 +8463,30 @@ public abstract class PackageManager { } /** + * Returns the token to be used by the subsequent calls to holdLock(). + * @hide + */ + @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) + @TestApi + public IBinder getHoldLockToken() { + try { + return ActivityThread.getPackageManager().getHoldLockToken(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Holds the PM lock for the specified amount of milliseconds. * Intended for use by the tests that need to imitate lock contention. + * The token should be obtained by + * {@link android.content.pm.PackageManager#getHoldLockToken()}. * @hide */ @TestApi - @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) - public void holdLock(int durationMs) { + public void holdLock(IBinder token, int durationMs) { try { - ActivityThread.getPackageManager().holdLock(durationMs); + ActivityThread.getPackageManager().holdLock(token, durationMs); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 43a8992aa74e..d226f6048471 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -755,6 +755,8 @@ interface IWindowManager /** * Holds the WM lock for the specified amount of milliseconds. * Intended for use by the tests that need to imitate lock contention. + * The token should be obtained by + * {@link android.content.pm.PackageManager#getHoldLockToken()}. */ - void holdLock(in int durationMs); + void holdLock(in IBinder token, in int durationMs); } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 2cab32b48793..d540059f993a 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -4069,11 +4069,12 @@ public interface WindowManager extends ViewManager { /** * Holds the WM lock for the specified amount of milliseconds. * Intended for use by the tests that need to imitate lock contention. + * The token should be obtained by + * {@link android.content.pm.PackageManager#getHoldLockToken()}. * @hide */ @TestApi - @RequiresPermission(android.Manifest.permission.INJECT_EVENTS) - default void holdLock(int durationMs) { + default void holdLock(IBinder token, int durationMs) { throw new UnsupportedOperationException(); } } diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index 7dfae002b554..4292a800afe1 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -280,9 +280,9 @@ public final class WindowManagerImpl implements WindowManager { } @Override - public void holdLock(int durationMs) { + public void holdLock(IBinder token, int durationMs) { try { - WindowManagerGlobal.getWindowManagerService().holdLock(durationMs); + WindowManagerGlobal.getWindowManagerService().holdLock(token, durationMs); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/core/java/android/content/pm/TestUtilityService.java b/services/core/java/android/content/pm/TestUtilityService.java new file mode 100644 index 000000000000..426352b250f8 --- /dev/null +++ b/services/core/java/android/content/pm/TestUtilityService.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import android.os.IBinder; + +/** + * Utility methods for testing and debugging. + */ +public interface TestUtilityService { + /** + * Verifies validity of the token passed as a parameter to holdLock(). Throws an exception if + * the token is invalid. + */ + void verifyHoldLockToken(IBinder token); +} diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 51cbfcf64322..50c992c1eb16 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -208,6 +208,7 @@ import android.content.pm.ProviderInfoList; import android.content.pm.ResolveInfo; import android.content.pm.SELinuxUtil; import android.content.pm.ServiceInfo; +import android.content.pm.TestUtilityService; import android.content.pm.UserInfo; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; @@ -1311,6 +1312,7 @@ public class ActivityManagerService extends IActivityManager.Stub PackageManagerInternal mPackageManagerInt; PermissionManagerServiceInternal mPermissionManagerInt; + private TestUtilityService mTestUtilityService; /** * Whether to force background check on all apps (for battery saver) or not. @@ -5784,6 +5786,14 @@ public class ActivityManagerService extends IActivityManager.Stub return mPermissionManagerInt; } + private TestUtilityService getTestUtilityServiceLocked() { + if (mTestUtilityService == null) { + mTestUtilityService = + LocalServices.getService(TestUtilityService.class); + } + return mTestUtilityService; + } + @Override public void appNotResponding(final String reason) { final int callingPid = Binder.getCallingPid(); @@ -17343,11 +17353,12 @@ public class ActivityManagerService extends IActivityManager.Stub /** * Holds the AM lock for the specified amount of milliseconds. * Intended for use by the tests that need to imitate lock contention. - * Requires permission identity of the shell UID. + * The token should be obtained by + * {@link android.content.pm.PackageManager#getHoldLockToken()}. */ @Override - public void holdLock(int durationMs) { - enforceCallingPermission(Manifest.permission.INJECT_EVENTS, "holdLock"); + public void holdLock(IBinder token, int durationMs) { + getTestUtilityServiceLocked().verifyHoldLockToken(token); synchronized (this) { SystemClock.sleep(durationMs); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 1896c9f08f83..7eb4fd968c36 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -222,6 +222,7 @@ import android.content.pm.SharedLibraryInfo; import android.content.pm.Signature; import android.content.pm.SigningInfo; import android.content.pm.SuspendDialogInfo; +import android.content.pm.TestUtilityService; import android.content.pm.UserInfo; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VerifierInfo; @@ -480,7 +481,7 @@ import java.util.function.Supplier; * </pre> */ public class PackageManagerService extends IPackageManager.Stub - implements PackageSender { + implements PackageSender, TestUtilityService { static final String TAG = "PackageManager"; public static final boolean DEBUG_SETTINGS = false; static final boolean DEBUG_PREFERRED = false; @@ -820,6 +821,7 @@ public class PackageManagerService extends IPackageManager.Stub boolean mPromoteSystemApps; private final PackageManagerInternal mPmInternal; + private final TestUtilityService mTestUtilityService; @GuardedBy("mLock") @@ -1193,6 +1195,7 @@ public class PackageManagerService extends IPackageManager.Stub public IPermissionManager permissionManagerService; public PendingPackageBroadcasts pendingPackageBroadcasts; public PackageManagerInternal pmInternal; + public TestUtilityService testUtilityService; public ProcessLoggingHandler processLoggingHandler; public ProtectedPackages protectedPackages; public @NonNull String requiredInstallerPackage; @@ -2957,6 +2960,7 @@ public class PackageManagerService extends IPackageManager.Stub mPendingBroadcasts = testParams.pendingPackageBroadcasts; mPermissionManagerService = testParams.permissionManagerService; mPmInternal = testParams.pmInternal; + mTestUtilityService = testParams.testUtilityService; mProcessLoggingHandler = testParams.processLoggingHandler; mProtectedPackages = testParams.protectedPackages; mSeparateProcesses = testParams.separateProcesses; @@ -3027,6 +3031,8 @@ public class PackageManagerService extends IPackageManager.Stub // Expose private service for system components to use. mPmInternal = new PackageManagerInternalImpl(); + LocalServices.addService(TestUtilityService.class, this); + mTestUtilityService = LocalServices.getService(TestUtilityService.class); LocalServices.addService(PackageManagerInternal.class, mPmInternal); mUserManager = injector.getUserManagerService(); mComponentResolver = injector.getComponentResolver(); @@ -26366,9 +26372,39 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public void holdLock(int durationMs) { + public IBinder getHoldLockToken() { + if (!Build.IS_DEBUGGABLE) { + throw new SecurityException("getHoldLockToken requires a debuggable build"); + } + mContext.enforceCallingPermission( - Manifest.permission.INJECT_EVENTS, "holdLock requires shell identity"); + Manifest.permission.INJECT_EVENTS, + "getHoldLockToken requires INJECT_EVENTS permission"); + + final Binder token = new Binder(); + token.attachInterface(this, "holdLock:" + Binder.getCallingUid()); + return token; + } + + @Override + public void verifyHoldLockToken(IBinder token) { + if (!Build.IS_DEBUGGABLE) { + throw new SecurityException("holdLock requires a debuggable build"); + } + + if (token == null) { + throw new SecurityException("null holdLockToken"); + } + + if (token.queryLocalInterface("holdLock:" + Binder.getCallingUid()) != this) { + throw new SecurityException("Invalid holdLock() token"); + } + } + + @Override + public void holdLock(IBinder token, int durationMs) { + mTestUtilityService.verifyHoldLockToken(token); + synchronized (mLock) { SystemClock.sleep(durationMs); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0585679f7fbb..81fe4748a932 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -153,6 +153,7 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.TestUtilityService; import android.content.res.Configuration; import android.content.res.TypedArray; import android.database.ContentObserver; @@ -564,6 +565,7 @@ public class WindowManagerService extends IWindowManager.Stub final AppOpsManager mAppOps; final PackageManagerInternal mPmInternal; + private final TestUtilityService mTestUtilityService; final DisplayWindowSettings mDisplayWindowSettings; @@ -1265,6 +1267,7 @@ public class WindowManagerService extends IWindowManager.Stub mAppOps.startWatchingMode(AppOpsManager.OP_TOAST_WINDOW, null, opListener); mPmInternal = LocalServices.getService(PackageManagerInternal.class); + mTestUtilityService = LocalServices.getService(TestUtilityService.class); final IntentFilter suspendPackagesFilter = new IntentFilter(); suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_SUSPENDED); suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_UNSUSPENDED); @@ -8352,9 +8355,8 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void holdLock(int durationMs) { - mContext.enforceCallingPermission( - Manifest.permission.INJECT_EVENTS, "holdLock requires shell identity"); + public void holdLock(IBinder token, int durationMs) { + mTestUtilityService.verifyHoldLockToken(token); synchronized (mGlobalLock) { SystemClock.sleep(durationMs); |