Merge "Reduce lock contention." into tm-dev

This commit is contained in:
Alex Buynytskyy
2022-03-02 02:31:06 +00:00
committed by Android (Google) Code Review
3 changed files with 48 additions and 57 deletions

View File

@@ -165,51 +165,36 @@ public class ApplicationPackageManager extends PackageManager {
public static final String PERMISSION_CONTROLLER_RESOURCE_PACKAGE = public static final String PERMISSION_CONTROLLER_RESOURCE_PACKAGE =
"com.android.permissioncontroller"; "com.android.permissioncontroller";
private final Object mLock = new Object(); private volatile UserManager mUserManager;
private volatile PermissionManager mPermissionManager;
@GuardedBy("mLock") private volatile PackageInstaller mInstaller;
private UserManager mUserManager; private volatile ArtManager mArtManager;
@GuardedBy("mLock") private volatile DevicePolicyManager mDevicePolicyManager;
private PermissionManager mPermissionManager; private volatile String mPermissionsControllerPackageName;
@GuardedBy("mLock")
private PackageInstaller mInstaller;
@GuardedBy("mLock")
private ArtManager mArtManager;
@GuardedBy("mLock")
private DevicePolicyManager mDevicePolicyManager;
@GuardedBy("mDelegates") @GuardedBy("mDelegates")
private final ArrayList<MoveCallbackDelegate> mDelegates = new ArrayList<>(); private final ArrayList<MoveCallbackDelegate> mDelegates = new ArrayList<>();
@GuardedBy("mLock")
private String mPermissionsControllerPackageName;
UserManager getUserManager() { UserManager getUserManager() {
synchronized (mLock) {
if (mUserManager == null) { if (mUserManager == null) {
mUserManager = UserManager.get(mContext); mUserManager = UserManager.get(mContext);
} }
return mUserManager; return mUserManager;
} }
}
DevicePolicyManager getDevicePolicyManager() { DevicePolicyManager getDevicePolicyManager() {
synchronized (mLock) {
if (mDevicePolicyManager == null) { if (mDevicePolicyManager == null) {
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
} }
return mDevicePolicyManager; return mDevicePolicyManager;
} }
}
private PermissionManager getPermissionManager() { private PermissionManager getPermissionManager() {
synchronized (mLock) {
if (mPermissionManager == null) { if (mPermissionManager == null) {
mPermissionManager = mContext.getSystemService(PermissionManager.class); mPermissionManager = mContext.getSystemService(PermissionManager.class);
} }
return mPermissionManager; return mPermissionManager;
} }
}
@Override @Override
public int getUserId() { public int getUserId() {
@@ -851,7 +836,6 @@ public class ApplicationPackageManager extends PackageManager {
*/ */
@Override @Override
public String getPermissionControllerPackageName() { public String getPermissionControllerPackageName() {
synchronized (mLock) {
if (mPermissionsControllerPackageName == null) { if (mPermissionsControllerPackageName == null) {
try { try {
mPermissionsControllerPackageName = mPM.getPermissionControllerPackageName(); mPermissionsControllerPackageName = mPM.getPermissionControllerPackageName();
@@ -861,7 +845,6 @@ public class ApplicationPackageManager extends PackageManager {
} }
return mPermissionsControllerPackageName; return mPermissionsControllerPackageName;
} }
}
/** /**
* @hide * @hide
@@ -3235,7 +3218,6 @@ public class ApplicationPackageManager extends PackageManager {
@Override @Override
public PackageInstaller getPackageInstaller() { public PackageInstaller getPackageInstaller() {
synchronized (mLock) {
if (mInstaller == null) { if (mInstaller == null) {
try { try {
mInstaller = new PackageInstaller(mPM.getPackageInstaller(), mInstaller = new PackageInstaller(mPM.getPackageInstaller(),
@@ -3246,7 +3228,6 @@ public class ApplicationPackageManager extends PackageManager {
} }
return mInstaller; return mInstaller;
} }
}
@Override @Override
public boolean isPackageAvailable(String packageName) { public boolean isPackageAvailable(String packageName) {
@@ -3583,7 +3564,6 @@ public class ApplicationPackageManager extends PackageManager {
@Override @Override
public ArtManager getArtManager() { public ArtManager getArtManager() {
synchronized (mLock) {
if (mArtManager == null) { if (mArtManager == null) {
try { try {
mArtManager = new ArtManager(mContext, mPM.getArtManager()); mArtManager = new ArtManager(mContext, mPM.getArtManager());
@@ -3593,7 +3573,6 @@ public class ApplicationPackageManager extends PackageManager {
} }
return mArtManager; return mArtManager;
} }
}
@Override @Override
public String getDefaultTextClassifierPackageName() { public String getDefaultTextClassifierPackageName() {

View File

@@ -6692,6 +6692,11 @@ public class PackageManagerService extends IPackageManager.Stub
@Override @Override
public IPackageInstaller getPackageInstaller() { public IPackageInstaller getPackageInstaller() {
// Return installer service for internal calls.
if (PackageManagerServiceUtils.isSystemOrRoot()) {
return mInstallerService;
}
// Return null for InstantApps.
if (getInstantAppPackageName(Binder.getCallingUid()) != null) { if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return null; return null;
} }

View File

@@ -1249,6 +1249,14 @@ public class PackageManagerServiceUtils {
} }
} }
/**
* Check if the Binder caller is system UID or root's UID.
*/
public static boolean isSystemOrRoot() {
final int uid = Binder.getCallingUid();
return uid == Process.SYSTEM_UID || uid == Process.ROOT_UID;
}
/** /**
* Enforces that only the system UID or root's UID can call a method exposed * Enforces that only the system UID or root's UID can call a method exposed
* via Binder. * via Binder.
@@ -1257,8 +1265,7 @@ public class PackageManagerServiceUtils {
* @throws SecurityException if the caller is not system or root * @throws SecurityException if the caller is not system or root
*/ */
public static void enforceSystemOrRoot(String message) { public static void enforceSystemOrRoot(String message) {
final int uid = Binder.getCallingUid(); if (!isSystemOrRoot()) {
if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID) {
throw new SecurityException(message); throw new SecurityException(message);
} }
} }