diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 805fbbc75a878..900a4e4a84982 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -506,9 +506,6 @@ public class PackageManagerService extends IPackageManager.Stub private static final boolean HIDE_EPHEMERAL_APIS = false; - private static final boolean ENABLE_FREE_CACHE_V2 = - SystemProperties.getBoolean("fw.free_cache_v2", true); - private static final String PRECOMPILE_LAYOUTS = "pm.precompile_layouts"; private static final int RADIO_UID = Process.PHONE_UID; @@ -738,8 +735,9 @@ public class PackageManagerService extends IPackageManager.Stub private final ProcessLoggingHandler mProcessLoggingHandler; - final int mSdkVersion = Build.VERSION.SDK_INT; + private final boolean mEnableFreeCacheV2; + final int mSdkVersion; final Context mContext; final boolean mFactoryTest; final boolean mOnlyCore; @@ -894,24 +892,8 @@ public class PackageManagerService extends IPackageManager.Stub T produce(Injector injector, PackageManagerService packageManager); } - static class LocalServicesProducer implements Producer { - private final Class mProducingClass; - LocalServicesProducer(Class clazz) { - this.mProducingClass = clazz; - } - public T produce(Injector injector, PackageManagerService packageManager) { - return LocalServices.getService(mProducingClass); - } - } - - static class SystemServiceProducer implements Producer { - private final Class mProducingClass; - SystemServiceProducer(Class clazz) { - this.mProducingClass = clazz; - } - public T produce(Injector injector, PackageManagerService packageManager) { - return packageManager.mContext.getSystemService(mProducingClass); - } + interface ServiceProducer { + T produce(Class c); } @VisibleForTesting(visibility = Visibility.PRIVATE) @@ -941,41 +923,43 @@ public class PackageManagerService extends IPackageManager.Stub // ----- producers ----- private final Singleton mComponentResolverProducer; - private final Singleton mPermissionManagerProducer; + private final Singleton mPermissionManagerServiceProducer; private final Singleton mUserManagerProducer; private final Singleton mSettingsProducer; - private final Singleton mActivityTaskManagerProducer; - private final Singleton mActivityManagerInternalProducer; - private final Singleton mLocalDeviceIdleController; - private final Singleton mStorageManagerInternalProducer; - private final Singleton mNetworkPolicyManagerProducer; - private final Singleton mPermissionPolicyProducer; - private final Singleton mDeviceStorageMonitorProducer; - private final Singleton mDisplayManagerProducer; - private final Singleton mStorageManagerProducer; - private final Singleton mAppOpsManagerProducer; private final Singleton mAppsFilterProducer; private final Singleton mPlatformCompatProducer; + private final Singleton mSystemConfigProducer; + private final Singleton mPackageDexOptimizerProducer; + private final Singleton mDexManagerProducer; + private final Singleton mArtManagerServiceProducer; + private final Singleton mApexManagerProducer; + private final Singleton mViewCompilerProducer; + private final Singleton mPermissionManagerProducer; + private final Singleton mIncrementalManagerProducer; + private final SystemWrapper mSystemWrapper; + private final ServiceProducer mGetLocalServiceProducer; + private final ServiceProducer mGetSystemServiceProducer; Injector(Context context, Object lock, Installer installer, Object installLock, PackageAbiHelper abiHelper, Handler backgroundHandler, Producer componentResolverProducer, - Producer permissionManagerProducer, + Producer permissionManagerServiceProducer, Producer userManagerProducer, Producer settingsProducer, - Producer activityTaskManagerProducer, - Producer activityManagerInternalProducer, - Producer deviceIdleControllerProducer, - Producer storageManagerInternalProducer, - Producer networkPolicyManagerProducer, - Producer permissionPolicyProvider, - Producer deviceStorageMonitorProducer, - Producer displayManagerProducer, - Producer storageManagerProducer, - Producer appOpsManagerProducer, Producer appsFilterProducer, - Producer platformCompatProducer) { + Producer platformCompatProducer, + Producer systemConfigProducer, + Producer packageDexOptimizerProducer, + Producer dexManagerProducer, + Producer artManagerServiceProducer, + Producer apexManagerProducer, + Producer permissionManagerProducer, + Producer viewCompilerProducer, + Producer incrementalManagerProducer, + SystemWrapper systemWrapper, + ServiceProducer getLocalServiceProducer, + ServiceProducer getSystemServiceProducer) { mContext = context; mLock = lock; mInstaller = installer; @@ -984,21 +968,22 @@ public class PackageManagerService extends IPackageManager.Stub mBackgroundHandler = backgroundHandler; mBackgroundExecutor = new HandlerExecutor(backgroundHandler); mComponentResolverProducer = new Singleton<>(componentResolverProducer); - mPermissionManagerProducer = new Singleton<>(permissionManagerProducer); + mPermissionManagerServiceProducer = new Singleton<>(permissionManagerServiceProducer); mUserManagerProducer = new Singleton<>(userManagerProducer); mSettingsProducer = new Singleton<>(settingsProducer); - mActivityTaskManagerProducer = new Singleton<>(activityTaskManagerProducer); - mActivityManagerInternalProducer = new Singleton<>(activityManagerInternalProducer); - mLocalDeviceIdleController = new Singleton<>(deviceIdleControllerProducer); - mStorageManagerInternalProducer = new Singleton<>(storageManagerInternalProducer); - mNetworkPolicyManagerProducer = new Singleton<>(networkPolicyManagerProducer); - mPermissionPolicyProducer = new Singleton<>(permissionPolicyProvider); - mDeviceStorageMonitorProducer = new Singleton<>(deviceStorageMonitorProducer); - mDisplayManagerProducer = new Singleton<>(displayManagerProducer); - mStorageManagerProducer = new Singleton<>(storageManagerProducer); - mAppOpsManagerProducer = new Singleton<>(appOpsManagerProducer); mAppsFilterProducer = new Singleton<>(appsFilterProducer); mPlatformCompatProducer = new Singleton<>(platformCompatProducer); + mSystemConfigProducer = new Singleton<>(systemConfigProducer); + mPackageDexOptimizerProducer = new Singleton<>(packageDexOptimizerProducer); + mDexManagerProducer = new Singleton<>(dexManagerProducer); + mArtManagerServiceProducer = new Singleton<>(artManagerServiceProducer); + mApexManagerProducer = new Singleton<>(apexManagerProducer); + mPermissionManagerProducer = new Singleton<>(permissionManagerProducer); + mViewCompilerProducer = new Singleton<>(viewCompilerProducer); + mIncrementalManagerProducer = new Singleton<>(incrementalManagerProducer); + mSystemWrapper = systemWrapper; + mGetLocalServiceProducer = getLocalServiceProducer; + mGetSystemServiceProducer = getSystemServiceProducer; } /** @@ -1038,7 +1023,7 @@ public class PackageManagerService extends IPackageManager.Stub } public PermissionManagerServiceInternal getPermissionManagerServiceInternal() { - return mPermissionManagerProducer.get(this, mPackageManager); + return mPermissionManagerServiceProducer.get(this, mPackageManager); } public Context getContext() { @@ -1049,46 +1034,6 @@ public class PackageManagerService extends IPackageManager.Stub return mSettingsProducer.get(this, mPackageManager); } - public ActivityTaskManagerInternal getActivityTaskManagerInternal() { - return mActivityTaskManagerProducer.get(this, mPackageManager); - } - - public ActivityManagerInternal getActivityManagerInternal() { - return mActivityManagerInternalProducer.get(this, mPackageManager); - } - - public DeviceIdleInternal getLocalDeviceIdleController() { - return mLocalDeviceIdleController.get(this, mPackageManager); - } - - public StorageManagerInternal getStorageManagerInternal() { - return mStorageManagerInternalProducer.get(this, mPackageManager); - } - - public NetworkPolicyManagerInternal getNetworkPolicyManagerInternal() { - return mNetworkPolicyManagerProducer.get(this, mPackageManager); - } - - public PermissionPolicyInternal getPermissionPolicyInternal() { - return mPermissionPolicyProducer.get(this, mPackageManager); - } - - public DeviceStorageMonitorInternal getDeviceStorageMonitorInternal() { - return mDeviceStorageMonitorProducer.get(this, mPackageManager); - } - - public DisplayManager getDisplayManager() { - return mDisplayManagerProducer.get(this, mPackageManager); - } - - public StorageManager getStorageManager() { - return mStorageManagerProducer.get(this, mPackageManager); - } - - public AppOpsManager getAppOpsManager() { - return mAppOpsManagerProducer.get(this, mPackageManager); - } - public AppsFilter getAppsFilter() { return mAppsFilterProducer.get(this, mPackageManager); } @@ -1097,6 +1042,34 @@ public class PackageManagerService extends IPackageManager.Stub return mPlatformCompatProducer.get(this, mPackageManager); } + public SystemConfig getSystemConfig() { + return mSystemConfigProducer.get(this, mPackageManager); + } + + public PackageDexOptimizer getPackageDexOptimizer() { + return mPackageDexOptimizerProducer.get(this, mPackageManager); + } + + public DexManager getDexManager() { + return mDexManagerProducer.get(this, mPackageManager); + } + + public ArtManagerService getArtManagerService() { + return mArtManagerServiceProducer.get(this, mPackageManager); + } + + public ApexManager getApexManager() { + return mApexManagerProducer.get(this, mPackageManager); + } + + public ViewCompiler getViewCompiler() { + return mViewCompilerProducer.get(this, mPackageManager); + } + + public IPermissionManager getPermissionManagerService() { + return mPermissionManagerProducer.get(this, mPackageManager); + } + public Handler getBackgroundHandler() { return mBackgroundHandler; } @@ -1104,6 +1077,70 @@ public class PackageManagerService extends IPackageManager.Stub public Executor getBackgroundExecutor() { return mBackgroundExecutor; } + + public T getLocalService(Class c) { + return mGetLocalServiceProducer.produce(c); + } + + public T getSystemService(Class c) { + return mGetSystemServiceProducer.produce(c); + } + + public SystemWrapper getSystemWrapper() { + return mSystemWrapper; + } + + public IncrementalManager getIncrementalManager() { + return mIncrementalManagerProducer.get(this, mPackageManager); + } + } + + /** Provides an abstraction to static access to system state. */ + public interface SystemWrapper { + /** @see SystemProperties#get(String) */ + String getProperty(String key); + /** @see SystemProperties#getInt(String, int) */ + int getPropertyInt(String key, int defValue); + /** @see SystemProperties#getBoolean(String, boolean) */ + boolean getPropertyBoolean(String key, boolean defValue); + /** @see SystemProperties#digestOf(String...) */ + String digestOfProperties(@NonNull String... keys); + /** @see SystemProperties#set(String, String) */ + void setProperty(String key, String value); + /** @see Build.VERSION#SDK_INT */ + int getSdkInt(); + } + + private static class DefaultSystemWrapper implements SystemWrapper { + @Override + public String getProperty(String key) { + return SystemProperties.get(key); + } + + @Override + public int getPropertyInt(String key, int defValue) { + return SystemProperties.getInt(key, defValue); + } + + @Override + public boolean getPropertyBoolean(String key, boolean defValue) { + return SystemProperties.getBoolean(key, defValue); + } + + @Override + public String digestOfProperties(String... keys) { + return SystemProperties.digestOf(keys); + } + + @Override + public void setProperty(String key, String value) { + SystemProperties.set(key, value); + } + + @Override + public int getSdkInt() { + return Build.VERSION.SDK_INT; + } } @VisibleForTesting(visibility = Visibility.PRIVATE) @@ -1161,6 +1198,8 @@ public class PackageManagerService extends IPackageManager.Stub public @Nullable String retailDemoPackage; public ComponentName resolveComponentName; public ArrayMap packages; + public boolean enableFreeCacheV2; + public int sdkVersion; } private final AppsFilter mAppsFilter; @@ -1354,7 +1393,7 @@ public class PackageManagerService extends IPackageManager.Stub options.setTemporaryAppWhitelistDuration(whitelistTimeout); DeviceIdleInternal idleController = - mInjector.getLocalDeviceIdleController(); + mInjector.getLocalService(DeviceIdleInternal.class); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), mIntentFilterVerifierComponent.getPackageName(), whitelistTimeout, UserHandle.USER_SYSTEM, true, "intent filter verifier"); @@ -1427,7 +1466,7 @@ public class PackageManagerService extends IPackageManager.Stub case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS: if (!verified) { // Don't demote if sysconfig says 'always' - SystemConfig systemConfig = SystemConfig.getInstance(); + SystemConfig systemConfig = mInjector.getSystemConfig(); ArraySet packages = systemConfig.getLinkedApps(); if (!packages.contains(packageName)) { // updatedStatus is already UNDEFINED @@ -2324,7 +2363,8 @@ public class PackageManagerService extends IPackageManager.Stub // Send broadcast package appeared if external for all users if (res.pkg.isExternalStorage()) { if (!update) { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService( + StorageManager.class); VolumeInfo volume = storage.findVolumeByUuid( res.pkg.getStorageUuid().toString()); @@ -2503,7 +2543,7 @@ public class PackageManagerService extends IPackageManager.Stub ApkChecksums.Injector injector = new ApkChecksums.Injector( () -> mContext, () -> mInjector.getBackgroundHandler(), - () -> mContext.getSystemService(IncrementalManager.class)); + () -> mInjector.getIncrementalManager()); ApkChecksums.getChecksums(filesToChecksum, optional, required, trustedCerts, statusReceiver, injector); }); @@ -2679,31 +2719,32 @@ public class PackageManagerService extends IPackageManager.Stub Injector injector = new Injector( context, lock, installer, installLock, new PackageAbiHelperImpl(), backgroundHandler, - (i, pm) -> - new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock), - (i, pm) -> - PermissionManagerService.create(context, lock), - (i, pm) -> - new UserManagerService(context, pm, + (i, pm) -> new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock), + (i, pm) -> PermissionManagerService.create(context, lock), + (i, pm) -> new UserManagerService(context, pm, new UserDataPreparer(installer, installLock, context, onlyCore), lock), - (i, pm) -> - new Settings(Environment.getDataDirectory(), - i.getPermissionManagerServiceInternal().getPermissionSettings(), - RuntimePermissionsPersistence.createInstance(), - i.getPermissionManagerServiceInternal(), lock), - new Injector.LocalServicesProducer<>(ActivityTaskManagerInternal.class), - new Injector.LocalServicesProducer<>(ActivityManagerInternal.class), - new Injector.LocalServicesProducer<>(DeviceIdleInternal.class), - new Injector.LocalServicesProducer<>(StorageManagerInternal.class), - new Injector.LocalServicesProducer<>(NetworkPolicyManagerInternal.class), - new Injector.LocalServicesProducer<>(PermissionPolicyInternal.class), - new Injector.LocalServicesProducer<>(DeviceStorageMonitorInternal.class), - new Injector.SystemServiceProducer<>(DisplayManager.class), - new Injector.SystemServiceProducer<>(StorageManager.class), - new Injector.SystemServiceProducer<>(AppOpsManager.class), + (i, pm) -> new Settings(Environment.getDataDirectory(), + i.getPermissionManagerServiceInternal().getPermissionSettings(), + RuntimePermissionsPersistence.createInstance(), + i.getPermissionManagerServiceInternal(), lock), (i, pm) -> AppsFilter.create(pm.mPmInternal, i), - (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat")); + (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"), + (i, pm) -> SystemConfig.getInstance(), + (i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(), + i.getContext(), "*dexopt*"), + (i, pm) -> new DexManager(i.getContext(), pm, i.getPackageDexOptimizer(), + i.getInstaller(), i.getInstallLock()), + (i, pm) -> new ArtManagerService(i.getContext(), pm, i.getInstaller(), + i.getInstallLock()), + (i, pm) -> ApexManager.getInstance(), + (i, pm) -> (IPermissionManager) ServiceManager.getService("permissionmgr"), + (i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()), + (i, pm) -> (IncrementalManager) + pm.mContext.getSystemService(Context.INCREMENTAL_SERVICE), + new DefaultSystemWrapper(), + LocalServices::getService, + context::getSystemService); PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest); t.traceEnd(); // "create package manager" @@ -2776,16 +2817,17 @@ public class PackageManagerService extends IPackageManager.Stub * reasons. This simply requests that the copy takes place and awaits confirmation of its * completion. See platform/system/extras/cppreopt/ for the implementation of the actual copy. */ - private static void requestCopyPreoptedFiles() { + private static void requestCopyPreoptedFiles(Injector injector) { final int WAIT_TIME_MS = 100; final String CP_PREOPT_PROPERTY = "sys.cppreopt"; - if (SystemProperties.getInt("ro.cp_system_other_odex", 0) == 1) { - SystemProperties.set(CP_PREOPT_PROPERTY, "requested"); + if (injector.getSystemWrapper().getPropertyInt("ro.cp_system_other_odex", 0) == 1) { + injector.getSystemWrapper().setProperty(CP_PREOPT_PROPERTY, "requested"); // We will wait for up to 100 seconds. final long timeStart = SystemClock.uptimeMillis(); final long timeEnd = timeStart + 100 * 1000; long timeNow = timeStart; - while (!SystemProperties.get(CP_PREOPT_PROPERTY).equals("finished")) { + while (!injector.getSystemWrapper() + .getProperty(CP_PREOPT_PROPERTY).equals("finished")) { try { Thread.sleep(WAIT_TIME_MS); } catch (InterruptedException e) { @@ -2793,7 +2835,7 @@ public class PackageManagerService extends IPackageManager.Stub } timeNow = SystemClock.uptimeMillis(); if (timeNow > timeEnd) { - SystemProperties.set(CP_PREOPT_PROPERTY, "timed-out"); + injector.getSystemWrapper().setProperty(CP_PREOPT_PROPERTY, "timed-out"); Slog.wtf(TAG, "cppreopt did not finish!"); break; } @@ -2925,6 +2967,8 @@ public class PackageManagerService extends IPackageManager.Stub mResolveComponentName = testParams.resolveComponentName; mPackages.putAll(testParams.packages); + mEnableFreeCacheV2 = testParams.enableFreeCacheV2; + mSdkVersion = testParams.sdkVersion; } public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) { @@ -2950,6 +2994,7 @@ public class PackageManagerService extends IPackageManager.Stub LockGuard.installLock(mLock, LockGuard.INDEX_PACKAGES); EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis()); + mSdkVersion = injector.getSystemWrapper().getSdkInt(); if (mSdkVersion <= 0) { Slog.w(TAG, "**** ro.build.version.sdk not set!"); @@ -2960,6 +3005,8 @@ public class PackageManagerService extends IPackageManager.Stub mOnlyCore = onlyCore; mMetrics = new DisplayMetrics(); mInstaller = injector.getInstaller(); + mEnableFreeCacheV2 = + injector.getSystemWrapper().getPropertyBoolean("fw.free_cache_v2", true); // Create sub-components that provide services / data. Order here is important. t.traceBegin("createSubComponents"); @@ -2971,9 +3018,8 @@ public class PackageManagerService extends IPackageManager.Stub mComponentResolver = injector.getComponentResolver(); mPermissionManager = injector.getPermissionManagerServiceInternal(); mSettings = injector.getSettings(); - mPermissionManagerService = (IPermissionManager) ServiceManager.getService("permissionmgr"); - mIncrementalManager = - (IncrementalManager) mContext.getSystemService(Context.INCREMENTAL_SERVICE); + mPermissionManagerService = injector.getPermissionManagerService(); + mIncrementalManager = mInjector.getIncrementalManager(); PlatformCompat platformCompat = mInjector.getCompatibility(); mPackageParserCallback = new PackageParser2.Callback() { @Override @@ -3009,7 +3055,8 @@ public class PackageManagerService extends IPackageManager.Stub ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); t.traceEnd(); - String separateProcesses = SystemProperties.get("debug.separate_processes"); + String separateProcesses = + injector.getSystemWrapper().getProperty("debug.separate_processes"); if (separateProcesses != null && separateProcesses.length() > 0) { if ("*".equals(separateProcesses)) { mDefParseFlags = PackageParser.PARSE_IGNORE_PROCESSES; @@ -3026,25 +3073,22 @@ public class PackageManagerService extends IPackageManager.Stub mSeparateProcesses = null; } - mPackageDexOptimizer = new PackageDexOptimizer(mInstaller, mInstallLock, mContext, - "*dexopt*"); - mDexManager = - new DexManager(mContext, this, mPackageDexOptimizer, mInstaller, mInstallLock); - mArtManagerService = new ArtManagerService(mContext, this, mInstaller, mInstallLock); + mPackageDexOptimizer = injector.getPackageDexOptimizer(); + mDexManager = injector.getDexManager(); + mArtManagerService = injector.getArtManagerService(); mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper()); + mViewCompiler = injector.getViewCompiler(); - mViewCompiler = new ViewCompiler(mInstallLock, mInstaller); - - getDefaultDisplayMetrics(mInjector.getDisplayManager(), mMetrics); + getDefaultDisplayMetrics(mInjector.getSystemService(DisplayManager.class), mMetrics); t.traceBegin("get system config"); - SystemConfig systemConfig = SystemConfig.getInstance(); + SystemConfig systemConfig = injector.getSystemConfig(); mAvailableFeatures = systemConfig.getAvailableFeatures(); t.traceEnd(); mProtectedPackages = new ProtectedPackages(mContext); - mApexManager = ApexManager.getInstance(); + mApexManager = injector.getApexManager(); mAppsFilter = mInjector.getAppsFilter(); final List scanPartitions = new ArrayList<>(); @@ -3122,7 +3166,7 @@ public class PackageManagerService extends IPackageManager.Stub } if (!mOnlyCore && mFirstBoot) { - requestCopyPreoptedFiles(); + requestCopyPreoptedFiles(mInjector); } String customResolverActivityName = Resources.getSystem().getString( @@ -3177,7 +3221,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - mCacheDir = preparePackageParserCache(); + mCacheDir = preparePackageParserCache(injector); // Set flag to monitor and not change apk file paths when // scanning install directories. @@ -4000,7 +4044,7 @@ public class PackageManagerService extends IPackageManager.Stub setUpInstantAppInstallerActivityLP(getInstantAppInstallerLPr()); } - private static @Nullable File preparePackageParserCache() { + private static @Nullable File preparePackageParserCache(Injector injector) { if (!FORCE_PACKAGE_PARSED_CACHE_ENABLED) { if (!DEFAULT_PACKAGE_PARSER_CACHE_ENABLED) { return null; @@ -4011,7 +4055,8 @@ public class PackageManagerService extends IPackageManager.Stub return null; } - if (SystemProperties.getBoolean("pm.boot.disable_package_cache", false)) { + if (injector.getSystemWrapper() + .getPropertyBoolean("pm.boot.disable_package_cache", false)) { Slog.i(TAG, "Disabling package parser cache due to system property."); return null; } @@ -4027,7 +4072,7 @@ public class PackageManagerService extends IPackageManager.Stub // identify cached items. In particular, changing the value of certain // feature flags should cause us to invalidate any caches. final String cacheName = FORCE_PACKAGE_PARSED_CACHE_ENABLED ? "debug" - : SystemProperties.digestOf( + : injector.getSystemWrapper().digestOfProperties( "ro.build.fingerprint", StorageManager.PROP_ISOLATED_STORAGE, StorageManager.PROP_ISOLATED_STORAGE_SNAPSHOT @@ -4093,7 +4138,7 @@ public class PackageManagerService extends IPackageManager.Stub public boolean isDeviceUpgrading() { // allow instant applications // The system property allows testing ota flow when upgraded to the same image. - return mIsUpgrade || SystemProperties.getBoolean( + return mIsUpgrade || mInjector.getSystemWrapper().getPropertyBoolean( "persist.pm.mock-upgrade", false /* default */); } @@ -4360,7 +4405,7 @@ public class PackageManagerService extends IPackageManager.Stub Slog.d(TAG, "Priming domain verifications in user " + userId); } - SystemConfig systemConfig = SystemConfig.getInstance(); + SystemConfig systemConfig = mInjector.getSystemConfig(); ArraySet packages = systemConfig.getLinkedApps(); for (String packageName : packages) { @@ -5169,11 +5214,11 @@ public class PackageManagerService extends IPackageManager.Stub * until the requested bytes are available. */ public void freeStorage(String volumeUuid, long bytes, int storageFlags) throws IOException { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); final File file = storage.findPathForUuid(volumeUuid); if (file.getUsableSpace() >= bytes) return; - if (ENABLE_FREE_CACHE_V2) { + if (mEnableFreeCacheV2) { final boolean internalVolume = Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid); final boolean aggressive = (storageFlags @@ -5252,7 +5297,7 @@ public class PackageManagerService extends IPackageManager.Stub private boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod) throws IOException { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); final File volume = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL); List packagesToDelete = null; @@ -5500,7 +5545,8 @@ public class PackageManagerService extends IPackageManager.Stub } private boolean isRecentsAccessingChildProfiles(int callingUid, int targetUserId) { - if (!mInjector.getActivityTaskManagerInternal().isCallerRecents(callingUid)) { + if (!mInjector.getLocalService(ActivityTaskManagerInternal.class) + .isCallerRecents(callingUid)) { return false; } final long token = Binder.clearCallingIdentity(); @@ -5983,7 +6029,7 @@ public class PackageManagerService extends IPackageManager.Stub res.addAll(mAvailableFeatures.values()); } final FeatureInfo fi = new FeatureInfo(); - fi.reqGlEsVersion = SystemProperties.getInt("ro.opengles.version", + fi.reqGlEsVersion = mInjector.getSystemWrapper().getPropertyInt("ro.opengles.version", FeatureInfo.GL_ES_VERSION_UNDEFINED); res.add(fi); @@ -9065,10 +9111,10 @@ public class PackageManagerService extends IPackageManager.Stub if (providerInfo != null) { // Looking for cross-user grants before enforcing the typical cross-users permissions if (userId != UserHandle.getUserId(callingUid)) { - final UriGrantsManagerInternal mUgmInternal = - LocalServices.getService(UriGrantsManagerInternal.class); + final UriGrantsManagerInternal ugmInternal = + mInjector.getLocalService(UriGrantsManagerInternal.class); checkedGrants = - mUgmInternal.checkAuthorityGrants(callingUid, providerInfo, userId, true); + ugmInternal.checkAuthorityGrants(callingUid, providerInfo, userId, true); } } if (!checkedGrants) { @@ -9678,7 +9724,7 @@ public class PackageManagerService extends IPackageManager.Stub pkgName, getSettingsVersionForPackage(parsedPackage)), Collections.singletonMap(pkgName, getSharedLibLatestVersionSetting(scanResult))), - mSettings.mKeySetManagerService); + mSettings.mKeySetManagerService, mInjector); appIdCreated = optimisticallyRegisterAppId(scanResult); commitReconciledScanResultLocked( reconcileResult.get(pkgName), mUserManager.getUserIds()); @@ -9957,7 +10003,7 @@ public class PackageManagerService extends IPackageManager.Stub pkgCompilationReason = PackageManagerService.REASON_BACKGROUND_DEXOPT; } - if (SystemProperties.getBoolean(PRECOMPILE_LAYOUTS, false)) { + if (mInjector.getSystemWrapper().getPropertyBoolean(PRECOMPILE_LAYOUTS, false)) { mArtManagerService.compileLayouts(pkg); } @@ -10933,7 +10979,7 @@ public class PackageManagerService extends IPackageManager.Stub } private int getVendorPartitionVersion() { - final String version = SystemProperties.get("ro.vndk.version"); + final String version = mInjector.getSystemWrapper().getProperty("ro.vndk.version"); if (!version.isEmpty()) { try { return Integer.parseInt(version); @@ -12957,7 +13003,7 @@ public class PackageManagerService extends IPackageManager.Stub + intent.toShortString(false, true, false, false) + " " + intent.getExtras(), here); } - mInjector.getActivityManagerInternal().broadcastIntent( + mInjector.getLocalService(ActivityManagerInternal.class).broadcastIntent( intent, finishedReceiver, requiredPermissions, finishedReceiver != null, id, broadcastAllowList == null ? null : broadcastAllowList.get(id)); @@ -14262,7 +14308,7 @@ public class PackageManagerService extends IPackageManager.Stub && mInstantAppInstallerActivity.packageName.equals( mRequiredVerifierPackage)) { try { - mInjector.getAppOpsManager() + mInjector.getSystemService(AppOpsManager.class) .checkPackage(installerUid, mRequiredVerifierPackage); if (DEBUG_VERIFY) { Slog.i(TAG, "disable verification for instant app"); @@ -14512,7 +14558,7 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { throw new SecurityException("Instant applications don't have access to this method"); } - mInjector.getAppOpsManager().checkPackage(Binder.getCallingUid(), + mInjector.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(), callerPackageName); synchronized (mLock) { PackageSetting ps = mSettings.mPackages.get(packageName); @@ -14672,7 +14718,7 @@ public class PackageManagerService extends IPackageManager.Stub */ private boolean performRollbackManagerRestore(int userId, int token, PackageInstalledInfo res, PostInstallData data) { - RollbackManagerInternal rm = LocalServices.getService(RollbackManagerInternal.class); + RollbackManagerInternal rm = mInjector.getLocalService(RollbackManagerInternal.class); final String packageName = res.pkg.getPackageName(); final int[] allUsers = mUserManager.getUserIds(); @@ -15435,7 +15481,7 @@ public class PackageManagerService extends IPackageManager.Stub integrityVerification.setPackage("android"); DeviceIdleInternal idleController = - mInjector.getLocalDeviceIdleController(); + mInjector.getLocalService(DeviceIdleInternal.class); final long idleDuration = getVerificationTimeout(); idleController.addPowerSaveTempWhitelistAppDirect(Process.myUid(), @@ -15545,7 +15591,7 @@ public class PackageManagerService extends IPackageManager.Stub receivers, verificationState); DeviceIdleInternal idleController = - mInjector.getLocalDeviceIdleController(); + mInjector.getLocalService(DeviceIdleInternal.class); final long idleDuration = getVerificationTimeout(); final BroadcastOptions options = BroadcastOptions.makeBasic(); options.setTemporaryAppWhitelistDuration(idleDuration); @@ -16544,7 +16590,7 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mLock") private static Map reconcilePackagesLocked( - final ReconcileRequest request, KeySetManagerService ksms) + final ReconcileRequest request, KeySetManagerService ksms, Injector injector) throws ReconcileFailure { final Map scannedPackages = request.scannedPackages; @@ -16695,7 +16741,8 @@ public class PackageManagerService extends IPackageManager.Stub && compareSignatures(sharedUserSignatures, parsedPackage.getSigningDetails().signatures) != PackageManager.SIGNATURE_MATCH) { - if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) { + if (injector.getSystemWrapper() + .getPropertyInt("ro.product.first_api_level", 0) <= 29) { // Mismatched signatures is an error and silently skipping system // packages will likely break the device in unforeseen ways. // However, we allow the device to boot anyway because, prior to Q, @@ -17069,7 +17116,7 @@ public class PackageManagerService extends IPackageManager.Stub try { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "reconcilePackages"); reconciledPackages = reconcilePackagesLocked( - reconcileRequest, mSettings.mKeySetManagerService); + reconcileRequest, mSettings.mKeySetManagerService, mInjector); } catch (ReconcileFailure e) { for (InstallRequest request : requests) { request.installResult.setError("Reconciliation failed...", e); @@ -17204,7 +17251,7 @@ public class PackageManagerService extends IPackageManager.Stub if (performDexopt) { // Compile the layout resources. - if (SystemProperties.getBoolean(PRECOMPILE_LAYOUTS, false)) { + if (mInjector.getSystemWrapper().getPropertyBoolean(PRECOMPILE_LAYOUTS, false)) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "compileLayouts"); mViewCompiler.compileLayouts(pkg); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); @@ -19839,7 +19886,7 @@ public class PackageManagerService extends IPackageManager.Stub } private void resetNetworkPolicies(int userId) { - mInjector.getNetworkPolicyManagerInternal().resetUserState(userId); + mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId); } /** @@ -21105,7 +21152,7 @@ public class PackageManagerService extends IPackageManager.Stub } public String getOverlayConfigSignaturePackageName() { - return ensureSystemPackageName(SystemConfig.getInstance() + return ensureSystemPackageName(mInjector.getSystemConfig() .getOverlayConfigSignaturePackage()); } @@ -21875,7 +21922,7 @@ public class PackageManagerService extends IPackageManager.Stub mPermissionManager.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, false); final PermissionPolicyInternal permissionPolicyInternal = - mInjector.getPermissionPolicyInternal(); + mInjector.getLocalService(PermissionPolicyInternal.class); permissionPolicyInternal.setOnInitializedCallback(userId -> { // The SDK updated case is already handled when we run during the ctor. synchronized (mLock) { @@ -21886,13 +21933,13 @@ public class PackageManagerService extends IPackageManager.Stub } // Watch for external volumes that come and go over time - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); storage.registerListener(mStorageListener); mInstallerService.systemReady(); mPackageDexOptimizer.systemReady(); - mInjector.getStorageManagerInternal().addExternalStoragePolicy( + mInjector.getLocalService(StorageManagerInternal.class).addExternalStoragePolicy( new StorageManagerInternal.ExternalStorageMountPolicy() { @Override public int getMountMode(int uid, String packageName) { @@ -22625,7 +22672,7 @@ public class PackageManagerService extends IPackageManager.Stub if (ArrayUtils.isEmpty(apkList)) { return; } - String sku = SystemProperties.get("ro.boot.hardware.sku"); + String sku = mInjector.getSystemWrapper().getProperty("ro.boot.hardware.sku"); if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) { return; } @@ -22921,7 +22968,7 @@ public class PackageManagerService extends IPackageManager.Stub } // Reconcile app data for all started/unlocked users - final StorageManager sm = mInjector.getStorageManager(); + final StorageManager sm = mInjector.getSystemService(StorageManager.class); UserManagerInternal umInternal = mInjector.getUserManagerInternal(); for (UserInfo user : mUserManager.getUsers(false /* includeDying */)) { final int flags; @@ -23122,7 +23169,7 @@ public class PackageManagerService extends IPackageManager.Stub * correct for all installed apps on all mounted volumes. */ void reconcileAppsData(int userId, int flags, boolean migrateAppsData) { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); for (VolumeInfo vol : storage.getWritablePrivateVolumes()) { final String volumeUuid = vol.getFsUuid(); synchronized (mInstallLock) { @@ -23257,7 +23304,7 @@ public class PackageManagerService extends IPackageManager.Stub Installer.Batch batch = new Installer.Batch(); UserManagerInternal umInternal = mInjector.getUserManagerInternal(); - StorageManagerInternal smInternal = mInjector.getStorageManagerInternal(); + StorageManagerInternal smInternal = mInjector.getLocalService(StorageManagerInternal.class); for (UserInfo user : mUserManager.getUsers(false /*excludeDying*/)) { final int flags; if (umInternal.isUserUnlockingOrUnlocked(user.id)) { @@ -23586,7 +23633,7 @@ public class PackageManagerService extends IPackageManager.Stub private void movePackageInternal(final String packageName, final String volumeUuid, final int moveId, final int callingUid, UserHandle user) throws PackageManagerException { - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); final PackageManager pm = mContext.getPackageManager(); final String currentVolumeUuid; @@ -23824,7 +23871,7 @@ public class PackageManagerService extends IPackageManager.Stub return; } - final StorageManager storage = mInjector.getStorageManager();; + final StorageManager storage = mInjector.getSystemService(StorageManager.class);; VolumeInfo volume = storage.findVolumeByUuid(pkg.getStorageUuid().toString()); int packageExternalStorageType = getPackageExternalStorageType(volume, pkg.isExternalStorage()); @@ -23864,7 +23911,7 @@ public class PackageManagerService extends IPackageManager.Stub } }; - final StorageManager storage = mInjector.getStorageManager(); + final StorageManager storage = mInjector.getSystemService(StorageManager.class); storage.setPrimaryStorageUuid(volumeUuid, callback); return realMoveId; } @@ -24044,7 +24091,7 @@ public class PackageManagerService extends IPackageManager.Stub final long token = Binder.clearCallingIdentity(); try { final DeviceStorageMonitorInternal - dsm = mInjector.getDeviceStorageMonitorInternal(); + dsm = mInjector.getLocalService(DeviceStorageMonitorInternal.class); if (dsm != null) { return dsm.isMemoryLow(); } else { @@ -25828,7 +25875,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isAutoRevokeWhitelisted(String packageName) { - int mode = mInjector.getAppOpsManager().checkOpNoThrow( + int mode = mInjector.getSystemService(AppOpsManager.class).checkOpNoThrow( AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, Binder.getCallingUid(), packageName); return mode == MODE_IGNORED; diff --git a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt index 09552082e4af2..27b07c76fb0d2 100644 --- a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt +++ b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt @@ -45,6 +45,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized +import org.mockito.Mockito import org.mockito.Mockito.any import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.anyInt @@ -341,7 +342,8 @@ class PackageManagerComponentLabelIconOverrideTest { whenever(this.userManagerService) { mockUserManagerService } whenever(this.permissionManagerServiceInternal) { mockPermissionManagerService } whenever(this.settings) { mockSettings } - whenever(this.activityTaskManagerInternal) { mockActivityTaskManager } + whenever(this.getLocalService(ActivityTaskManagerInternal::class.java)) { + mockActivityTaskManager} whenever(this.appsFilter) { mockAppsFilter } whenever(this.context) { mockContext } }