Merge "Reduce lock contention." into tm-dev am: 4b7f97e065

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16987851

Change-Id: If0c7f7af24f6cbe4fb885abd5de61aab117ad9a1
This commit is contained in:
Alex Buynytskyy
2022-03-02 02:47:35 +00:00
committed by Automerger Merge Worker
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 =
"com.android.permissioncontroller";
private final Object mLock = new Object();
@GuardedBy("mLock")
private UserManager mUserManager;
@GuardedBy("mLock")
private PermissionManager mPermissionManager;
@GuardedBy("mLock")
private PackageInstaller mInstaller;
@GuardedBy("mLock")
private ArtManager mArtManager;
@GuardedBy("mLock")
private DevicePolicyManager mDevicePolicyManager;
private volatile UserManager mUserManager;
private volatile PermissionManager mPermissionManager;
private volatile PackageInstaller mInstaller;
private volatile ArtManager mArtManager;
private volatile DevicePolicyManager mDevicePolicyManager;
private volatile String mPermissionsControllerPackageName;
@GuardedBy("mDelegates")
private final ArrayList<MoveCallbackDelegate> mDelegates = new ArrayList<>();
@GuardedBy("mLock")
private String mPermissionsControllerPackageName;
UserManager getUserManager() {
synchronized (mLock) {
if (mUserManager == null) {
mUserManager = UserManager.get(mContext);
}
return mUserManager;
if (mUserManager == null) {
mUserManager = UserManager.get(mContext);
}
return mUserManager;
}
DevicePolicyManager getDevicePolicyManager() {
synchronized (mLock) {
if (mDevicePolicyManager == null) {
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
}
return mDevicePolicyManager;
if (mDevicePolicyManager == null) {
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
}
return mDevicePolicyManager;
}
private PermissionManager getPermissionManager() {
synchronized (mLock) {
if (mPermissionManager == null) {
mPermissionManager = mContext.getSystemService(PermissionManager.class);
}
return mPermissionManager;
if (mPermissionManager == null) {
mPermissionManager = mContext.getSystemService(PermissionManager.class);
}
return mPermissionManager;
}
@Override
@@ -851,16 +836,14 @@ public class ApplicationPackageManager extends PackageManager {
*/
@Override
public String getPermissionControllerPackageName() {
synchronized (mLock) {
if (mPermissionsControllerPackageName == null) {
try {
mPermissionsControllerPackageName = mPM.getPermissionControllerPackageName();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
if (mPermissionsControllerPackageName == null) {
try {
mPermissionsControllerPackageName = mPM.getPermissionControllerPackageName();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
return mPermissionsControllerPackageName;
}
return mPermissionsControllerPackageName;
}
/**
@@ -3235,17 +3218,15 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public PackageInstaller getPackageInstaller() {
synchronized (mLock) {
if (mInstaller == null) {
try {
mInstaller = new PackageInstaller(mPM.getPackageInstaller(),
mContext.getPackageName(), mContext.getAttributionTag(), getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
if (mInstaller == null) {
try {
mInstaller = new PackageInstaller(mPM.getPackageInstaller(),
mContext.getPackageName(), mContext.getAttributionTag(), getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
return mInstaller;
}
return mInstaller;
}
@Override
@@ -3583,16 +3564,14 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ArtManager getArtManager() {
synchronized (mLock) {
if (mArtManager == null) {
try {
mArtManager = new ArtManager(mContext, mPM.getArtManager());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
if (mArtManager == null) {
try {
mArtManager = new ArtManager(mContext, mPM.getArtManager());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
return mArtManager;
}
return mArtManager;
}
@Override

View File

@@ -6692,6 +6692,11 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public IPackageInstaller getPackageInstaller() {
// Return installer service for internal calls.
if (PackageManagerServiceUtils.isSystemOrRoot()) {
return mInstallerService;
}
// Return null for InstantApps.
if (getInstantAppPackageName(Binder.getCallingUid()) != 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
* via Binder.
@@ -1257,8 +1265,7 @@ public class PackageManagerServiceUtils {
* @throws SecurityException if the caller is not system or root
*/
public static void enforceSystemOrRoot(String message) {
final int uid = Binder.getCallingUid();
if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID) {
if (!isSystemOrRoot()) {
throw new SecurityException(message);
}
}