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