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