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,50 +165,35 @@ 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
@@ -851,16 +836,14 @@ 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(); } catch (RemoteException e) {
} catch (RemoteException e) { throw e.rethrowFromSystemServer();
throw e.rethrowFromSystemServer();
}
} }
return mPermissionsControllerPackageName;
} }
return mPermissionsControllerPackageName;
} }
/** /**
@@ -3235,17 +3218,15 @@ 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(), mContext.getPackageName(), mContext.getAttributionTag(), getUserId());
mContext.getPackageName(), mContext.getAttributionTag(), getUserId()); } catch (RemoteException e) {
} catch (RemoteException e) { throw e.rethrowFromSystemServer();
throw e.rethrowFromSystemServer();
}
} }
return mInstaller;
} }
return mInstaller;
} }
@Override @Override
@@ -3583,16 +3564,14 @@ 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()); } catch (RemoteException e) {
} catch (RemoteException e) { throw e.rethrowFromSystemServer();
throw e.rethrowFromSystemServer();
}
} }
return mArtManager;
} }
return mArtManager;
} }
@Override @Override

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);
} }
} }