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