Merge "Reduce lock contention." into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4b7f97e065
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user