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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user