From cf45006b68859a5826ce499248467e406f0e4027 Mon Sep 17 00:00:00 2001 From: Adam Bookatz Date: Wed, 31 Mar 2021 16:29:44 -0700 Subject: [PATCH] PMS caches DPM Repeatedly fetching DPM is a significant source of slowness, so we cache it. Test: treehugger and `atest CtsSuspendAppsTestCases` Bug: 177255383 Change-Id: Ic9999827d5500d0c18a9160719c1a6d0d85e0136 --- .../android/server/pm/PackageManagerService.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 764fa0218023f..b35d4a551bf92 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1494,6 +1494,9 @@ public class PackageManagerService extends IPackageManager.Stub // List of packages names to keep cached, even if they are uninstalled for all users private List mKeepUninstalledPackages; + // Cached reference to IDevicePolicyManager. + private IDevicePolicyManager mDevicePolicyManager = null; + private File mCacheDir; private Future mPrepareAppDataFuture; @@ -20827,8 +20830,7 @@ public class PackageManagerService extends IPackageManager.Stub } private boolean isPackageDeviceAdmin(String packageName, int userId) { - IDevicePolicyManager dpm = IDevicePolicyManager.Stub.asInterface( - ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)); + final IDevicePolicyManager dpm = getDevicePolicyManager(); try { if (dpm != null) { final ComponentName deviceOwnerComponentName = dpm.getDeviceOwnerComponent( @@ -20860,6 +20862,16 @@ public class PackageManagerService extends IPackageManager.Stub return false; } + /** Returns the device policy manager interface. */ + private IDevicePolicyManager getDevicePolicyManager() { + if (mDevicePolicyManager == null) { + // No need to synchronize; worst-case scenario it will be fetched twice. + mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface( + ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)); + } + return mDevicePolicyManager; + } + private boolean shouldKeepUninstalledPackageLPr(String packageName) { return mKeepUninstalledPackages != null && mKeepUninstalledPackages.contains(packageName); }