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.annotation.Nullable; 20 import android.app.ActivityManagerInternal; 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.server.SystemConfig; 31 import com.android.server.compat.PlatformCompat; 32 import com.android.server.pm.dex.ArtManagerService; 33 import com.android.server.pm.dex.DexManager; 34 import com.android.server.pm.dex.DynamicCodeLogger; 35 import com.android.server.pm.dex.ViewCompiler; 36 import com.android.server.pm.parsing.PackageParser2; 37 import com.android.server.pm.permission.LegacyPermissionManagerInternal; 38 import com.android.server.pm.permission.PermissionManagerServiceInternal; 39 import com.android.server.pm.resolution.ComponentResolver; 40 import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; 41 42 import java.util.List; 43 import java.util.concurrent.Executor; 44 45 /** 46 * Unit tests will instantiate, extend and/or mock to mock dependencies / behaviors. 47 * 48 * NOTE: All getters should return the same instance for every call. 49 */ 50 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) 51 public class PackageManagerServiceInjector { 52 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) 53 interface Producer<T> { 54 /** Produce an instance of type {@link T} */ produce(PackageManagerServiceInjector injector, PackageManagerService packageManager)55 T produce(PackageManagerServiceInjector injector, PackageManagerService packageManager); 56 } 57 58 interface ProducerWithArgument<T, R> { produce(PackageManagerServiceInjector injector, PackageManagerService packageManager, R argument)59 T produce(PackageManagerServiceInjector injector, PackageManagerService packageManager, 60 R argument); 61 } 62 63 interface ServiceProducer { produce(Class<T> c)64 <T> T produce(Class<T> c); 65 } 66 67 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) 68 static class Singleton<T> { 69 private final Producer<T> mProducer; 70 private volatile T mInstance = null; 71 Singleton(Producer<T> producer)72 Singleton(Producer<T> producer) { 73 this.mProducer = producer; 74 } 75 get(PackageManagerServiceInjector injector, PackageManagerService packageManagerService)76 T get(PackageManagerServiceInjector injector, 77 PackageManagerService packageManagerService) { 78 if (mInstance == null) { 79 mInstance = mProducer.produce(injector, packageManagerService); 80 } 81 return mInstance; 82 } 83 } 84 85 private PackageManagerService mPackageManager; 86 87 private final PackageAbiHelper mAbiHelper; 88 private final Context mContext; 89 private final PackageManagerTracedLock mLock; 90 private final Installer mInstaller; 91 private final Object mInstallLock; 92 private final Handler mBackgroundHandler; 93 private final Executor mBackgroundExecutor; 94 private final List<ScanPartition> mSystemPartitions; 95 96 // ----- producers ----- 97 private final Singleton<ComponentResolver> 98 mComponentResolverProducer; 99 private final Singleton<PermissionManagerServiceInternal> 100 mPermissionManagerServiceProducer; 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<ViewCompiler> mViewCompilerProducer; 116 private final Singleton<IncrementalManager> 117 mIncrementalManagerProducer; 118 private final Singleton<DefaultAppProvider> 119 mDefaultAppProviderProducer; 120 private final Singleton<DisplayMetrics> 121 mDisplayMetricsProducer; 122 private final Producer<PackageParser2> 123 mScanningCachingPackageParserProducer; 124 private final Producer<PackageParser2> 125 mScanningPackageParserProducer; 126 private final Producer<PackageParser2> 127 mPreparingPackageParserProducer; 128 private final Singleton<PackageInstallerService> 129 mPackageInstallerServiceProducer; 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<BackgroundDexOptService> 143 mBackgroundDexOptService; // TODO(b/260124949): Remove this. 144 private final Singleton<IBackupManager> mIBackupManager; 145 private final Singleton<SharedLibrariesImpl> mSharedLibrariesProducer; 146 private final Singleton<CrossProfileIntentFilterHelper> mCrossProfileIntentFilterHelperProducer; 147 private final Singleton<UpdateOwnershipHelper> mUpdateOwnershipHelperProducer; 148 PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock, Installer installer, Object installLock, PackageAbiHelper abiHelper, Handler backgroundHandler, List<ScanPartition> systemPartitions, Producer<ComponentResolver> componentResolverProducer, Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer, 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<ViewCompiler> viewCompilerProducer, 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<BackgroundDexOptService> backgroundDexOptService, Producer<IBackupManager> iBackupManager, Producer<SharedLibrariesImpl> sharedLibrariesProducer, Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer, Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer)149 PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock, 150 Installer installer, Object installLock, PackageAbiHelper abiHelper, 151 Handler backgroundHandler, 152 List<ScanPartition> systemPartitions, 153 Producer<ComponentResolver> componentResolverProducer, 154 Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer, 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<ViewCompiler> viewCompilerProducer, 166 Producer<IncrementalManager> incrementalManagerProducer, 167 Producer<DefaultAppProvider> defaultAppProviderProducer, 168 Producer<DisplayMetrics> displayMetricsProducer, 169 Producer<PackageParser2> scanningCachingPackageParserProducer, 170 Producer<PackageParser2> scanningPackageParserProducer, 171 Producer<PackageParser2> preparingPackageParserProducer, 172 Producer<PackageInstallerService> packageInstallerServiceProducer, 173 ProducerWithArgument<InstantAppResolverConnection, 174 ComponentName> 175 instantAppResolverConnectionProducer, 176 Producer<ModuleInfoProvider> moduleInfoProviderProducer, 177 Producer<LegacyPermissionManagerInternal> legacyPermissionManagerInternalProducer, 178 Producer<DomainVerificationManagerInternal> 179 domainVerificationManagerInternalProducer, 180 Producer<Handler> handlerProducer, 181 SystemWrapper systemWrapper, 182 ServiceProducer getLocalServiceProducer, 183 ServiceProducer getSystemServiceProducer, 184 Producer<BackgroundDexOptService> backgroundDexOptService, 185 Producer<IBackupManager> iBackupManager, 186 Producer<SharedLibrariesImpl> sharedLibrariesProducer, 187 Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer, 188 Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer) { 189 mContext = context; 190 mLock = lock; 191 mInstaller = installer; 192 mAbiHelper = abiHelper; 193 mInstallLock = installLock; 194 mBackgroundHandler = backgroundHandler; 195 mBackgroundExecutor = new HandlerExecutor(backgroundHandler); 196 mSystemPartitions = systemPartitions; 197 mComponentResolverProducer = new Singleton<>( 198 componentResolverProducer); 199 mPermissionManagerServiceProducer = new Singleton<>( 200 permissionManagerServiceProducer); 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 mViewCompilerProducer = new Singleton<>(viewCompilerProducer); 215 mIncrementalManagerProducer = new Singleton<>( 216 incrementalManagerProducer); 217 mDefaultAppProviderProducer = new Singleton<>( 218 defaultAppProviderProducer); 219 mDisplayMetricsProducer = new Singleton<>( 220 displayMetricsProducer); 221 mScanningCachingPackageParserProducer = scanningCachingPackageParserProducer; 222 mScanningPackageParserProducer = scanningPackageParserProducer; 223 mPreparingPackageParserProducer = preparingPackageParserProducer; 224 mPackageInstallerServiceProducer = new Singleton<>( 225 packageInstallerServiceProducer); 226 mInstantAppResolverConnectionProducer = instantAppResolverConnectionProducer; 227 mModuleInfoProviderProducer = new Singleton<>( 228 moduleInfoProviderProducer); 229 mLegacyPermissionManagerInternalProducer = new Singleton<>( 230 legacyPermissionManagerInternalProducer); 231 mSystemWrapper = systemWrapper; 232 mGetLocalServiceProducer = getLocalServiceProducer; 233 mGetSystemServiceProducer = getSystemServiceProducer; 234 mDomainVerificationManagerInternalProducer = 235 new Singleton<>( 236 domainVerificationManagerInternalProducer); 237 mHandlerProducer = new Singleton<>(handlerProducer); 238 mBackgroundDexOptService = new Singleton<>(backgroundDexOptService); 239 mIBackupManager = new Singleton<>(iBackupManager); 240 mSharedLibrariesProducer = new Singleton<>(sharedLibrariesProducer); 241 mCrossProfileIntentFilterHelperProducer = new Singleton<>( 242 crossProfileIntentFilterHelperProducer); 243 mUpdateOwnershipHelperProducer = new Singleton<>(updateOwnershipHelperProducer); 244 } 245 246 /** 247 * Bootstraps this injector with the {@link PackageManagerService instance to which it 248 * belongs. 249 */ bootstrap(PackageManagerService pm)250 public void bootstrap(PackageManagerService pm) { 251 this.mPackageManager = pm; 252 } 253 getUserManagerInternal()254 public UserManagerInternal getUserManagerInternal() { 255 return getUserManagerService().getInternalForInjectorOnly(); 256 } 257 getAbiHelper()258 public PackageAbiHelper getAbiHelper() { 259 return mAbiHelper; 260 } 261 getInstallLock()262 public Object getInstallLock() { 263 return mInstallLock; 264 } 265 getSystemPartitions()266 public List<ScanPartition> getSystemPartitions() { 267 return mSystemPartitions; 268 } 269 getUserManagerService()270 public UserManagerService getUserManagerService() { 271 return mUserManagerProducer.get(this, mPackageManager); 272 } 273 getLock()274 public PackageManagerTracedLock getLock() { 275 return mLock; 276 } 277 278 /** 279 * {@link CrossProfileIntentFilterHelper} which manages {@link CrossProfileIntentFilter} 280 * @return CrossProfileIntentFilterHelper 281 */ getCrossProfileIntentFilterHelper()282 public CrossProfileIntentFilterHelper getCrossProfileIntentFilterHelper() { 283 return mCrossProfileIntentFilterHelperProducer.get(this, mPackageManager); 284 } 285 getInstaller()286 public Installer getInstaller() { 287 return mInstaller; 288 } 289 getComponentResolver()290 public ComponentResolver getComponentResolver() { 291 return mComponentResolverProducer.get(this, mPackageManager); 292 } 293 getPermissionManagerServiceInternal()294 public PermissionManagerServiceInternal getPermissionManagerServiceInternal() { 295 return mPermissionManagerServiceProducer.get(this, mPackageManager); 296 } 297 getContext()298 public Context getContext() { 299 return mContext; 300 } 301 getSettings()302 public Settings getSettings() { 303 return mSettingsProducer.get(this, mPackageManager); 304 } 305 getAppsFilter()306 public AppsFilterImpl getAppsFilter() { 307 return mAppsFilterProducer.get(this, mPackageManager); 308 } 309 getCompatibility()310 public PlatformCompat getCompatibility() { 311 return mPlatformCompatProducer.get(this, mPackageManager); 312 } 313 getSystemConfig()314 public SystemConfig getSystemConfig() { 315 return mSystemConfigProducer.get(this, mPackageManager); 316 } 317 getPackageDexOptimizer()318 public PackageDexOptimizer getPackageDexOptimizer() { 319 return mPackageDexOptimizerProducer.get(this, mPackageManager); 320 } 321 getDexManager()322 public DexManager getDexManager() { 323 return mDexManagerProducer.get(this, mPackageManager); 324 } 325 getDynamicCodeLogger()326 public DynamicCodeLogger getDynamicCodeLogger() { 327 return mDynamicCodeLoggerProducer.get(this, mPackageManager); 328 } 329 getArtManagerService()330 public ArtManagerService getArtManagerService() { 331 return mArtManagerServiceProducer.get(this, mPackageManager); 332 } 333 getApexManager()334 public ApexManager getApexManager() { 335 return mApexManagerProducer.get(this, mPackageManager); 336 } 337 getViewCompiler()338 public ViewCompiler getViewCompiler() { 339 return mViewCompilerProducer.get(this, mPackageManager); 340 } 341 getBackgroundHandler()342 public Handler getBackgroundHandler() { 343 return mBackgroundHandler; 344 } 345 getBackgroundExecutor()346 public Executor getBackgroundExecutor() { 347 return mBackgroundExecutor; 348 } 349 getDisplayMetrics()350 public DisplayMetrics getDisplayMetrics() { 351 return mDisplayMetricsProducer.get(this, mPackageManager); 352 } 353 getLocalService(Class<T> c)354 public <T> T getLocalService(Class<T> c) { 355 return mGetLocalServiceProducer.produce(c); 356 } 357 getSystemService(Class<T> c)358 public <T> T getSystemService(Class<T> c) { 359 return mGetSystemServiceProducer.produce(c); 360 } 361 getSystemWrapper()362 public SystemWrapper getSystemWrapper() { 363 return mSystemWrapper; 364 } 365 getIncrementalManager()366 public IncrementalManager getIncrementalManager() { 367 return mIncrementalManagerProducer.get(this, mPackageManager); 368 } 369 getDefaultAppProvider()370 public DefaultAppProvider getDefaultAppProvider() { 371 return mDefaultAppProviderProducer.get(this, mPackageManager); 372 } 373 getScanningCachingPackageParser()374 public PackageParser2 getScanningCachingPackageParser() { 375 return mScanningCachingPackageParserProducer.produce(this, mPackageManager); 376 } 377 getScanningPackageParser()378 public PackageParser2 getScanningPackageParser() { 379 return mScanningPackageParserProducer.produce(this, mPackageManager); 380 } 381 getPreparingPackageParser()382 public PackageParser2 getPreparingPackageParser() { 383 return mPreparingPackageParserProducer.produce(this, mPackageManager); 384 } 385 getPackageInstallerService()386 public PackageInstallerService getPackageInstallerService() { 387 return mPackageInstallerServiceProducer.get(this, mPackageManager); 388 } 389 getInstantAppResolverConnection( ComponentName instantAppResolverComponent)390 public InstantAppResolverConnection getInstantAppResolverConnection( 391 ComponentName instantAppResolverComponent) { 392 return mInstantAppResolverConnectionProducer.produce( 393 this, mPackageManager, instantAppResolverComponent); 394 } 395 getModuleInfoProvider()396 public ModuleInfoProvider getModuleInfoProvider() { 397 return mModuleInfoProviderProducer.get(this, mPackageManager); 398 } 399 getLegacyPermissionManagerInternal()400 public LegacyPermissionManagerInternal getLegacyPermissionManagerInternal() { 401 return mLegacyPermissionManagerInternalProducer.get(this, mPackageManager); 402 } 403 getDomainVerificationManagerInternal()404 public DomainVerificationManagerInternal getDomainVerificationManagerInternal() { 405 return mDomainVerificationManagerInternalProducer.get(this, mPackageManager); 406 } 407 getHandler()408 public Handler getHandler() { 409 return mHandlerProducer.get(this, mPackageManager); 410 } 411 getActivityManagerInternal()412 public ActivityManagerInternal getActivityManagerInternal() { 413 return getLocalService(ActivityManagerInternal.class); 414 } 415 416 @Nullable getBackgroundDexOptService()417 public BackgroundDexOptService getBackgroundDexOptService() { 418 return mBackgroundDexOptService.get(this, mPackageManager); 419 } 420 getIBackupManager()421 public IBackupManager getIBackupManager() { 422 return mIBackupManager.get(this, mPackageManager); 423 } 424 getSharedLibrariesImpl()425 public SharedLibrariesImpl getSharedLibrariesImpl() { 426 return mSharedLibrariesProducer.get(this, mPackageManager); 427 } 428 getUpdateOwnershipHelper()429 public UpdateOwnershipHelper getUpdateOwnershipHelper() { 430 return mUpdateOwnershipHelperProducer.get(this, mPackageManager); 431 } 432 433 434 /** Provides an abstraction to static access to system state. */ 435 public interface SystemWrapper { disablePackageCaches()436 void disablePackageCaches(); enablePackageCaches()437 void enablePackageCaches(); 438 } 439 } 440