summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/test-current.txt7
-rw-r--r--api/test-lint-baseline.txt26
-rw-r--r--core/java/android/app/ActivityManager.java7
-rw-r--r--core/java/android/app/IActivityManager.aidl4
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl4
-rw-r--r--core/java/android/content/pm/PackageManager.java22
-rw-r--r--core/java/android/view/IWindowManager.aidl4
-rw-r--r--core/java/android/view/WindowManager.java5
-rw-r--r--core/java/android/view/WindowManagerImpl.java4
-rw-r--r--services/core/java/android/content/pm/TestUtilityService.java30
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java17
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java42
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java8
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);