1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.pm; 18 19 import android.app.ActivityManagerInternal; 20 import android.app.AppOpsManagerInternal; 21 import android.app.backup.IBackupManager; 22 import android.content.ComponentName; 23 import android.content.Context; 24 import android.os.Handler; 25 import android.os.HandlerExecutor; 26 import android.os.incremental.IncrementalManager; 27 import android.util.DisplayMetrics; 28 29 import com.android.internal.annotations.VisibleForTesting; 30 import com.android.internal.pm.parsing.PackageParser2; 31 import com.android.server.SystemConfig; 32 import com.android.server.compat.PlatformCompat; 33 import com.android.server.pm.dex.ArtManagerService; 34 import com.android.server.pm.dex.DexManager; 35 import com.android.server.pm.dex.DynamicCodeLogger; 36 import com.android.server.pm.permission.LegacyPermissionManagerInternal; 37 import com.android.server.pm.permission.PermissionManagerServiceInternal; 38 import com.android.server.pm.resolution.ComponentResolver; 39 import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; 40 41 import java.util.List; 42 import java.util.concurrent.Executor; 43 44 /** 45 * Unit tests will instantiate, extend and/or mock to mock dependencies / behaviors. 46 * 47 * NOTE: All getters should return the same instance for every call. 48 */ 49 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) 50 public class PackageManagerServiceInjector { 51 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) 52 interface Producer<T> { 53 /** Produce an instance of type {@link T} */ produce(PackageManagerServiceInjector injector, PackageManagerService packageManager)54 T produce(PackageManagerServiceInjector injector, PackageManagerService packageManager); 55 } 56 57 interface ProducerWithArgument<T, R> { produce(PackageManagerServiceInjector injector, PackageManagerService packageManager, R argument)58 T produce(PackageManagerServiceInjector injector, PackageManagerService packageManager, 59 R argument); 60 } 61 62 interface ServiceProducer { produce(Class<T> c)63 <T> T produce(Class<T> c); 64 } 65 66 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) 67 static class Singleton<T> { 68 private final Producer<T> mProducer; 69 private volatile T mInstance = null; 70 Singleton(Producer<T> producer)71 Singleton(Producer<T> producer) { 72 this.mProducer = producer; 73 } 74 get(PackageManagerServiceInjector injector, PackageManagerService packageManagerService)75 T get(PackageManagerServiceInjector injector, 76 PackageManagerService packageManagerService) { 77 if (mInstance == null) { 78 mInstance = mProducer.produce(injector, packageManagerService); 79 } 80 return mInstance; 81 } 82 } 83 84 private PackageManagerService mPackageManager; 85 86 private final PackageAbiHelper mAbiHelper; 87 private final Context mContext; 88 private final PackageManagerTracedLock mLock; 89 private final Installer mInstaller; 90 private final PackageManagerTracedLock mInstallLock; 91 private final Handler mBackgroundHandler; 92 private final Executor mBackgroundExecutor; 93 private final List<ScanPartition> mSystemPartitions; 94 95 // ----- producers ----- 96 private final Singleton<ComponentResolver> 97 mComponentResolverProducer; 98 private final Singleton<PermissionManagerServiceInternal> 99 mPermissionManagerServiceProducer; 100 private final Singleton<AppOpsManagerInternal> mAppOpsManagerInternalProducer; 101 private final Singleton<UserManagerService> 102 mUserManagerProducer; 103 private final Singleton<Settings> mSettingsProducer; 104 private final Singleton<AppsFilterImpl> mAppsFilterProducer; 105 private final Singleton<PlatformCompat> 106 mPlatformCompatProducer; 107 private final Singleton<SystemConfig> mSystemConfigProducer; 108 private final Singleton<PackageDexOptimizer> 109 mPackageDexOptimizerProducer; 110 private final Singleton<DexManager> mDexManagerProducer; 111 private final Singleton<DynamicCodeLogger> mDynamicCodeLoggerProducer; 112 private final Singleton<ArtManagerService> 113 mArtManagerServiceProducer; 114 private final Singleton<ApexManager> mApexManagerProducer; 115 private final Singleton<IncrementalManager> 116 mIncrementalManagerProducer; 117 private final Singleton<DefaultAppProvider> 118 mDefaultAppProviderProducer; 119 private final Singleton<DisplayMetrics> 120 mDisplayMetricsProducer; 121 private final Producer<PackageParser2> 122 mScanningCachingPackageParserProducer; 123 private final Producer<PackageParser2> 124 mScanningPackageParserProducer; 125 private final Producer<PackageParser2> 126 mPreparingPackageParserProducer; 127 private final Singleton<PackageInstallerService> 128 mPackageInstallerServiceProducer; 129 130 private final ProducerWithArgument<InstantAppResolverConnection, ComponentName> 131 mInstantAppResolverConnectionProducer; 132 private final Singleton<LegacyPermissionManagerInternal> 133 mLegacyPermissionManagerInternalProducer; 134 private final SystemWrapper mSystemWrapper; 135 private final ServiceProducer mGetLocalServiceProducer; 136 private final ServiceProducer mGetSystemServiceProducer; 137 private final Singleton<ModuleInfoProvider> 138 mModuleInfoProviderProducer; 139 private final Singleton<DomainVerificationManagerInternal> 140 mDomainVerificationManagerInternalProducer; 141 private final Singleton<Handler> mHandlerProducer; 142 private final Singleton<IBackupManager> mIBackupManager; 143 private final Singleton<SharedLibrariesImpl> mSharedLibrariesProducer; 144 private final Singleton<CrossProfileIntentFilterHelper> mCrossProfileIntentFilterHelperProducer; 145 private final Singleton<UpdateOwnershipHelper> mUpdateOwnershipHelperProducer; 146 private final Singleton<PackageMonitorCallbackHelper> mPackageMonitorCallbackHelper; 147 PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock, Installer installer, PackageManagerTracedLock installLock, PackageAbiHelper abiHelper, Handler backgroundHandler, List<ScanPartition> systemPartitions, Producer<ComponentResolver> componentResolverProducer, Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer, Producer<AppOpsManagerInternal> appOpsManagerInternalProducer, Producer<UserManagerService> userManagerProducer, Producer<Settings> settingsProducer, Producer<AppsFilterImpl> appsFilterProducer, Producer<PlatformCompat> platformCompatProducer, Producer<SystemConfig> systemConfigProducer, Producer<PackageDexOptimizer> packageDexOptimizerProducer, Producer<DexManager> dexManagerProducer, Producer<DynamicCodeLogger> dynamicCodeLoggerProducer, Producer<ArtManagerService> artManagerServiceProducer, Producer<ApexManager> apexManagerProducer, Producer<IncrementalManager> incrementalManagerProducer, Producer<DefaultAppProvider> defaultAppProviderProducer, Producer<DisplayMetrics> displayMetricsProducer, Producer<PackageParser2> scanningCachingPackageParserProducer, Producer<PackageParser2> scanningPackageParserProducer, Producer<PackageParser2> preparingPackageParserProducer, Producer<PackageInstallerService> packageInstallerServiceProducer, ProducerWithArgument<InstantAppResolverConnection, ComponentName> instantAppResolverConnectionProducer, Producer<ModuleInfoProvider> moduleInfoProviderProducer, Producer<LegacyPermissionManagerInternal> legacyPermissionManagerInternalProducer, Producer<DomainVerificationManagerInternal> domainVerificationManagerInternalProducer, Producer<Handler> handlerProducer, SystemWrapper systemWrapper, ServiceProducer getLocalServiceProducer, ServiceProducer getSystemServiceProducer, Producer<IBackupManager> iBackupManager, Producer<SharedLibrariesImpl> sharedLibrariesProducer, Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer, Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer, Producer<PackageMonitorCallbackHelper> packageMonitorCallbackHelper)148 PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock, 149 Installer installer, PackageManagerTracedLock installLock, PackageAbiHelper abiHelper, 150 Handler backgroundHandler, 151 List<ScanPartition> systemPartitions, 152 Producer<ComponentResolver> componentResolverProducer, 153 Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer, 154 Producer<AppOpsManagerInternal> appOpsManagerInternalProducer, 155 Producer<UserManagerService> userManagerProducer, 156 Producer<Settings> settingsProducer, 157 Producer<AppsFilterImpl> appsFilterProducer, 158 Producer<PlatformCompat> platformCompatProducer, 159 Producer<SystemConfig> systemConfigProducer, 160 Producer<PackageDexOptimizer> packageDexOptimizerProducer, 161 Producer<DexManager> dexManagerProducer, 162 Producer<DynamicCodeLogger> dynamicCodeLoggerProducer, 163 Producer<ArtManagerService> artManagerServiceProducer, 164 Producer<ApexManager> apexManagerProducer, 165 Producer<IncrementalManager> incrementalManagerProducer, 166 Producer<DefaultAppProvider> defaultAppProviderProducer, 167 Producer<DisplayMetrics> displayMetricsProducer, 168 Producer<PackageParser2> scanningCachingPackageParserProducer, 169 Producer<PackageParser2> scanningPackageParserProducer, 170 Producer<PackageParser2> preparingPackageParserProducer, 171 Producer<PackageInstallerService> packageInstallerServiceProducer, 172 ProducerWithArgument<InstantAppResolverConnection, 173 ComponentName> 174 instantAppResolverConnectionProducer, 175 Producer<ModuleInfoProvider> moduleInfoProviderProducer, 176 Producer<LegacyPermissionManagerInternal> legacyPermissionManagerInternalProducer, 177 Producer<DomainVerificationManagerInternal> 178 domainVerificationManagerInternalProducer, 179 Producer<Handler> handlerProducer, 180 SystemWrapper systemWrapper, 181 ServiceProducer getLocalServiceProducer, 182 ServiceProducer getSystemServiceProducer, 183 Producer<IBackupManager> iBackupManager, 184 Producer<SharedLibrariesImpl> sharedLibrariesProducer, 185 Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer, 186 Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer, 187 Producer<PackageMonitorCallbackHelper> packageMonitorCallbackHelper) { 188 mContext = context; 189 mLock = lock; 190 mInstaller = installer; 191 mAbiHelper = abiHelper; 192 mInstallLock = installLock; 193 mBackgroundHandler = backgroundHandler; 194 mBackgroundExecutor = new HandlerExecutor(backgroundHandler); 195 mSystemPartitions = systemPartitions; 196 mComponentResolverProducer = new Singleton<>( 197 componentResolverProducer); 198 mPermissionManagerServiceProducer = new Singleton<>( 199 permissionManagerServiceProducer); 200 mAppOpsManagerInternalProducer = new Singleton<>(appOpsManagerInternalProducer); 201 mUserManagerProducer = new Singleton<>(userManagerProducer); 202 mSettingsProducer = new Singleton<>(settingsProducer); 203 mAppsFilterProducer = new Singleton<>(appsFilterProducer); 204 mPlatformCompatProducer = new Singleton<>( 205 platformCompatProducer); 206 mSystemConfigProducer = new Singleton<>(systemConfigProducer); 207 mPackageDexOptimizerProducer = new Singleton<>( 208 packageDexOptimizerProducer); 209 mDexManagerProducer = new Singleton<>(dexManagerProducer); 210 mDynamicCodeLoggerProducer = new Singleton<>(dynamicCodeLoggerProducer); 211 mArtManagerServiceProducer = new Singleton<>( 212 artManagerServiceProducer); 213 mApexManagerProducer = new Singleton<>(apexManagerProducer); 214 mIncrementalManagerProducer = new Singleton<>( 215 incrementalManagerProducer); 216 mDefaultAppProviderProducer = new Singleton<>( 217 defaultAppProviderProducer); 218 mDisplayMetricsProducer = new Singleton<>( 219 displayMetricsProducer); 220 mScanningCachingPackageParserProducer = scanningCachingPackageParserProducer; 221 mScanningPackageParserProducer = scanningPackageParserProducer; 222 mPreparingPackageParserProducer = preparingPackageParserProducer; 223 mPackageInstallerServiceProducer = new Singleton<>( 224 packageInstallerServiceProducer); 225 mInstantAppResolverConnectionProducer = instantAppResolverConnectionProducer; 226 mModuleInfoProviderProducer = new Singleton<>( 227 moduleInfoProviderProducer); 228 mLegacyPermissionManagerInternalProducer = new Singleton<>( 229 legacyPermissionManagerInternalProducer); 230 mSystemWrapper = systemWrapper; 231 mGetLocalServiceProducer = getLocalServiceProducer; 232 mGetSystemServiceProducer = getSystemServiceProducer; 233 mDomainVerificationManagerInternalProducer = 234 new Singleton<>( 235 domainVerificationManagerInternalProducer); 236 mHandlerProducer = new Singleton<>(handlerProducer); 237 mIBackupManager = new Singleton<>(iBackupManager); 238 mSharedLibrariesProducer = new Singleton<>(sharedLibrariesProducer); 239 mCrossProfileIntentFilterHelperProducer = new Singleton<>( 240 crossProfileIntentFilterHelperProducer); 241 mUpdateOwnershipHelperProducer = new Singleton<>(updateOwnershipHelperProducer); 242 mPackageMonitorCallbackHelper = new Singleton<>(packageMonitorCallbackHelper); 243 } 244 245 /** 246 * Bootstraps this injector with the {@link PackageManagerService instance to which it 247 * belongs. 248 */ bootstrap(PackageManagerService pm)249 public void bootstrap(PackageManagerService pm) { 250 this.mPackageManager = pm; 251 } 252 getUserManagerInternal()253 public UserManagerInternal getUserManagerInternal() { 254 return getUserManagerService().getInternalForInjectorOnly(); 255 } 256 getAbiHelper()257 public PackageAbiHelper getAbiHelper() { 258 return mAbiHelper; 259 } 260 getInstallLock()261 public PackageManagerTracedLock getInstallLock() { 262 return mInstallLock; 263 } 264 getSystemPartitions()265 public List<ScanPartition> getSystemPartitions() { 266 return mSystemPartitions; 267 } 268 getUserManagerService()269 public UserManagerService getUserManagerService() { 270 return mUserManagerProducer.get(this, mPackageManager); 271 } 272 getLock()273 public PackageManagerTracedLock getLock() { 274 return mLock; 275 } 276 277 /** 278 * {@link CrossProfileIntentFilterHelper} which manages {@link CrossProfileIntentFilter} 279 * @return CrossProfileIntentFilterHelper 280 */ getCrossProfileIntentFilterHelper()281 public CrossProfileIntentFilterHelper getCrossProfileIntentFilterHelper() { 282 return mCrossProfileIntentFilterHelperProducer.get(this, mPackageManager); 283 } 284 getInstaller()285 public Installer getInstaller() { 286 return mInstaller; 287 } 288 getComponentResolver()289 public ComponentResolver getComponentResolver() { 290 return mComponentResolverProducer.get(this, mPackageManager); 291 } 292 getPermissionManagerServiceInternal()293 public PermissionManagerServiceInternal getPermissionManagerServiceInternal() { 294 return mPermissionManagerServiceProducer.get(this, mPackageManager); 295 } 296 getAppOpsManagerInternal()297 public AppOpsManagerInternal getAppOpsManagerInternal() { 298 return mAppOpsManagerInternalProducer.get(this, mPackageManager); 299 } 300 getContext()301 public Context getContext() { 302 return mContext; 303 } 304 getSettings()305 public Settings getSettings() { 306 return mSettingsProducer.get(this, mPackageManager); 307 } 308 getAppsFilter()309 public AppsFilterImpl getAppsFilter() { 310 return mAppsFilterProducer.get(this, mPackageManager); 311 } 312 getCompatibility()313 public PlatformCompat getCompatibility() { 314 return mPlatformCompatProducer.get(this, mPackageManager); 315 } 316 getSystemConfig()317 public SystemConfig getSystemConfig() { 318 return mSystemConfigProducer.get(this, mPackageManager); 319 } 320 getPackageDexOptimizer()321 public PackageDexOptimizer getPackageDexOptimizer() { 322 return mPackageDexOptimizerProducer.get(this, mPackageManager); 323 } 324 getDexManager()325 public DexManager getDexManager() { 326 return mDexManagerProducer.get(this, mPackageManager); 327 } 328 getDynamicCodeLogger()329 public DynamicCodeLogger getDynamicCodeLogger() { 330 return mDynamicCodeLoggerProducer.get(this, mPackageManager); 331 } 332 getArtManagerService()333 public ArtManagerService getArtManagerService() { 334 return mArtManagerServiceProducer.get(this, mPackageManager); 335 } 336 getApexManager()337 public ApexManager getApexManager() { 338 return mApexManagerProducer.get(this, mPackageManager); 339 } 340 getBackgroundHandler()341 public Handler getBackgroundHandler() { 342 return mBackgroundHandler; 343 } 344 getBackgroundExecutor()345 public Executor getBackgroundExecutor() { 346 return mBackgroundExecutor; 347 } 348 getDisplayMetrics()349 public DisplayMetrics getDisplayMetrics() { 350 return mDisplayMetricsProducer.get(this, mPackageManager); 351 } 352 getLocalService(Class<T> c)353 public <T> T getLocalService(Class<T> c) { 354 return mGetLocalServiceProducer.produce(c); 355 } 356 getSystemService(Class<T> c)357 public <T> T getSystemService(Class<T> c) { 358 return mGetSystemServiceProducer.produce(c); 359 } 360 getSystemWrapper()361 public SystemWrapper getSystemWrapper() { 362 return mSystemWrapper; 363 } 364 getIncrementalManager()365 public IncrementalManager getIncrementalManager() { 366 return mIncrementalManagerProducer.get(this, mPackageManager); 367 } 368 getDefaultAppProvider()369 public DefaultAppProvider getDefaultAppProvider() { 370 return mDefaultAppProviderProducer.get(this, mPackageManager); 371 } 372 getScanningCachingPackageParser()373 public PackageParser2 getScanningCachingPackageParser() { 374 return mScanningCachingPackageParserProducer.produce(this, mPackageManager); 375 } 376 getScanningPackageParser()377 public PackageParser2 getScanningPackageParser() { 378 return mScanningPackageParserProducer.produce(this, mPackageManager); 379 } 380 getPreparingPackageParser()381 public PackageParser2 getPreparingPackageParser() { 382 return mPreparingPackageParserProducer.produce(this, mPackageManager); 383 } 384 getPackageInstallerService()385 public PackageInstallerService getPackageInstallerService() { 386 return mPackageInstallerServiceProducer.get(this, mPackageManager); 387 } 388 getInstantAppResolverConnection( ComponentName instantAppResolverComponent)389 public InstantAppResolverConnection getInstantAppResolverConnection( 390 ComponentName instantAppResolverComponent) { 391 return mInstantAppResolverConnectionProducer.produce( 392 this, mPackageManager, instantAppResolverComponent); 393 } 394 getModuleInfoProvider()395 public ModuleInfoProvider getModuleInfoProvider() { 396 return mModuleInfoProviderProducer.get(this, mPackageManager); 397 } 398 getLegacyPermissionManagerInternal()399 public LegacyPermissionManagerInternal getLegacyPermissionManagerInternal() { 400 return mLegacyPermissionManagerInternalProducer.get(this, mPackageManager); 401 } 402 getDomainVerificationManagerInternal()403 public DomainVerificationManagerInternal getDomainVerificationManagerInternal() { 404 return mDomainVerificationManagerInternalProducer.get(this, mPackageManager); 405 } 406 getHandler()407 public Handler getHandler() { 408 return mHandlerProducer.get(this, mPackageManager); 409 } 410 getActivityManagerInternal()411 public ActivityManagerInternal getActivityManagerInternal() { 412 return getLocalService(ActivityManagerInternal.class); 413 } 414 getIBackupManager()415 public IBackupManager getIBackupManager() { 416 return mIBackupManager.get(this, mPackageManager); 417 } 418 getSharedLibrariesImpl()419 public SharedLibrariesImpl getSharedLibrariesImpl() { 420 return mSharedLibrariesProducer.get(this, mPackageManager); 421 } 422 getUpdateOwnershipHelper()423 public UpdateOwnershipHelper getUpdateOwnershipHelper() { 424 return mUpdateOwnershipHelperProducer.get(this, mPackageManager); 425 } 426 getPackageMonitorCallbackHelper()427 public PackageMonitorCallbackHelper getPackageMonitorCallbackHelper() { 428 return mPackageMonitorCallbackHelper.get(this, mPackageManager); 429 } 430 431 432 /** Provides an abstraction to static access to system state. */ 433 public interface SystemWrapper { disablePackageCaches()434 void disablePackageCaches(); enablePackageCaches()435 void enablePackageCaches(); 436 } 437 } 438